目录
糗事百科段子爬取
感谢阅读最爱小鱼果的博客。
本篇博客在于记录本人学习爬虫过程中的一些项目案例,如有错误还请大家批评指正!
爬虫功能介绍
可获取糗事百科段子里当前所有用户ID,段子内容,点赞数。
注:因段子内容为随机,每次打开都会刷新内容,故每个人所看到的段子内容不一定相同
所需软件
1、浏览器(最好为Google Chrome)
2、Python IDE(最好为PyCharm)
Python3.0+
网页解析
首先打开糗事百科找到并点击段子,鼠标右键点击 检查,找到并点击Elements
如图所示:
找到所需信息所在代码段
1、找到用户ID所在代码段,如图所示:
2、找到段子内容所在代码段,如图所示:
3、找到点赞数所在代码段,如图所示:
获取信息
本篇博客使用正则表达式来提取信息
提取用户ID:
r'<div class="author clearfix">.*?<h2>\n(.*?)\n</h2>
提取段子:
r'<div class="content">.*?<span>(.*?)</span>
提取点赞数:
r'<i class="number">(.*?)</i>'
这里就不多做解释了,看不懂的建议百度正则表达式。
编程思路分析
使用正则表达式可以一次性获取全部用户ID,段子,点赞数
但是是分开的,也就是说用户ID在一个列表里,段子内容在一个列表里,点赞数在一个列表里。
所以我们需要进行合并。
获取当前所有段子
获取所有段子,需要遍历每一页里的信息,分析网页url:
第一页:
https://www.qiushibaike.com/text/page/1/
第二页
https://www.qiushibaike.com/text/page/2/
第三页
https://www.qiushibaike.com/text/page/3/
…
所以我们可以这样遍历:
for x in range(1,14):
url = 'https://www.qiushibaike.com/text/page/%s/' % x
这用就可以生成所有url.
对提取的内容进行优化
不难发现爬取的段子内容含有许多转义字符,如图所示:
所以进行删除,既替换成空:
for du in duans:
nr = re.sub(r'\n|<.*?>|\xa0| ', "", du)
ners.append(nr)
综上便获取到了我们所需要的信息。
数据合并
使用zip()函数进行数据合并:
for val in zip(user, ners, xiao):
user, nrs, xiao = val
poom = {
'用户': user,
'内容': nrs,
'点赞': int(xiao)
}
shi.append(poom)
至此我们就获取到了当前所有信息。
查看点赞数最多的内容
突发奇想,想要看看点赞数最多的段子是啥内容,因此加上如下代码:
shi.sort(key=lambda data: data["点赞"])
print(shi[-1])
如图所示:
图片不是很清楚放上文字:
用户: 上天揽九月、
内容: 闺蜜约我去看电影,到了电影院找到位子坐好。闺蜜在背包里掏出一大桶爆米花和一瓶可乐,递给我说:“电影院的零食贵死了,这是我在超市买的。”我怀着无尽的感动,一大口爆米花一口可乐,美滋滋看着电影,一桶爆米花快见底时,我问闺蜜:“你怎么不吃啊,都快被我吃完光了!”闺蜜摇摇头说:“你吃吧,我怕胖!”我…草率了~
点赞: 3164
总结
首先分析源代码,利用正则表达式获取所需信息,再对信息进行处理, 然后将所获取的信息进行合并。最后根据点赞数进行排序找到点赞数最多的段子并打印出来。
最后
感谢阅读最爱小鱼果的博客。
本篇博客在于记录本人学习爬虫过程中的一些项目案例,如有错误还请大家批评指正!
附代码
import requests
import re
xiaos = []
shi = []
def parse_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
text = response.text
user = re.findall(r'<div class="author clearfix">.*?<h2>\n(.*?)\n</h2>', text, re.S)
duans = re.findall(r'<div class="content">.*?<span>(.*?)</span>', text, re.S)
xiao = re.findall(r'<i class="number">(.*?)</i>', text, re.S)
ners= []
for du in duans:
nr = re.sub(r'\n|<.*?>|\xa0| ', "", du)
ners.append(nr)
for val in zip(user, ners, xiao):
user, nrs, xiao = val
poom = {
'用户': user,
'内容': nrs,
'点赞': int(xiao)
}
xiaos.append(int(xiao))
shi.append(poom)
def main():
for x in range(1,14):
url = 'https://www.qiushibaike.com/text/page/%s/' % x
parse_page(url)
shi.sort(key=lambda data: data["点赞"])
print(shi[-1])
# print(max(xiaos))
if __name__ == '__main__':
main()