在文章一日一技:图文结合,大模型自动抓取列表页中,我提到可以使用大模型实现一个全自动爬虫。只需要输入起始URL加上需求,就可以借助模拟浏览器自动完成所有的抓取任务。今天,借着智谱全模型家族正式上线 bigmodel.cn这个契机,我们就来实现全自动爬虫。
在实现的过程中,我发现涉及到的知识点可能一篇文章讲不完,因此拆分成了多篇文章。
爬虫演示
今天是第一部分,我们暂时不依赖模拟浏览器,而是使用httpx(你也可以使用requests)实现全自动爬虫,传入我博客文章列表页,爬虫会自动抓取前三页所有博客文章的标题、正文、作者、发布时间。
爬取结果如下图所示:
图片
运行过程如下图所示:
图片
爬虫首先会进入起始列表页,抓取上面的所有文章。然后进入列表页第二页,再抓取所有文章,最后进入第三页,再抓取所有文章。整个过程都是全自动的。不需要写任何XPath,也不需要告诉爬虫哪里是翻页按钮,文章的标题在哪里,发布时间在哪里,正文在哪里。
模块拆解
代码我已经放到Github:AutoCrawler[1]。由于最近智谱[2]又免费送了1亿的Token,并且超过以后,调用API费用1折起,所以还是使用他们最新的基座大模型GLM-4-Plus来实现这个全自动爬虫。
代码分为如下几个主要文件:
- llm.py: 封装智谱的大模型,以方便使用。代码如下图所示。大家可以根据这个输入输出修改成自己常用的大模型。我测试了国产的各家大模型,最后发现GLM-4-Plus在语言理解,网页结构解析,指令遵循方面相对最好。
图片
- utils.py: 常用工具函数,清洗HTML,重试等等
- constants.py: 各种常量,包括各种Prompt
- parser.py: 核心解析逻辑,解析列表页、详情页,识别翻页按钮
- main.py:调度逻辑。把各个模块组合在一起
原理说明
字段解析与翻页
其中,跟大模型相关的代码在parser.py中。我们来看一下:
图片
代码逻辑很简单,分为两个主要的方法,data_extract用来从列表页提取出详情页URL,从详情页提取出作者、标题、发布时间和正文。paging_extract用来提取分页按钮中,下一页对应的链接。
这个提取的过程就交给智谱GLM-4-Plus来完成。对于字段提取,对应的System Prompt如下:
可能有同学会疑惑,为什么对于列表页,是直接让大模型提取出URL,但对于详情页,却是生成XPath而不直接提取内容呢?原因很简单,因为现在大模型的Output Token远远低于Input Token,并且Output Token更贵。现在Input Token轻轻松松超过128K,但是Output Token大部分都在4096,只有少数在8192。对于长文章,把Output Token全部用完了可能都没法输出完整的正文。而且输出的内容越多,费用就越高,速度就越慢。你以为我不想让大模型直接输出提取好的内容?
而由于列表页的内容并不多,标题加上URL用不了多少字,所以就直接输出了。
获取翻页链接的System Prompt,如下:
这就是常规的Prompt,没什么好解释的。
爬虫流程调度
我们最后来看看main.py的代码:
图片
核心调度逻辑就这么几行代码。如果有同学经常刷算法题,应该会对这段代码很熟悉。这里使用while循环来实现递归操作。
一开始,target里面只有我传入的起始URL。然后进入while循环,当target队列为空时结束循环。在循环里面,首先解析当前列表页,获得当前页面所有的文章详情页URL,全部放入队列中。再获得下一页的URL,也放入队列中。接下来循环开始进入第二项,也就是第一篇文章详情URL,进入里面,获取源代码,使用大模型解析出XPath,然后调用self.extract_detail通过lxml执行XPath从源代码中提取出正文。接下来继续第二篇文章……如此循环。
今天我们实现的是最简单的情况。不考虑反爬虫。不考虑列表页滚动下拉的情况。在下一篇文章中,我们会把模拟浏览器引入进来。借助于智能全面提升的GLM-4-Plus和GLM-4V-Plus,让爬虫能够自己控制模拟浏览器,让它自动点击页面,绕过反爬虫,自动滚动下拉。
参考资料
[1]AutoCrawler: https://github.com/kingname/AutoCrawler
[2]智谱: https://zhipuaishengchan.datasink.sensorsdata.cn/t/JX
[3] 视频通话模型内测地址: https://bigmodel.cn/online-book/videocall