编码:
# -*- 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'}
,使我的程序按预期工作。
1条答案
按热度按时间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。