美文网首页python自学
【Python爬虫案例】requests爬取冷笑话合集

【Python爬虫案例】requests爬取冷笑话合集

作者: 佳瑞Jarrett | 来源:发表于2020-03-20 22:43 被阅读0次

1. 开发环境

  • Windows 10 企业版
  • Pycharm 2019.01 EAP Community Edition
  • Python 3.7

2. 前言

在学习python爬虫的时候,很多课程都会提到去爬取一些常规的网站进行练习。最近正好看到有个微信公众号的文章分享,我也试着做一期偏向教程的案例分享。
首先,python爬取网站的过程实际上是模拟了人浏览网页的过程,通过自动化的方法来完成操作。
然后,最轻松的爬虫即是把网页上的文字直接保存下来,不需要做过多的分析和查找过程。
因此,我们就选择爬取冷笑话的网站,通过爬取这样一个“简单”的网站理解爬虫的知识。

3.安装的库

requests python自带的库。
re python自带的库
BeautfulSoup 网页解析的库。

4.过程解析

4.1网站解析

首先进入笑话大全的网站:origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/'

笑话大全
选择笑话大全主网站上的“冷笑话”进入如下页面中。 冷笑话网页

从图中可以看出,每一个笑话不是完整的。必须点击“查看原文”才能浏览。因此这就确定了我们爬取冷笑话的思路。
在冷笑话页面找到所有的“查看全文”的超链接;再根据超链接进入详细页面中,下载每一个冷笑话。

4.2初步尝试解析网页

import requests
origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/' #冷笑话
response = requests.get(origin_url)
print(response.text)

为了防止被反爬虫,模拟浏览器访问网站,因此要将requests的参数中加入header。这段文字可以反复使用,也可以根据实际情况进行调整。

关于如何引入header可以看参考文献

import requests
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
response = requests.get(origin_url, headers=head)  # 从链接中获取到回复信息
print(response.text)

4.3解析一级网站信息

再冷笑话网页右键查看源代码可以分析网页。在箭头所指的位置找到查看全文。

查看源代码
从源代码中可以看出<a target="_blank" href="/detail60/59364.html" class="all-read">查看全文&raquo;</a>是需要提取的信息。

通过 上文中已经获得网页返回的信息response
那么接下来通过BeautifulSoup对网页返回的信息进行解析。

from bs4 import BeautifulSoup
bsobj = BeautifulSoup(response.text, 'lxml')    #利用bs解析

在获得bsobj的基础上,bsobj.find_all('a')可以找到所有的<a>标签。但是我们需要进一步限定标签的范围,仅需要有“查找全文”关键字的标签即可,因此需要添加关键字查找。利用正则表达式查找字符串:bsobj.find_all('a',string = re.compile('查看全文'))

link = a_tag.get('href')获取到所有<a>标签中的链接地址,并存放到一个列表中。

import re
link_list = []
for a_tag in bsobj.find_all('a', string = re.compile('查看全文')):
    link = a_tag.get('href')
    if link:
        link_list.append(link)

4.4解析二级网站信息

由于对二级网站进行访问类似于以上所作的工作,因此将网页访问的部分改写为get_url_msg(origin_url)的函数

def get_url_msg(origin_url):
    head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)\
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'}
    response = requests.get(origin_url, headers=head)  # 从链接中获取到回复信息
    bsobj = BeautifulSoup(response.text, 'lxml')    #利用bs解析
    return bsobj

接下来首先将二级网站的链接进行重新编写,将主域名加上网站网址就获得了要爬取的网站信息。

该部分最困难的地方是找到所有的冷笑话文字并提取出来。
首先按照上面相同的办法定位文字部分:bsobj.find_all(name="div", attrs={"class" :"article-text"}),这是根据网页的源代码进行分析出来的,找到html的类为"article-text"

然后需要将获得网页信息进行清洗,去除掉其中的所有空格,回车符号及<class> <p>等标签。使用article_text.get_text()获取到网页信息的所有文字。

再利用字符串操作,尽可能减少其中的其他符号。

origin_url = origin_url.split('/')

words_list = []
for link in link_list:
    article_link = origin_url[0]+"//"+origin_url[2]+link
    bsobj = get_url_msg(article_link)

    for article_text in bsobj.find_all(name="div", attrs={"class" :"article-text"}):
        article = article_text.get_text()
        article = article.replace(" ","")
        #article = article.split()
        re.sub("[\n]+","",article)
        #print(article)
        words_list.append(article)

4.5写入冷笑话信息

写入txt文档比较简单,这里要注意的是编码。
file.write(msg.encode("utf-8")要采用UTF-8编码。

# 创建一个txt文件,文件名为mytxtfile,并向文件写入msg
def text_create(name, msg):
    desktop_path = ""  # 新创建的txt文件的存放路径
    full_path = desktop_path + name + '.txt'  # 也可以创建一个.doc的word文档
    file = open(full_path, "wb+")
    file.write(msg.encode("utf-8"))  # msg也就是下面的msg!
    file.close()


text_create('mytxtfile', "\n".join(words_list))
# 调用函数创建一个名为mytxtfile的.txt文件,并向其写入msg

5.源代码分享

# encoding: utf-8
"""
@version: 1.0
@author: Jarrett
@file: run.py
@time: 2020/3/18 22:12
"""

import requests
from bs4 import BeautifulSoup
import re

origin_url = 'http://xiaohua.zol.com.cn/lengxiaohua/' #冷笑话

def get_url_msg(origin_url):
    head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
 Chrome/77.0.3865.120 Safari/537.36'}
    response = requests.get(origin_url, headers=head)  # 从链接中获取到回复信息
    bsobj = BeautifulSoup(response.text, 'lxml')    #利用bs解析
    return bsobj

bsobj = get_url_msg(origin_url)
link_list = []
for a_tag in bsobj.find_all('a', string = re.compile('查看全文')):
    link = a_tag.get('href')
    if link:
        link_list.append(link)

origin_url = origin_url.split('/')

words_list = []
for link in link_list:
    article_link = origin_url[0]+"//"+origin_url[2]+link
    bsobj = get_url_msg(article_link)

    for article_text in bsobj.find_all(name="div", attrs={"class" :"article-text"}):
        article = article_text.get_text()
        article = article.replace(" ","")
        #article = article.split()
        re.sub("[\n]+","",article)
        #print(article)
        words_list.append(article)


# 创建一个txt文件,文件名为mytxtfile,并向文件写入msg
def text_create(name, msg):
    desktop_path = ""  # 新创建的txt文件的存放路径
    full_path = desktop_path + name + '.txt'  # 也可以创建一个.doc的word文档
    file = open(full_path, "wb+")
    file.write(msg.encode("utf-8"))  # msg也就是下面的msg!
    file.close()


text_create('mytxtfile', "\n".join(words_list))
# 调用函数创建一个名为mytxtfile的.txt文件,并向其写入msg

6.总结

1.利用Requests和BeautifulSoup可以轻松完成网页信息的爬取工作。
2.可以尝试爬取笑话大全网站上的其他信息,如图片和视频等。
3.接下来将把爬取下来的文字进行分词操作,做词云展示。
4.合作咨询事宜请私信。【微店】【樱桃智库】提供爬虫服务。

相关文章

网友评论

    本文标题:【Python爬虫案例】requests爬取冷笑话合集

    本文链接:https://www.haomeiwen.com/subject/ixgsyhtx.html