一、引言
我又有三个月没有写学习记录了,原因是这段时间由于一些原因没有好好学习。不过,最近有同事希望我帮忙写一个工具软件,这让我又有了学习动力。
我的同事因工作需要,不时要从网上搜索一些信息,他一般是登录百度、腾讯、搜狐等网站,输入关键字,得到搜索结果,然后从结果中一个个点开链接,查看相关的网页中有没有自己需要的内容。同事觉得这样的手工搜索效率很低,希望我给他做个爬虫软件,提供工作效率。
我以前没有关注过网络爬虫,对这方面不太了解,因此并没有马上答应同事,而是告诉他,我对这一块还不太了解,需要先学习学习。
在花了几天进行相关知识的学习后,我有了一点点的收获。今天先整理出了从百度搜索结果中抓取标题。链接、内容,并保存到xlsx文件中的相关内容,为后续的学习做好技术储备。
二、功能实现
我个人最常用的搜索引擎就是百度了,就先从如何从百度抓取搜索结果学起。
(一)用到的库
本次学习从百度抓取搜索结果用到了四个库:requests、lxml、BeautifulSoup、xlsxwriter。其中,lxml库和BeautifulSoup库的功能相同,都是用于解析 HTML 内容的,实现数据爬取只需使用其中之一即可。这次学习把这两个库都研究了一下,分别写了两段代码,感受其不同。
(二)参考的资料
使用lxml库实现HTML 内容解析参考的资料链接:
https://blog.csdn.net/m0_74972192/article/details/140781438
使用BeautifulSoup库实现HTML 内容解析参考的资料链接:
https://blog.csdn.net/m0_74972192/article/details/140781438
上面两个参考资料都只提供了如何从百度搜索结果中爬取标题和链接的方法。而百度搜索到的结果除了标题和链接外,一般的文字网页还会提供内容摘要和来源平台名称,我希望把这两个内容页抓下来。另外一个不足就是,上面两个参考资料中的代码只能抓取一个页面的结果,而不是所有的搜索结果,而我希望一次抓取到更多的结果。
(三)场景分析
我们在百度网页输入关键字后进行搜索,会获得多个结果,百度会将搜索结果以10个为一组分成多个页面。百度返回给用户的搜索结果页面,展示的是前10个结果组成的第一页,并在页面下方提供了用于跳转到其它页面的按钮样式超链接。

通过对网上资料的学习,我知晓了要从百度搜索页面爬取结果,需要向网站发送如下的网址格式。
f'https://www.baidu.com/s?wd={wd}&pn={pn}'
其中wd是要搜索的关键字,pn则是百度网站显示的页面数,第一页pn=0,第二页pn=10,第三页pn=20,依此类推。这也就意味着每次抓取只会获得一个页面的数据,而搜索到的结果一般会超过10个,就要分多次去抓取了。这一点使用循环语句即可。
前面提到的参考资料里都只提供了如何抓取标题和链接的方法,而我希望还要抓取对应的内容摘要和来源,但一时没找到相关的资料,需要我自己去研究。好在我找到了对网页进行分析的方法,有了方法就难不倒我了。
根据所学,我通过网页浏览器的“开发人员工具”(F12),对百度网页进行了一些研究,掌握了抓取数据的一些规律。

由于上述参考资料中分别有lxml库解析和BeautifulSoup库的内容,因此我就分别针对这两个资料的代码进行修改来实现我自己的目的。
1.lxml库解析
lxml库解析方面,第一个参考资料提供的代码比较完备,只需要做适当的修改,就可以达到我的目的。通过研究网页源代码,发现摘要内容都在span节点内,来源则在aria-hidden="true"的span节点下。在解析HTML内容部分,添加相关的代码即可获取到摘要和来源。
html = etree.HTML(response)
selectors = html.xpath('//div[@class="c-container"]') # 获取包含搜索结果的节点
data = []
nub = 0
for selector in selectors:
title = "".join(selector.xpath('.//h3/a//text()')) # 获取标题
title_url = selector.xpath('.//h3/a/@href')[0] # 获取链接
print(title)
print(title_url)
# 通过研究网页源代码,发现摘要内容都在span节点内
contents = selector.xpath('.//span//text()') # 获取摘要内容(列表形式)
# 将内容列表拼接成字符串
content = ''
if len(contents) >

400

被折叠的 条评论
为什么被折叠?



