爬虫類総括2——POST方法のページめくりと非同期要求問題を解決する

3609 ワード

這い出しているhttp://www.chinaparking.org/news/1-A007--0-1-0-1-0-1このサイトの場合、次のページをクリックするとPOST方式で提出され、XHR非同期リクエストに戻ります.次のようになります.
爬虫总结2——解决POST方法翻页及异步请求问题_第1张图片
パラメータ情報は次のように表示されます.
爬虫总结2——解决POST方法翻页及异步请求问题_第2张图片
複数クリックするとページをめくるたびに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などのデータを抽出することを用いる.