2012-05-19 13 views
11

Chcę zrzucić http://www.3andena.com/, ta strona zaczyna się najpierw w języku arabskim, i przechowuje ustawienia językowe w ciasteczkach. Jeśli próbujesz uzyskać dostęp do wersji językowej bezpośrednio przez adres URL(), spowoduje to problem i zwróci błąd serwera.jak nadpisywać/używać ciasteczek w scrapy

Tak więc chcę ustawić wartość cookie "store_language" na "en", a następnie rozpocząć skasowanie witryny przy użyciu tych wartości cookie.

Używam CrawlSpider z kilkoma regułami.

oto kod

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() 

oto log:

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) 

Odpowiedz

2

Prosto z Scrapy documentation for Requests and Responses.

Musisz coś takiego

request_with_cookies = Request(url="http://www.3andena.com", cookies={'store_language':'en'}) 
+1

Próbowałem już przed opublikowaniem mojego pytania, ale to nie działa –

+0

Czy mógłbyś podać swój kod źródłowy? – VenkatH

+0

Właśnie dodałem to –

6

zmodyfikować dorsza es jak poniżej:

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

Scrapy.Request obiekt akceptuje opcjonalny argument cookies słów kluczowych, see documentation here

6

To jak to zrobić, jak z 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 wzywa make_requests_from_url z adresy URL w atrybucie pająka w atrybucie start_urls. Sposób działania powyższego kodu polega na tym, że domyślna implementacja tworzy żądanie, a następnie dodaje plik cookie o wartości. (Lub zmiana cookie do wartości bar jeśli tak się stanie, na przekór wszystkiemu, że istnieje już foo cookie na wniosek produkowanego przez wdrożenie domyślnej.)

W przypadku, gdy zastanawiasz się, co dzieje się z wnioskami, które są nie utworzone z , dodam, że oprogramowanie pośrednie ciasteczek Scrapy zapamięta zestaw plików cookie z powyższym kodem i ustawi go na wszystkich przyszłych żądaniach, które mają tę samą domenę co żądanie, do którego wyraźnie dodano plik cookie.