2016-12-29 21 views
0

私はScrapyとPythonの初心者です。 URLへScrollのルールからのURLリストのパラメータを使った繰り返しのクロール

  1. アクセスやURLの一部として「ショップ/製品を」含むすべてのリンクを取得:私は、次の操作を実行します。見てのようにリンク: "http://www.example.com/shop/products/category-name"

  2. はstart_urlsのURLをスクラップし、合計製品の数を取得し、TOTAL。コードTOTAL = num_items_per_category。終わり

  3. 、追加"?ソート=トップ&サイズ= 12 &開始= PARAM" URLへ。 PARAM < = TOTALの場合にのみ、各反復でPARAMを12ずつインクリメントする必要があります。最終的なURLは "http://www.example.com/shop/products/category-name?sort=Top&size=12&start=PARAM"

  4. から生成されたstart_urlsから別のURLを取得し、再度手順2を開始します。ここで


私のクモのコードは次のとおりです。

import scrapy 
import re 
import datetime 

from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor 
from scrapy.http.request import Request 

class MySpider(CrawlSpider): 
    name = 'my_spider' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://www.example.com/shop/products'] 
    rules = (
     Rule(LxmlLinkExtractor(
      restrict_xpaths=('.//li[@class="item"]/a')), 
      follow=False, 
      callback='parse_list' 
     ), 
    ) 

    def parse_list(self, response): 
     SET_SELECTOR = '.product' 
     for item in response.css(ITEM_SELECTOR): 
      NAME_SELECTOR = 'div[@class="product"]/h2/a/@title' 
      yield { 
       'name': item.xpath(NAME_SELECTOR).extract_first() 
      } 

     NUM_ITEMS_PER_CATEGORY_SELECTOR = 'div[@id="search"]/@data-count' 
     num_items_per_category = item.xpath(NUM_ITEMS_PER_CATEGORY_SELECTOR).extract_first() 
     nipc = int(0 if num_items_per_category is None else num_items_per_category) 
     try: 
      next_start = response.meta["next_start"] 
     except KeyError: 
      next_start = 0 
     if next_start <= nipc: 
      yield scrapy.Request(
       response.urljoin('%s?sort=Top&size=12&start=%s' % (response.url, next_start)), 
       meta={"next_start": next_start + 12}, 
       dont_filter=True, 
       callback = self.parse_list 
      ) 

問題点は以下のとおりです。

  1. それがどのCSSセレクタや正規表現が存在する場合、私は知りません私が望むすべてのリンクを選択するためにルールを使用します。コードでは、私が望むリンクがいくつかあることを知っているパスにアクセスしていますが、ページにはまだ多くがあります。

  2. コードが期待通りに機能していません。 next_startは各繰り返しで12ずつ増加していないようです。このコードは、生成されたstart_urlsリストの各URLの最初の12要素だけを取得しています。 メタの変数を正しく使用していますか?または、私はそれを反復するために使用する前にTOTALの数を取得するために、各カテゴリのページの別の最初のスクラップが必要な場合がありますか?または別のアプローチを使用する必要がありますstart_requests ...あなたはどう思いますか?あなたのクモが正確に何

答えて

0

は、URL http://www.example.com/shop/productsは、<li class="item">要素内のすべてのリンクを抽出し、parse_listコールバックを使用して、それらのすべてをフェッチの訪問です。私はそれがあなたが待っている振る舞いではないことを見ています - 代わりに、ルール内にallow=r"shop/products"という種のURLとExtractorを含むいくつかの開始URLを使用する必要があります。

また、この部分'%s?sort=Top&size=12&start=%s' % (response.url, next_start)は、response.urlにGETパラメータを含む完全なURLが含まれているため、間違っています。したがって、このパラメータを持つパラメータを既存のパラメータ文字列に追加するたびに、?sort=Top&size=12&start=0?sort=Top&size=12&start=12?sort=Top&size=12&start=24のようになります。新しい文字列を追加する前にURLからパラメータを削除するか、パラメータを渡すより便利な方法としてFormRequestを使用してください。

ところで、Scrapyには、scrapy.shell.inspect_responseを使用してスパイダーの任意の部分から呼び出すことができるデバッグ用の非常に便利な対話型コンソールがあります。

+0

ありがとう、mizhgun!それはまさに何が起こっているのです!私はそのようなことをテストするためにdebbugerと遊びます。 – ArtStack

関連する問題