输入关键字 抓取所有网页(Python的urllib库中的如下链接(包括GET参数的方法))

优采云 发布时间: 2022-01-23 19:19

  输入关键字 抓取所有网页(Python的urllib库中的如下链接(包括GET参数的方法))

  一开始也没多想,因为GET参数和POST不一样。GET参数是直接加在URL后面直接发送的,所以我觉得直接在要抓取的URL中写GET参数就够了,如下:

  http://bbs.hexun.com/search/?q=aaaa&type=2&Submit=

  这是通过关键字-aaaa在和讯论坛搜索文本的URL链接地址(包括GET参数)。获取这个地址最简单的方法是通过浏览器访问这个博客的地址,然后在搜索输入框中输入要搜索的关键字,选择搜索类型为文本,然后点击搜索,浏览器会弹出网页的地址栏。这是我们上面的地址,如下图所示:

  

  

  如果有人想一探究竟,想知道上面地址中关键字q、type、Submit的含义,只能看网页源码(学爬虫或者想知道html的语法):

  

标题

正文

作者

  说这么多好像有点跑题了。上面提到了GET参数是写在URL里的。比如上面的链接地址可以直接通过Scrapy shell访问验证,如下:

  [[email protected] python]$ scrapy shell "http://bbs.hexun.com/search/?q=xxxx&type=2&Submit=" --nolog

[s] Available Scrapy objects:

[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)

[s] crawler

[s] item {}

[s] request

[s] response

[s] settings

[s] spider

[s] Useful shortcuts:

[s] shelp() Shell help (print this help)

[s] fetch(req_or_url) Fetch request (or URL) and update local objects

[s] view(response) View response in a browser

>>>

  一定要注意链接地址一定要用引号引起来,否则会报错

  上面可以进入Scrapy交互模式的命令行说明是可行的。

  2、URL中文编码问题

  通过上面的问题1,我确认可以在URL中硬编码GET参数来访问,但是我们要搜索的关键字是Chinese-Hongling,这就不得不涉及到中文的编解码问题。

  Python 的 urllib 库中以下两个函数可以满足 URL 编解码的要求:

  urllib.quote(string[, safe])

Replace special characters in string using the %xx escape. Letters, digits, and the characters '_.-' are never quoted. By default, this function is intended for quoting the path section of the URL. The optional safe parameter specifies additional characters that should not be quoted — its default value is '/'.

Example: quote('/~connolly/') yields '/%7econnolly/'.

  urllib.unquote(string)

Replace %xx escapes by their single-character equivalent.

Example: unquote('/%7Econnolly/') yields '/~connolly/'.

  还要注意网站的编码。一开始没注意网站的编码。挣扎了半天,在网页的源终端文件中发现编码是gb2312。

   # keywords = getattr(self, 'keywords', None)

# '网站的编码是gb2312的'

keywords = u'红岭'.encode('gb2312')

requesturl = "http://bbs.hexun.com/search/?q={0}&type=2&Submit=".format(urllib.quote(keywords))

  最后通过上面两句就可以实现了,比上面直接访问灵活多了。也可以修改Scrapy的参数形式,将要搜索的关键字作为参数传入。

  3、被robots.txt禁止的问题

  刚开始爬的时候,总是有以下信息:

  2016-12-27 11:14:39 [scrapy] INFO: Spider opened

2016-12-27 11:14:39 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

2016-12-27 11:14:39 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6026

2016-12-27 11:14:40 [scrapy] DEBUG: Crawled (200) (referer: None)

2016-12-27 11:14:40 [scrapy] DEBUG: Forbidden by robots.txt:

2016-12-27 11:14:40 [scrapy] INFO: Closing spider (finished)

2016-12-27 11:14:40 [scrapy] INFO: Dumping Scrapy stats:

  显然爬虫应该被拒绝。我对比了HttpFox和wireshark发送的数据包,发现我的爬虫发送的数据包和浏览器发送的数据包基本一致。我还使用了 scrapy-fake-useragent 库来伪装用户代理字段。, 逻辑上不会受到限制。

  后来google了一下,发现有robots协议。以下段落摘自百度词条:

  Robots Protocol(也称Crawler Protocol、Robot Protocol等)的全称是“Robots Exclusion Protocol”。网站 通过 Robots Protocol 告诉搜索引擎哪些页面可以爬取,哪些页面不能爬取。

  后来在Scrapy文档中发现有对robots协议的控制的支持。

  ROBOTSTXT_OBEY

Default: False

Scope: scrapy.downloadermiddlewares.robotstxt

If enabled, Scrapy will respect robots.txt policies. For more information see RobotsTxtMiddleware.

Note

While the default value is False for historical reasons, this option is enabled by default in settings.py file generated by scrapy startproject command.

  这里没有翻译,可以自己查看官方文档——

  三、总结

  整个实现过程比较简单。一开始,我被搜索结果的数量吓到了,因为有几十页,然后每页都有几十篇文章。在后续的实现中,发现只使用了Scrapy抓取的内容。没错,内容多少无关紧要,只是爬虫运行多长时间的问题。最后把整个代码放到网上——通过scrapy和论坛搜索关键字的结果,有兴趣的可以下载讨论,欢迎做砖!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线