网络爬虫—爬取糗事百科段子实战

导读:本篇文章讲解 网络爬虫—爬取糗事百科段子实战,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Python网络爬虫

1.知识要求

如果您对相关知识遗忘了,可以点上面的相关知识链接,熟悉一下。

2.爬取糗事百科段子实战

目的:爬取前糗事百科前20页的所有段子

(1)首先,我们按照之前爬取csnd首页的信息的方式,去爬取糗事百科段子相关内容,你会发现运行后程序报错,看错误原因:Remote end closed connection without response远程关闭了链接,导致无法响应。说明,该网站有反爬技术,对方能够识别我们是爬虫,而不是浏览器访问,所以我们要将爬虫伪装成浏览器。
在这里插入图片描述
(2)要想伪装成浏览器,首先要获取浏览器用户代理
在这里插入图片描述
(3)构造报头,并伪装

#采用浏览器伪装技术,先设置报头
headers = ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400')
#设置开启工具
opener = urllib.request.build_opener()
#添加报头,将爬虫伪装成浏览器成功
opener.addheaders = [headers]

(4)采用get方法来实现网页自动换页,从而爬取前糗事百科前20页的所有段子。通过换页观察不同页的网址,我们发现每页网址都是:https://www.qiushibaike.com/text/page/页码/的形式,通过这我们就能实现自动换页。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

#爬取前20网页信息
for i in range(0, 20):
    #构造每一页的网址
    this_url = "https://www.qiushibaike.com/text/page/" + str(i+1) + "/"
    #读取每一页的数据
    data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')

(5)获取正则表达式,观察下面红色方框的内容,发现都是呈<div class="content">.*?<span>(.*?)</span>的形式,所以我们可以构造正则表达式pat="<div class="content">.*?<span>(.*?)</span>",注意.不能匹配换行符,所以,我们要用re.S让其能匹配换行符。
在这里插入图片描述
在这里插入图片描述

#设置正则表达式
    pat = '<div class="content">.*?<span>(.*?)</span>'
    #进行信息提取,因为有换行符,所有要用re.S按.能匹配换行符
    this_data = re.compile(pat, re.S).findall(data)

(6)最终代码入下:

#网络爬虫之爬取糗事百科段子实战
import re
import urllib.request
#糗事百科官网网址
url = "https://www.qiushibaike.com/text/"
#采用浏览器伪装技术,先设置报头
headers = ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400')
#设置开启工具
opener = urllib.request.build_opener()
#添加报头,将爬虫伪装成浏览器成功
opener.addheaders = [headers]
#将opener安装为全局
urllib.request.install_opener(opener)
#爬取前20网页信息
for i in range(0, 20):
    #构造每一页的网址
    this_url = "https://www.qiushibaike.com/text/page/" + str(i+1) + "/"
    #读取每一页的数据
    data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')
    #设置正则表达式
    pat = '<div class="content">.*?<span>(.*?)</span>'
    #进行信息提取,因为有换行符,所有要用re.S按.能匹配换行符
    this_data = re.compile(pat, re.S).findall(data)
    for d in this_data:
        print(d.strip())  #字符串的前面和后面有的有换行符,可以用strip()方法去掉字符串首位处的换行符和空格
        print('--------------------------------------')

(7)运行程序,能够看到网上前20页的段子全被爬下来了,爬取成功!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(8)如果要使程序变得健壮,还可以添加异常处理。代码如下:

#网络爬虫之爬取糗事百科段子实战
import re
import urllib.request
import urllib.error
#糗事百科官网网址
url = "https://www.qiushibaike.com/text/"
#采用浏览器伪装技术,先设置报头
headers = ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5558.400 QQBrowser/10.1.1695.400')
#设置开启工具
opener = urllib.request.build_opener()
#添加报头,将爬虫伪装成浏览器成功
opener.addheaders = [headers]
#将opener安装为全局
urllib.request.install_opener(opener)
#爬取前20网页信息
for i in range(0, 20):
    #异常处理
    try:
        #构造每一页的网址
        this_url = "https://www.qiushibaike.com/text/page/" + str(i+1) + "/"
        #读取每一页的数据
        data = urllib.request.urlopen(url).read().decode('utf-8', 'ignore')
        #设置正则表达式
        pat = '<div class="content">.*?<span>(.*?)</span>'
        #进行信息提取,因为有换行符,所有要用re.S按.能匹配换行符
        this_data = re.compile(pat, re.S).findall(data)
        for d in this_data:
            print(d.strip())  #字符串的前面和后面有的有换行符,可以用strip()方法去掉字符串首位处的换行符和空格
            print('--------------------------------------')
    except urllib.error.HTTPError as e:
        if hasattr(e, 'code'):
            print(e.code)
        if hasattr(e, 'reason'):
            print(e.reason)

(9)觉得可以,点个赞再走!

这里是引用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84811.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!