python - 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'}
以使我的程序按预期工作。
解决方案
问题
这里的主要问题是您的一些 cookie 是由第一个请求设置的
在重定向之后结转到请求,即
这些 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})
希望能帮助到你。
推荐阅读
- mysql - 在mysql中向另一个用户隐藏一个用户的数据库
- python - 按 ID 获取 Discord 角色
- python - Django 提交表单并保留搜索结果
- javascript - 如果为元素或父母设置了onClick事件
- windows - 在 Windows 主机上的 VMware 中运行 VM 时出现的问题
- r - rlang:从可变字符输入创建空列表
- ruby - 编写一个带有线程支持的简单断路器
- scala - Scala - 如何以功能方式循环列表
- c# - 重载 == 运算符抛出带有非空操作数的 NullReferenceException
- arrays - 如何拥有一个作为数组的实例变量