在豆瓣这个例子中,XHR 请求并不多,可以挨个查看来确认。但在 XHR 请求较多的时刻,可能须要结合触动员作的时光,请求的路径等信息赞助在大年夜量的请求中找到包含信息的关键请求。这须要抓取或者前端的相干经验。所以,有一个我一向在提的不雅点,进修抓取的最好办法是:学会写网站。
如今可以在新窗口中打开 http://movie.douban.com/j/searchX67Xsubjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0,你会看到包含片子数据的 JSON 原始数据。推荐安装 JSONView(Firfox版)插件,如许可以看到更好看标 JSON 格局,展开折叠列等功能。然后,我们根据 JSON 数据,编写一个提取片子名和评分的脚本:
你可以应用 response.json 将结不雅转为一个 python 的 dict 对象
你可以在 http://demo.pyspider.org/debug/tutorial_douban_explore 获得完全的代码,并进行调试。脚本中还有一个应用 PhantomJS 衬着的提取版本,将会鄙人一篇教程中介绍。
HTTP
HTTP 是用来传输网页内容的协定。在前面的教程中,我们已经经由过程 self.crawl 接口提交了 URL 进行了抓取。这些抓取就是经由过程 HTTP 协定传输的。
在抓取过程中,你可能会碰到类似 403 Forbidden,或者须要登录的情况,这时刻你就须要精确的 HTTP 参数进行抓取了。
一个典范的 HTTP 请求包如下,这个请求是发往 http://example.com/ 的:
- GET / HTTP/1.1
- Host: example.com
- Connection: keep-alive
- Cache-Control: max-age=0
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.45 Safari/537.36
- Referer: http://en.wikipedia.org/wiki/Example.com
- Accept-Encoding: gzip, deflate, sdch
- Accept-Language: zh-CN,zh;q=0.8
- If-None-Match: "359670651"
- If-Modified-Since: Fri, 09 Aug 2013 23:54:35 GMT
- 请求的第一行包含 method, path 和 HTTP 协定的版本信息
- 余下的行被称为 header,是以 key: value 的情势出现的
- 如不雅是 POST 请求,在请求结尾可能还会有 body 内容
你可以经由过程前面用过的 Chrome Developer Tools 对象查看到这些信息:
在大年夜多半时刻,应用精确的 method, path, headers 和 body 老是能抓取到你须要的信息的。
HTTP Method
HTTP Method 告诉办事器对 URL 资本期望进行的操作。例如在打开一个 URL 的时刻应用的是 GET 方法,而在提交数据的时刻一般应用 POST。
Referer 用于告诉办事器,你拜访的上一个网页是什么。经常被用于防盗链,在抓取图片的时刻可能会用到。
TODO: need example here
HTTP Headers 是请求所带的一个参数列表,你可以在 这里 找到完全的常用 Headers 列表。一些常用的须要留意的有:
User-Agent
UA 是标识你应用的浏览器,或抓取法度榜样的一段字符串。pyspider 应用的默认 UA 是 pyspider/VERSION (+http://pyspider.org/)。网站常用这个字符串来区分用户的操作体系和浏览器,以及断定对方是否是爬虫。所以在抓取的时刻,经常会对 UA 进行假装。
在 pyspider 中,你可以经由过程 self.crawl(URL, headers={'User-Agent': 'pyspider'}),或者是 crawl_config = {'headers': {'User-Agent': 'xxxx'}} 来指定脚本级其余 UA。具体请查看 API 文档。
Referer
X-Requested-With
当应用 XHR 发送 AJAX 请求时会带上的 Header,常被用于断定是不是 AJAX 请求。例如在 北邮人论坛 中,你须要:
- def on_start(self):
- self.crawl('http://bbs.byr.cn/board/Python',
- headers={'X-Requested-With': 'XMLHttpRequest'},
- callback=self.index_page)
带有 headers={'X-Requested-With': 'XMLHttpRequest'} 才能抓取到内容。
HTTP Cookie
推荐阅读
硅谷(GoogleIO大年夜会第二天)【51CTO.com原创稿件】关于硅谷,你可能读过很多文┞仿和书本,比如吴军博士的《海潮之巅》,比如环绕着乔帮主、小扎的传奇故事,已经让你对硅谷蒙上了神奇的>>>详细阅读 本文标题:pyspider爬虫教程 (2):AJAX和HTTP 地址:http://www.17bianji.com/lsqh/35191.html 1/2 1