Scrapy: сохранить местоположение повара ie для перенаправлений - PullRequest
0 голосов
/ 14 апреля 2020

Код:

# -*- 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

Это обрабатывается scrapy

Теперь проблема

Когда у меня есть:

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

Я получаю SKU, но не цену.

Однако, когда я использую фактический URL в start_urls

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.

Вот мое предположение: мне пришлось предварительно установить местоположение повара ie, потому что веб-сайт Lowes не позволяет вам увидеть цену, если пользователь не предоставит им почтовый индекс / местоположение. поэтому я предполагаю, что мне придется переместить или настроить cookies={'sn':'2333'}, чтобы моя программа работала так, как ожидалось.

1 Ответ

1 голос
/ 17 апреля 2020

Проблема

Основная проблема заключается в том, что некоторые из ваших файлов 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, установленные you.

Решение

Вам необходимо отправлять явные cookie-файлы для каждого запроса и предотвращать добавление предыдущих cookie-файлов в следующий запрос.

В scrapy существует настройка, которая называется dont_merge_cookies, который используется для этой цели. Вам необходимо установить этот параметр в мета-запросе, чтобы файлы 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})

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...