首页 > 解决方案 > Scrapy:维护重定向的位置 cookie

问题描述

代码:

# -*- 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)']

此网址会将我重定向到此链接:https ://www.lowes.com/pd/ZLINE-KITCHEN-BATH-Ducted-Red-Matte-Wall-Mounted-Range-Hood-Common-42-Inch-Actual-42 -in/1001440644

这是由scrapy处理的

现在的问题

当我有:

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'}以使我的程序按预期工作。

标签: pythonscrapyrequest

解决方案


问题

这里的主要问题是您的一些 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用于此目的。您需要在请求元中设置此设置,以防止将先前请求的 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})

希望能帮助到你。


推荐阅读