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

优采云 发布时间: 2021-11-02 05:08

  输入关键字 抓取所有网页(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直接访问进行验证的,如下:

  [james_xie@james-desk 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/'.

  这里还要注意网站的编码。一开始没注意网站的编码。苦苦挣扎了半天,发现web源dock文件中的编码是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 库来伪装用户代理字段。,按道理来说,是不会限制的。

  后来谷歌一看,发现有机器人协议。以下一段摘自百度的词条:

  Robots协议(也叫爬虫协议、机器人协议等)的全称是“机器人排除协议”(Robots Exclusion 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人工客服


线