俗话说,上班时间是公司的,下班了时间才是自己的。搞点事情,写个爬虫程序,每天定期爬取点段子,看着自己爬的段子,也是一种乐趣。

 Python爬虫实战三之爬取嗅事百科段子

 

二、Python爬取嗅事百科段子

1.确定爬取的目标网页

首先我们要明确目标,本次爬取的是糗事百科文字模块的段子。

(糗事百科)->分析目标(策略:url格式(范围)、数据格式、网页编码)->编写代码->执行爬虫

 

2.分析爬取的目标网页

 段子链接:https://www.qiushibaike.com/text/

访问链接可以看到如下的页面,一个红框代表一个段子内容,也就是对应html源码的一个div浮层。页面布局采用分页的方式,每页显示25条,总共13页。点击页码或者"下一页"会跳转到相应页面。Chrome浏览器F12可以看到,每页内容都是同步加载的,而且请求次数较多,显然不能采用直接模拟请求的方式,这里采用的爬取策略是Python Selenium,每获取和解析完一页的段子,点击 "下一页" 跳转到对应页码页继续解析,直至解析并记录所有的段子。

Python爬虫实战三之爬取嗅事百科段子

 

Chrome F12查看Network模块,看到请求密密麻麻的,下载各种document、script js脚本、stylesheet样式,图片jpeg、png等。

Python爬虫实战三之爬取嗅事百科段子

 

有个情况需要注意,当一个段子内容字数太多,会被截断,出现省略号“...”和"查看全文"的跳转链接,为了获取完整的段子信息,需要增加多一个步骤,请求段子的链接,再截取里面的全部内容。

 Python爬虫实战三之爬取嗅事百科段子

Python爬虫实战三之爬取嗅事百科段子

 

 3.编写代码

下载网页内容,我使用python requests第三方库,发起GET请求方式。 

 1 def do_get_request(self, url, headers=None, timeout=3, is_return_text=True, num_retries=2):
 2     if url is None:
 3         return None
 4     print('Downloading:', url)
 5     if headers is None:  # 默认请求头
 6         headers = {
 7             'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
 8     response = None
 9     try:
10         response = requests.get(url, headers=headers, timeout=timeout)
11 
12         response.raise_for_status()  # a 4XX client error or 5XX server error response,raise requests.exceptions.HTTPError
13         if response.status_code == requests.codes.ok:
14             if is_return_text:
15                 html = response.text
16             else:
17                 html = response.json()
18         else:
19             html = None
20     except requests.Timeout as err:
21         print('Downloading Timeout:', err.args)
22         html = None
23     except requests.HTTPError as err:
24         print('Downloading HTTP Error,msg:{0}'.format(err.args))
25         html = None
26         if num_retries > 0:
27             if 500 <= response.status_code < 600:
28                 return self.do_get_request(url, headers=headers, num_retries=num_retries - 1)  # 服务器错误,导致请求失败,默认重试2次
29     except requests.ConnectionError as err:
30         print('Downloading Connection Error:', err.args)
31         html = None
32 
33     return html

View Code