东尧爱分享
这是东尧每天一篇文章的第35天
东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福。
上次的urllib库教程一中我们已经学习了urllib库的一些基本操作,那么今天东尧就用糗事百科网站的抓取实例来教大家如何抓取一个网页的数据。
1
创建通用网页下载函数
在编写糗百的抓取代码之前,我们先写一个通用的网页下载函数,这样,无论以后我们需要抓取哪个网站的内容,都可以直接使用这个函数来下载网页,将网页内容传入到python变量中,方便后续重复使用。
函数用到的参数:
url
要下载的url
timeout
请求超时时间,单位/秒。可能某些网站的反应速度很慢,所以需要一个连接超时变量来处理。
user_agent
用户代理信息,可以自定义是爬虫还是模拟用户
proxy
ip代理(http代理),访问某些国外网站的时候需要用到。必须是双元素元组或列表(‘ip:端口’,‘http/https’)
num_retries
失败重试次数
return
HTML网页源码
2
糗事百科抓取实例
要下载的网页首地址:https://www.qiushibaike.com/text/
需求分析:
1.需要提取出发段子的作者,段子的内容,好笑数量以及评论数
2.将每条结果保存在字典中,然后最终保存为json文件
我们可以看到糗事百科的“文字”栏目是按照下图这样的小块来分布的,那么我们可以通过对这种小块的抓取将内容归类,一个块为一类,一类中包含了“作者、糗事内容、好笑数量、评论数量”。
为什么要这样分块抓取内容,而不是一次性的抓取完作者、一次性抓取完糗事内容数据呢?这是因为有可能由于某些原因使得一些作者或内容无法抓取到,那么在最终的抓取结果中,由于中间缺少了部分内容,就无法做到按“作者、糗事内容、好笑数量、评论数量”这样的关系一一对应,整个抓取结果就是混乱的。所以要按分区块的方式来抓取,保证内容的一致性。
接下来是查看源代码中分块的代码。
右键单击“审查元素”可以看到在源代码中,一个小块是以“
”开头,以“
”结尾的。那么我们在正则匹配时就可以先将页面上的小块匹配出来,然后通过for循环再从每个小块中匹配各自的元素内容。