簡體   English   中英

Scrapy - 使用請求庫發送到 API 的請求與使用 Scrapy.Request 發送的請求有何不同?

[英]Scrapy - How does a request sent using requests library to an API differs from the request that is sent using Scrapy.Request?

我是使用 Scrapy 的初學者,我試圖抓取這個網站https://directory.ntschools.net/#/schools ,它使用 javascript 來加載內容。 所以我檢查了.networks選項卡,有一個API地址可用https://directory.ntschools.net/api/System/GetAllSchools如果你打開這個地址,數據是XML格式。 但是,當您在檢查 .network 選項卡時檢查響應選項卡時,數據以 json 格式存在。

我首先嘗試使用 Scrapy,將請求發送到沒有任何標頭的 API 地址,它返回的響應在 XML 中,在使用 json.loads() 時拋出 JSONDecode 錯誤。 所以我使用了 header 'Accept': 'application/json' 我得到的響應是 JSON。效果很好

import scrapy
import json
import requests

class NtseSpider_new(scrapy.Spider):
    name = 'ntse_new'
    header = {
        'Accept': 'application/json',
         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.56',
    }
    
    def start_requests(self):
        yield scrapy.Request('https://directory.ntschools.net/api/System/GetAllSchools',callback=self.parse,headers=self.header)



    def parse(self,response):
        data = json.loads(response.body) #returned json response

但是后來我使用了沒有任何標頭的請求模塊,我得到的響應也在 JSON 中!

import requests

import json


res = requests.get('https://directory.ntschools.net/api/System/GetAllSchools')

js = json.loads(res.content) #returned json response

誰能告訴我這兩種請求之間是否有任何區別? 向 API 發出請求時,請求模塊是否有默認響應格式? 當然,我錯過了什么? 謝謝

這是因為 Scrapy 將Accept header 設置為 'text/html,application/xhtml+xml,application/xml...'。 這里可以看出。

我試驗發現,如果請求沒有Accept header,服務器會發送 JSON 響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM