Как перезаписывать/использовать куки в scrapy

Я хочу отменить http://www.3andena.com/, этот веб-сайт начинается сначала на арабском языке, и он сохраняет настройки языка в файлах cookie. Если вы попытались получить доступ к языковой версии напрямую через URL-адрес (http://www.3andena.com/home.php?sl=en), это создает проблему и возвращает ошибку сервера.

Итак, я хочу установить значение cookie "store_language" на "en", а затем начать обрывать сайт с использованием этих значений cookie.

Я использую CrawlSpider с несколькими Правилами.

здесь код

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy import log
from bkam.items import Product
from scrapy.http import Request
import re

class AndenaSpider(CrawlSpider):
  name = "andena"
  domain_name = "3andena.com"
  start_urls = ["http://www.3andena.com/Kettles/?objects_per_page=10"]

  product_urls = []

  rules = (
     # The following rule is for pagination
     Rule(SgmlLinkExtractor(allow=(r'\?page=\d+$'),), follow=True),
     # The following rule is for produt details
     Rule(SgmlLinkExtractor(restrict_xpaths=('//div[contains(@class, "products-dialog")]//table//tr[contains(@class, "product-name-row")]/td'), unique=True), callback='parse_product', follow=True),
     )

  def start_requests(self):
    yield Request('http://3andena.com/home.php?sl=en', cookies={'store_language':'en'})

    for url in self.start_urls:
        yield Request(url, callback=self.parse_category)


  def parse_category(self, response):
    hxs = HtmlXPathSelector(response)

    self.product_urls.extend(hxs.select('//td[contains(@class, "product-cell")]/a/@href').extract())

    for product in self.product_urls:
        yield Request(product, callback=self.parse_product)  


  def parse_product(self, response):
    hxs = HtmlXPathSelector(response)
    items = []
    item = Product()

    '''
    some parsing
    '''

    items.append(item)
    return items

SPIDER = AndenaSpider()

Здесь журнал:

2012-05-30 19:27:13+0000 [andena] DEBUG: Redirecting (301) to <GET http://www.3andena.com/home.php?sl=en&xid_479d9=97656c0c5837f87b8c479be7c6621098> from <GET http://3andena.com/home.php?sl=en>
2012-05-30 19:27:14+0000 [andena] DEBUG: Redirecting (302) to <GET http://www.3andena.com/home.php?sl=en&xid_479d9=97656c0c5837f87b8c479be7c6621098> from <GET http://www.3andena.com/home.php?sl=en&xid_479d9=97656c0c5837f87b8c479be7c6621098>
2012-05-30 19:27:14+0000 [andena] DEBUG: Crawled (200) <GET http://www.3andena.com/Kettles/?objects_per_page=10> (referer: None)
2012-05-30 19:27:15+0000 [andena] DEBUG: Crawled (200) <GET http://www.3andena.com/B-and-D-Concealed-coil-pan-kettle-JC-62.html> (referer: http://www.3andena.com/Kettles/?objects_per_page=10)

Ответ 1

измените свои коды, как показано ниже:

def start_requests(self):
    for url in self.start_urls:
        yield Request(url, cookies={'store_language':'en'}, callback=self.parse_category)

Объект Scrapy.Request принимает необязательный <ключевой аргумент cookies, см. здесь документацию

Ответ 2

Вот как я это делаю с Scrapy 0.24.6:

from scrapy.contrib.spiders import CrawlSpider, Rule

class MySpider(CrawlSpider):

    ...

    def make_requests_from_url(self, url):
        request = super(MySpider, self).make_requests_from_url(url)
        request.cookies['foo'] = 'bar'
        return request

Scrapy вызывает make_requests_from_url с URL-адресами в атрибуте start_urls паука. Что делает вышеприведенный код, это позволить реализации по умолчанию создать запрос, а затем добавить foo cookie с значением bar. (Или изменив файл cookie на значение bar, если это произойдет, несмотря на все шансы, что в запросе, создаваемом реализацией по умолчанию, уже есть cookie foo.)

Если вы задаетесь вопросом, что происходит с запросами, которые не созданы из start_urls, позвольте мне добавить, что промежуточное программное обеспечение Scrapy cookie будет помнить набор файлов cookie с приведенным выше кодом и установить его для всех будущих запросов, которые используют тот же домен, что и запрос, по которому вы явно добавили свой файл cookie.