2017-03-29 89 views
0

我需要從本網站抓取一些新聞:https://www.huxiu.com/channel/103.html。這裏103是新聞類別ID。使用Scrapy抓取數據以加載更多內容?

但是,如果沒有觸發Ajax加載更多的我只能拿到第一頁: enter image description here
很奇怪的請求的URL是不同的新聞類別相同。

enter image description here

和頁面信息被引用者提供的頭文件。該頁面由表單數據發送。

這裏是我的代碼片段:

self.page += 1 
    url = "https://www.huxiu.com/channel/ajaxGetMore" 
    method = "POST" 

    headers = { 
     "Host": "www.huxiu.com", 
     "Origin": "https://www.huxiu.com", 
     "Referer": "https://www.huxiu.com/channel/106.html", 
     "User-Agent": (
      "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/" 
      "537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Sa" 
      "fari/537.36" 
     ), 
     "X-Requested-With": "XMLHttpRequest", 
    } 

    formdata = { 
     "huxiu_hash_code": "9aee58d3507ecafed74df13e156ab01b", 
     "page": str(self.page), 
     "catId": "106" 
    } 

    yield FormRequest(
     url=url, 
     method=method, 
     headers=headers, 
     formdata=formdata, 
     callback=self.parse 
    ) 

它未能裝載更多新聞提要。如何發送帖子請求來抓取更多新聞?

+0

是哈希碼總是相同的,如果你檢查你的瀏覽器發送什麼?難道哈希碼是從頁面本身獲取的嗎? –

+0

哈希碼總是相同的。 – lerner

回答

1

在這種情況下,GET和POST請求似乎是可以互換的。 這是一種很常見的AJAX分頁技術:

如果您想嘗試:在瀏覽器中https://www.huxiu.com/channel/ajaxGetMore?catId=103&page=3,你會看到一個包含所有的拼版數據藏漢像total_page一些元數據的一些JSON數據。這些信息很容易抓取,並且可以讓您同時抓取每個頁面,因爲您知道第一個請求的頁數。

見例如這種蜘蛛的python3涉及這種分頁的方法如下:

from scrapy import Spider, Request 
from w3lib.url import add_or_replace_parameter 

class MySpider(Spider): 
    start_urls = ['https://www.huxiu.com/channel/ajaxGetMore?catId=103&page=1'] 

    def parse(self, response): 
     data = json.loads(response.body_as_unicode()) 
     yield from parse_data(response) # parse first page as well 
     # yield async requests for every other page. 
     for page in range(2, data['data']['total_page']): 
      # make next page url by replacing page parameter 
      url = add_or_replace_parameter(response.url, 'page', page) 
      yield Request(url, callback=self.parse_data) 

    def parse_data(self, response): 
     data = json.loads(response.body_as_unicode()) 
     # parse json data