文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一日一技:使用大模型实现全自动爬虫

2024-11-29 18:04

关注

在实现的过程中,我发现涉及到的知识点可能一篇文章讲不完,因此拆分成了多篇文章。

爬虫演示

今天是第一部分,我们暂时不依赖模拟浏览器,而是使用httpx(你也可以使用requests)实现全自动爬虫,传入我博客文章列表页,爬虫会自动抓取前三页所有博客文章的、正文、作者、发布时间。

爬取结果如下图所示:

图片

运行过程如下图所示:

图片

爬虫首先会进入起始列表页,抓取上面的所有文章。然后进入列表页第二页,再抓取所有文章,最后进入第三页,再抓取所有文章。整个过程都是全自动的。不需要写任何XPath,也不需要告诉爬虫哪里是翻页按钮,文章的在哪里,发布时间在哪里,正文在哪里。

模块拆解

代码我已经放到Github:AutoCrawler[1]。由于最近智谱[2]又免费送了1亿的Token,并且超过以后,调用API费用1折起,所以还是使用他们最新的基座大模型GLM-4-Plus来实现这个全自动爬虫。

代码分为如下几个主要文件:

图片

原理说明

字段解析与翻页

其中,跟大模型相关的代码在parser.py中。我们来看一下:

图片

代码逻辑很简单,分为两个主要的方法,data_extract用来从列表页提取出详情页URL,从详情页提取出作者、、发布时间和正文。paging_extract用来提取分页按钮中,下一页对应的链接。

这个提取的过程就交给智谱GLM-4-Plus来完成。对于字段提取,对应的System Prompt如下:

你将扮演一个HTML解析器的角色。我将会提供一段HTML代码,这段代码可能代表了一个博客网站的文章列表页或者文章详情页。你需要首先判断这段HTML是属于哪种类型的页面。如果是文章详情页,那么页面中通常会包含文章、发布时间、作者以及内容等信息;而如果是列表页,则会列出多篇文章的及其对应的详情页链接。

请根据以下规则进行处理:

1. 分析提供的HTML代码,确定页面类型(`list` 或 `detail`)。
2. 根据页面类型,提取必要的信息:
   - 如果是列表页,请找到所有文章条目,并为每个条目提供和指向详情页的链接。
   - 如果是详情页,请找到文章、作者、发布时间和内容的XPath。确保XPath直接指向包含这些信息的具体元素值,例如使用`@属性`或者`text()`来获取确切的文本内容。
3. 尽量使用具有特征性的属性如`id`或`class`来构造XPath,以确保XPath简洁且鲁棒。
4. 对于、作者、发布时间等字段,如果它们不是直接在某个标签内,而是嵌套在其他标签中,XPath应包括这些结构,以保证准确性。
5. 按照指定格式输出结果。
6. 只需要返回JSON,不要解释,不要返回无关内容

**输出格式:**

- 对于列表页,返回如下JSON结构:
  {
      "page_type": "list",
      "articles": [
          {"title": "文章", "url": "文章详情页URL"},
          {"title": "文章", "url": "文章详情页URL"},
          {"title": "文章", "url": "文章详情页URL"},
          // 更多文章...
      ]
  }

- 对于详情页,返回如下JSON结构:
  {
      "page_type": "detail",
      "fields": [
          {"field_name": "title", "xpath": "XPath to the title"},
          {"field_name": "author", "xpath": "XPath to the author"},
          {"field_name": "publish_time", "xpath": "XPath to the publish time"},
          {"field_name": "content", "xpath": "XPath to the content"}
      ]
  }

现在,请接收以下HTML代码并开始分析:

可能有同学会疑惑,为什么对于列表页,是直接让大模型提取出URL,但对于详情页,却是生成XPath而不直接提取内容呢?原因很简单,因为现在大模型的Output Token远远低于Input Token,并且Output Token更贵。现在Input Token轻轻松松超过128K,但是Output Token大部分都在4096,只有少数在8192。对于长文章,把Output Token全部用完了可能都没法输出完整的正文。而且输出的内容越多,费用就越高,速度就越慢。你以为我不想让大模型直接输出提取好的内容?

而由于列表页的内容并不多,加上URL用不了多少字,所以就直接输出了。

获取翻页链接的System Prompt,如下:

你将扮演一个HTML解析器的角色。我将会提供一段HTML代码,这段代码可能代表了一个博客网站的文章列表页。你需要找到页面上的翻页链接,并提取出下一页的URL  
  
请根据以下规则进行处理:  
  
1. 分析提供的HTML代码,找到翻页按钮。  
2. 翻页按钮上面的文本可能是『下一页』、『next』、『>』、『Load more』等,也可能是一个数字,代表页码,也可能是paging标签或者classname包含pagination的某个标签。没有固定的标准,你需要智能识别  
3. 返回下一页的URL,如果没有下一页,返回空字符串  
4. 按照指定格式输出结果。  
5. 只需要返回JSON,不要解释,不要返回无关内容  
  
返回JSON格式:  
  
{"page_type": "paging", "url": "下一页的url"}

这就是常规的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

来源:未闻Code内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯