# !/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2018-07-06 12:30:04 # Project: test1 from pyspider.libs.base_handler import * class Handler(BaseHandler): crawl_config = { } @every(minutes=24 * 60) def on_start(self): self.crawl( 'http://www.cdwater.gov.cn/admin/newsData.proxy?jsoncallback=jQuery18306603365339985892_1530710618747&channelId=0101001002000&pageNo=1&maxNo=12&citycode=&length=36&tag=1&username=%25E4%25B8%25AD%25E6%2596%2587', callback=self.index_page, validate_cert=False)#初始的第一个动态url @config(age=10 * 24 * 60 * 60) def index_page(self, response): print(response) web_data = response.text#返回的数据 data = re.findall(r'[^()]+', web_data)[1]#数据处理,得到需要的json数据串 content_list = json.loads(data)#得到json数据 url = [] for i in range(0, len(content_list['content_list'])):#从json数据中获取url,title url.append(content_list['content_list'][i]['url']) print(content_list['content_list'][i]['url']) self.crawl(content_list['content_list'][i]['url'], callback=self.detail_page, validate_cert=False) current_page = 1 # 当前页数 total_page = 10 # 总页数 next_page = current_page + 1 # 下一页 if next_page <= total_page: # 获取下一页的数据构造翻页 self.crawl( 'http://www.cdwater.gov.cn/admin/newsData.proxy?jsoncallback=jQuery18306603365339985892_1530710618747&channelId=0101001002000&pageNo={}&maxNo=12&citycode=&length=36&tag=1&username=%25E4%25B8%25AD%25E6%2596%2587'.format( str(next_page)), callback=self.index_page) @config(priority=2) def detail_page(self, response): return { "url": response.url, "title": response.doc('title').text(), }
我们导入了2个模块他们的作用分别是:re用于正则获取数据,json用于json数据转化
开始异步爬虫分析:
第一步:浏览器打开需要爬取的url:
按F12使用谷歌浏览器自带的浏览器network工具,查看请求,或者自己使用抓包工具也可以(当前没有请求,莫方,你手动去点击下一页制造请求):
点击下一页或者直接刷新,就会在network上边看到有请求,这里注意看XHR和JS部分,有的是用js封数据请求会在js里面,也有会在XHR里面的异步请求:
从这里我们就可以清楚的在xhr返回的header里面看到异步请求的url,这里我们直接访问该url(或者在preview里面可以看到返回的数据)可以看到返回的数据就是新闻数据,也就是我们要爬的数据。
这下我们知道数据是通过这样式的url传过来的,因此我们需要分析url格式,不要怕一般都很有规律性,都是根据下边的参数构造的,找到规律就能构造出url出来,这里不详细分析,具体看目标网站如何封装。
到这里,我们基本知道接下来就是根据构造的url去写爬虫脚本,做详细的数据解析,这个就不详细讲了,具体问题具体分析。
这就是一种解决动态/异步请求html数据爬取的一种思路,有其他思路可以一起沟通。