Scrapy:维护重定向的位置cookie

lrpiutwd  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(152)

编码:


# -*- coding: utf-8 -*-

import scrapy
from ..items import LowesspiderItem
from scrapy.http import Request

class LowesSpider(scrapy.Spider):
    name = 'lowes'

    def start_requests(self):
        start_urls = ['https://www.lowes.com/search?searchTerm=8654RM-42']

        for url in start_urls:
            yield Request(url, cookies={'sn':'2333'}) #Added cookie to bypass location req 

    def parse(self, response):
        items = response.css('.grid-container')
        for product in items:
            item = LowesspiderItem()

        #get product price
            productPrice = product.css('.art-pd-price::text').get()
        #get lowesNum
            productLowesNum = response.url.split("/")[-1]
        #get SKU
            productSKU = product.css('.met-product-model::text').get()

            item["productLowesNum"] = productLowesNum
            item["productSKU"] = productSKU
            item["productPrice"] = productPrice

            yield item

输出量:

{'productLowesNum': '1001440644',
 'productPrice': None,
 'productSKU': '8654RM-42'}

现在,我将有一个SKU列表,这就是我将如何格式化start_urls,因此,

start_urls = ['https://www.lowes.com/search?searchTerm=('some sku)']

此URL会将我重定向到以下链接:https://www.lowes.com/pd/ZLINE-KITCHEN-BATH-Ducted-Red-Matte-Wall-Mounted-Range-Hood-Common-42-Inch-Actual-42-in/1001440644
"这是由Scrappy处理的"
"现在问题来了“
当我有:

start_urls = ['https://www.lowes.com/search?searchTerm=8654RM-42']

我得到了SKU,但没有得到价格。
但是当我在start_urls中使用实际的URL时

start_urls = ['https://www.lowes.com/pd/ZLINE-KITCHEN-BATH-Ducted-Red-Matte-Wall-Mounted-Range-Hood-Common-42-Inch-Actual-42-in/1001440644']

那么我的输出是正确的:

{'productLowesNum': '1001440644',
 'productPrice': '1,449.95',
 'productSKU': '8654RM-42'}

所以,我相信使用一个必须重定向的URL会导致我的刮刀由于某种原因没有得到价格,但我仍然得到了SKU。
我的猜测是:我必须预设一个位置cookie,因为Lowes网站不允许你看到价格,除非用户给他们一个邮政编码/位置。所以我假设我必须移动或调整cookies={'sn':'2333'},使我的程序按预期工作。

zpgglvta

zpgglvta1#

问题

这里的主要问题是,您的一些cookie是由第一个请求设置的
https://www.lowes.com/search?searchTerm=8654RM-42
在重定向之后被传送到请求,该重定向被
https://www.lowes.com/pd/ZLINE-KITCHEN-BATH-Ducted-Red-Matte-Wall-Mounted-Range-Hood-Common-42-Inch-Actual-42-in/1001440644
这些Cookie将覆盖您设置的Cookie。

溶液

您需要向每个请求发送显式Cookie,并防止将前一个Cookie添加到下一个请求中。
在scrapy中有一个名为dont_merge_cookies的设置,用于此目的。您需要在您的请求 meta中设置此设置,以防止来自先前请求的cookie被附加到下一个请求。
现在你需要在请求头中显式地设置cookie。

def start_requests(self):
    start_urls = ['https://www.lowes.com/search?searchTerm=8654RM-42']

    for url in start_urls:
        yield Request(url, headers={'Cookie': 'sn=2333;'}, meta={'dont_merge_cookies': True})

相关问题