爬虫類総括2——POST方法のページめくりと非同期要求問題を解決する
3609 ワード
這い出しているhttp://www.chinaparking.org/news/1-A007--0-1-0-1-0-1このサイトの場合、次のページをクリックするとPOST方式で提出され、XHR非同期リクエストに戻ります.次のようになります.
パラメータ情報は次のように表示されます.
複数クリックするとページをめくるたびにpageIndexというパラメータだけがページ数によって変化することがわかります.実装コードは次のとおりです.
ここでデータを解析する方法は爬虫類のまとめとは異なり,JSONデータを辞書に変換し,直接キーでURLなどのデータを抽出することを用いる.
パラメータ情報は次のように表示されます.
複数クリックするとページをめくるたびにpageIndexというパラメータだけがページ数によって変化することがわかります.実装コードは次のとおりです.
from pyspider.libs.base_handler import *
import re
import json
class Handler(BaseHandler):
crawl_config = {
'header': {
'Accept':'application/json, text/javascript, */*; q=0.01',
#'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
#'Connection':'keep-alive',
#'Content-Length':'63',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie':'Hm_lvt_41163db3e6bf51ff3afeafa…0ddc415ce0f895822e=1534321147',
'Host':'www.chinaparking.org',
'Referer':'http://www.chinaparking.org/news/1-A007--0-1-0-1-0-1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/61.0',
'X-Requested-With':'XMLHttpRequest',
}
}
@every(minutes=24 * 60)
def on_start(self):
data={
'action': 'paginglist',
'pageIndex': 1,
'pageSize': 15,
'typeone': 'A007',
'typetwo':''
}
self.crawl('http://www.chinaparking.org/WebInfo/News', callback=self.index_page,data=data, method='POST')
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
web_data=response.text
print(web_data)
web_data=json.loads(web_data)
shuju=web_data['data']# loads , ,
print(shuju)
for i in range(0,len(shuju)):
url1='http://www.chinaparking.org/newsid_'+str(shuju[i]['ID'])
self.crawl(url1, callback=self.detail_page,save={'id':shuju[i]['ID'],'url':url1})
for i in range(2,279):
data={
'action': 'paginglist',
'pageIndex': i,
'pageSize': 15,
'typeone': 'A007',
'typetwo':''
}
self.crawl('http://www.chinaparking.org/WebInfo/News', callback=self.index_page, data=data, method='POST')
@config(priority=2)
def detail_page(self, response):
id=response.save['id']
url1=response.save['url']
print(url1)
data={
'action':'byid',
'id':str(id)
}
self.crawl('http://www.chinaparking.org/WebInfo/News', callback=self.last_page,data=data, method='POST',save={'url':url1})
def last_page(self, response):
web_data=response.text
print(web_data)
web_data=json.loads(web_data)
url=response.save['url']
title=web_data['_title']
time=web_data['_createdate']
context=web_data['_content']
ここでデータを解析する方法は爬虫類のまとめとは異なり,JSONデータを辞書に変換し,直接キーでURLなどのデータを抽出することを用いる.