21

http://www.3andena.com/を破棄したいのですが、この Web サイトは最初はアラビア語で始まり、言語設定が Cookie に保存されます。URL ( http://www.3andena.com/home.php?sl=en )から言語バージョンに直接アクセスしようとすると、問題が発生し、サーバー エラーが返されます。

したがって、Cookie の値「store_language」を「en」に設定し、この Cookie の値を使用して Web サイトの破棄を開始します。

いくつかのルールで 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)
4

3 に答える 3

10

これは、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

スパイダーの属性のmake_requests_from_urlURL を使用したScrapy 呼び出し。start_urls上記のコードが行っていることは、デフォルトの実装にリクエストを作成させ、foo値を持つ Cookie を追加することですbar。(またはbar、すべての可能性に反してfoo、デフォルトの実装によって生成されたリクエストに既に Cookie が存在する場合は、Cookie を値に変更します。)

から作成されていないリクエストで何が起こるか疑問に思っている場合はstart_urls、Scrapy の Cookie ミドルウェアが上記のコードで設定された Cookie を記憶し、明示的に追加したリクエストと同じドメインを共有する将来のすべてのリクエストに設定することを付け加えておきます。あなたのクッキー。

于 2015-06-02T15:08:18.653 に答える
4

リクエストとレスポンスの Scrapy ドキュメントから直接。

このようなものが必要になります

request_with_cookies = Request(url="http://www.3andena.com", cookies={'store_language':'en'})
于 2012-05-19T17:13:43.073 に答える