繁体   English   中英

Scrapy - 基于 AJAX 的网站的请求有效负载格式和类型

[英]Scrapy - Request Payload format and types for AJAX based websites

我正在尝试刮中午。com。 这是我有兴趣刮掉https://www.noon.com/uae-en/face-and-beard-wash-multicolour-80ml/N22130693A/p?o=f7adb85c3296590b的产品。

我能够获得除评级/评论数据之外的所有产品信息。 这里的问题是该网站正在通过 API 链接https://www.noon.com/_svc/reviews/fetch/v1/product-reviews/list加载评级数据,这基本上是 POST 请求方法。

我尝试在 scrapy 请求中包含标头和适当的有效负载。 但我得到 400, 405 --- HTTP 状态码未处理或不允许作为响应。

这就是我试图提取评级数据的方式

def start_requests(self):
    headers = {"authority": "www.noon.com",
    "method": "POST",
    "path": "/_svc/reviews/fetch/v1/product-reviews/list",
    "scheme": "https",
    "accept": "application/json, text/plain, */*",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "en-US,en;q=0.9",
    "cache-control": "no-cache, max-age=0, must-revalidate, no-store",
    "content-type": "application/json",
    "origin": "https://www.noon.com",
    "referer": "https://www.noon.com/uae-en/face-and-beard-wash-multicolour-80ml/N22130693A/p?o=f7adb85c3296590b",
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
    }
    url = "https://www.noon.com/_svc/reviews/fetch/v1/product-reviews/list"

    payload = [{"catalogCode":"noon","sku":"N22130693A","lang":None,"ratings":[1,2,3,4,5],"provideBreakdown":True,"page":1}]

    yield  scrapy.Request(url,method = "POST",body=json.dumps(payload),headers = headers,callback=self.parse)


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

这个问题有什么解决办法吗? 任何帮助,将不胜感激。

我试过这个,它对我有用,如果它对你不起作用,也许你已经被 IP 阻止并且可能不得不使用代理 api。 试试这是否适合你。

def start_requests(self):
    return [scrapy.Request(
        url='https://www.noon.com/_svc/reviews/fetch/v1/product-reviews/list',
        method='POST',
        body='{"catalogCode":"noon","sku":"N22130693A","lang":null,"ratings":[1,2,3,4,5],"provideBreakdown":true,"page":1}',
        headers={
            'content-type': 'application/json'
        }
    )]

def parse(self, response):
    print(response.body)

我的 output:

2020-12-23 13:12:35 [scrapy.core.engine] DEBUG: Crawled (200) <POST https://www.noon.com/_svc/reviews/fetch/v1/product-reviews/list> (referer: None)
b'{"list":[],"summary":{"rating":5.0,"count":1,"commentCount":0},"breakdown":[{"rating":5.0,"count":1,"commentCount":0}],"languages":[],"pagination":{"totalPages":1,"page":1,"perPage":10}}'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM