输入关键字 抓取所有网页(Python的urllib库中的如下链接(包括GET参数的方法))
优采云 发布时间: 2022-03-31 18:19输入关键字 抓取所有网页(Python的urllib库中的如下链接(包括GET参数的方法))
一开始也没多想,因为GET参数和POST不一样。GET参数是直接加在URL后面直接发送的,所以我觉得直接在要抓取的URL中写GET参数就够了,像这样:
这是通过关键字-aaaa在和讯论坛搜索文本的URL链接地址(包括GET参数)。获取这个地址最简单的方法是通过浏览器访问这个博客的地址,然后在搜索输入框中输入要搜索的关键字,选择搜索类型为文本,然后点击搜索,浏览器会弹出网页的地址栏。这是我们上面的地址,如下图所示:
如果有人想深究,想知道上面地址中关键字q、type、Submit的含义,只能看网页源码(需要学爬虫或者知道html的语法):
说这么多好像有点跑题了。上面提到 GET 参数是写在 URL 中的。比如上面的链接地址可以直接通过Scrapy shell访问验证,如下:
一定要注意链接地址一定要用引号引起来,否则会报错
上面可以进入Scrapy交互模式的命令行说明是可行的。
2、URL中文编码问题
通过上面的问题1,我确认了可以在URL中硬编码GET参数来访问,但是我们要搜索的关键字是Chinese-Hongling,这就不得不涉及到中文的编解码问题。
Python 的 urllib 库中以下两个函数可以满足 URL 编解码的要求:
还要注意网站的编码。一开始没注意网站的编码。挣扎了半天,在网页的源终端文件中发现编码是gb2312。
最后通过上面两句就可以实现了,比上面直接访问灵活多了。也可以修改Scrapy的参数形式,将要搜索的关键字作为参数传入。
3、被robots.txt禁止的问题
刚开始爬的时候,总是有以下信息:
显然爬虫应该被拒绝。我对比了HttpFox和wireshark发送的数据包,发现我的爬虫发送的数据包和浏览器发送的数据包基本一致。我还使用了 scrapy-fake-useragent 库来伪装用户代理字段。, 逻辑上不会受到限制。
后来google了一下,发现有robots协议。以下段落摘自百度词条:
Robots Protocol(也称Crawler Protocol、Robot Protocol等)的全称是“Robots Exclusion Protocol”。网站 通过 Robots Protocol 告诉搜索引擎哪些页面可以爬取,哪些页面不能爬取。
后来在Scrapy文档中发现有对robots协议的控制的支持。
这里没有翻译,可以自己查看官方文档——RobotsTxtMiddleware
三、总结
整个实现过程比较简单。一开始,我被搜索结果的数量吓到了,因为有几十页,然后每页都有几十篇文章。在后续的实现中,发现只使用了Scrapy抓取的内容。没错,内容多少无关紧要,只是爬虫运行多长时间的问题。最后把整个代码放到网上——通过Scrapy和新闻论坛关键词搜索的结果。如果你有兴趣,你可以下载它并讨论它。欢迎来到拍砖!