爬虫入门12Pyspider框架入门—Ajax和HTTP
Posted 一步一步学Python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫入门12Pyspider框架入门—Ajax和HTTP相关的知识,希望对你有一定的参考价值。
前面我们已经讲过如何在html文档中提取链接和信息,但是我们要获取的内容可能会更为复杂,不仅是解析麻烦,加载的方式也是多变的,比如AJAX。看过我前面文章的同学,应该对AJAX不陌生了,我们今天不写具体的脚本,只是单纯的来讲讲如何在Pyspider框架中获取AJAX加载的内容
Ajax
如何才能获取真正的数据请求呢?
打开浏览器的调试,在网络标签下面,我们会看到一个特殊的内容XHR。
Ajax是使用XMLHttpRequest对象来发送和检索数据的,我们一般简称为XHR方式。
我们可以通过上下滑动页面,来查看一下XHR下面,哪些增加了一些json文件,这就是加载内容的关键信息。
【插入图片,XHR】
我们随便点开其中一个,在消息头中获取真正的请求网址http://api.twitch.tv/kraken/streams?limit=20&offset=0&game=Dota+2&broadcaster_language=&on_site=1
这个网址现在经过实验,已经是无效的了,在此仅作参考。
这个网址中包含了频道信息集合,是一个list。
class Handler(BaseHandler):
@every(minutes=10)
def on_start(self):
self.crawl('http://api.twitch.tv/kraken/streams?limit=20&offset=0&game=Dota+2&broadcaster_language=&on_site=1', callback=self.index_page)
@config(age=10*60)
def index_page(self, response):
return [{ "name": x['channel']['display_name'], "viewers": x['viewers'], "status": x['channel'].get('status'),
} for x in response.json['streams']]
我们可以使用response.json方法将json内容装换成一个dict对象。
另外,由于频道列表不断在改变,我们需要定时更新,这里设置为10分钟更新一次。
HTTP
如果我们在访问HTTP页面时,返回了403 Forbidden或者需要一些登陆信息,我们可以从HTTP请求中获取。
下面是一个简单的GET请求。我们可以从浏览器的调试工具中获取。
GET / HTTP/1.1Host: example.com
Connection: keep-alive
Cache-Control: max-age=0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-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.36Referer: http://en.wikipedia.org/wiki/Example.com
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8If-None-Match: "359670651"If-Modified-Since: Fri, 09 Aug 2013 23:54:35 GMT
这些头信息,我们可以在crawl_config中定义下来,调用crawl方法时会用到。
headers={ 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'
}
crawl_config = { 'headers':headers, 'timeout':1000
}
以上是关于爬虫入门12Pyspider框架入门—Ajax和HTTP的主要内容,如果未能解决你的问题,请参考以下文章