又识爬虫
爬虫是一个很实用的技巧,它为我们提供了大量爬取网络上的数据的快捷方便的技巧。现实生活中,爬虫被广泛用于数据分析、数据汇总、AI 训练等等多方面。
并不只是我们在使用爬虫。搜索引擎是如何推荐你的文章到搜索结果页面的?还是爬虫。搜索引擎会根据网站的爬虫协议(一般在网站根路径会有一个 ./robots.txt
,例如我的博客的爬虫协议,一个合格的搜索引擎应当根据该协议规范自己的爬虫行为)进行对网站的内容的爬取。
请注意:爬虫学的好,牢饭吃得饱。互联网并非法外之地,你应当爬取只被允许爬取的网站、内容。在对一些网站的内容进行爬虫并商用的行为也有可能是非法的,所以最好不要做出非法爬虫行为。
开始爬虫
扯远了,现在让我们回到爬取我的博客本身吧!
在这里主要分为两个部分进行分析:爬虫部分,将保存的信息摘要保存到 db.json
,还有词云部分。
爬虫部分
在此次爬虫中,我主要爬取了主页的每条博客的 URL
、标题
、文章摘要
三个部分,数据结构如下:
{ |
使用的库包括:
requests
、lxml
、json
,系统环境:Python 3.8.5 on WSL2, Ubuntu @20.04 LTS
爬虫部分新建一个爬虫类:
class Spider: |
当然,对于这个爬虫本身不需要构建到一个类,只是我个人很喜欢封闭类,暴露一个接口,这个见仁见智。
思路总体是很简单的:
- 首先传入 URL,并调用
run()
方法运行爬虫。 - 在
run()
过程中,首先请求到网页的全文本信息。 - 把网页文本格式定义为
utf-8
,避免中文出现乱码。 - 通过
lxml
库的etree
方法处理文本信息。 - 使用
xpath
定位到每一篇文章的元素。 - 返回用过
xpath
找到的URL
、title
、excerpt
。
接着是开始调用:
blog = Spider(TARGET_URL) |
并保存到 db.json
中:
with open(file='db.json', mode='w', encoding='utf8') as f: |
在上面爬虫过程中,将保存的数据以字典的形式回传。因此在这里只需要将回传的数据,使用 json.dums()
方法规范,并写入到文件中即可。
需要注意的是在我写代码的时候发觉字典类型出现的是单引号,此时写入的
db.json
本身的语法是错误的。
如果你也出现了这个情况,配置ensure_ascii=False
即可解决单双引号问题。
词云部分
通过上面的操作,我们已经把我们需要的博客的 URL
、标题
、文章摘要
保存到 db.json
中了。接下来,我们需要对该字典读取,切割成为可迭代的单词列表,并进行词云绘制。
怎么实现这些功能呢?
jieba 是一个非常好用的中文单词分割 Python 库,可以通过
pip install jieba
安装。wordcloud,正如其名,把多个单词生成一个词云。但是其本身传入的是一长串字符串,以空格分隔、
try: |
代码中逻辑还是比较清晰的:
- 首先读取
db.json
数据文件。 - 标题、URL 不是我们所期望出现在词云的内容,因此我们选择了
excerpt(文章摘要)
- 接着使用
jieba
库的精准分割模式,获得可迭代的单词列表。 - 读取单词列表,以空格为分隔符,拼接列表中的所有单词。
- 使用
wordcloud.Wordcloud()
方法生成词云并保存到文件。
在最后一步中,
font_path
不是必要的,如果生成的词云的中文是乱码的,那你需要在这里指定一个同级目录下支持中文的字体文件。width、height 是词云的长宽
当
mode
设定为RGBA
时,指定background_color
为none
可以实现图片背景透明的效果。
相关代码
Author: DioPong
Permalink: https://blog.2to.fun/post/notebook/spide-my-blog/
文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。
Comments