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

Python网络爬虫

1.知识要求

  • 掌握python基础语法
  • 熟悉urllib模块知识
  • 熟悉get方法
  • 会使用浏览器伪装技术

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

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

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

(1)首先,我们按照之前爬取csnd首页的信息的方式,去爬取糗事百科段子相关内容,你会发现运行后程序报错,看错误原因:Remote end closed connection without response远程关闭了链接,导致无法响应。说明,该网站有反爬技术,对方能够识别我们是爬虫,而不是浏览器访问,所以我们要将爬虫伪装成浏览器。
网络爬虫---爬取糗事百科段子实战_第1张图片
(2)要想伪装成浏览器,首先要获取浏览器用户代理
网络爬虫---爬取糗事百科段子实战_第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)获取正则表达式,观察下面红色方框的内容,发现都是呈

.*?(.*?)的形式,所以我们可以构造正则表达式pat="
.*?(.*?)",注意.不能匹配换行符,所以,我们要用re.S让其能匹配换行符。
网络爬虫---爬取糗事百科段子实战_第3张图片
网络爬虫---爬取糗事百科段子实战_第4张图片

#设置正则表达式
    pat = '
.*?(.*?)' #进行信息提取,因为有换行符,所有要用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 = '
.*?(.*?)' #进行信息提取,因为有换行符,所有要用re.S按.能匹配换行符 this_data = re.compile(pat, re.S).findall(data) for d in this_data: print(d.strip()) #字符串的前面和后面有的有换行符,可以用strip()方法去掉字符串首位处的换行符和空格 print('--------------------------------------')

(7)运行程序,能够看到网上前20页的段子全被爬下来了,爬取成功!
网络爬虫---爬取糗事百科段子实战_第5张图片
网络爬虫---爬取糗事百科段子实战_第6张图片
网络爬虫---爬取糗事百科段子实战_第7张图片
(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 = '
.*?(.*?)' #进行信息提取,因为有换行符,所有要用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)觉得可以,点个赞再走!

你可能感兴趣的:(网络爬虫)