私はScrapyとPythonの初心者です。 URLへScrollのルールからのURLリストのパラメータを使った繰り返しのクロール
アクセスやURLの一部として「ショップ/製品を」含むすべてのリンクを取得:私は、次の操作を実行します。見てのようにリンク: "http://www.example.com/shop/products/category-name"
はstart_urlsのURLをスクラップし、合計製品の数を取得し、TOTAL。コードTOTAL = num_items_per_category。終わり
- 、追加"?ソート=トップ&サイズ= 12 &開始= PARAM" URLへ。 PARAM < = TOTALの場合にのみ、各反復でPARAMを12ずつインクリメントする必要があります。最終的なURLは "http://www.example.com/shop/products/category-name?sort=Top&size=12&start=PARAM"
から生成された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
)
問題点は以下のとおりです。
それがどのCSSセレクタや正規表現が存在する場合、私は知りません私が望むすべてのリンクを選択するためにルールを使用します。コードでは、私が望むリンクがいくつかあることを知っているパスにアクセスしていますが、ページにはまだ多くがあります。
コードが期待通りに機能していません。 next_startは各繰り返しで12ずつ増加していないようです。このコードは、生成されたstart_urlsリストの各URLの最初の12要素だけを取得しています。 メタの変数を正しく使用していますか?または、私はそれを反復するために使用する前にTOTALの数を取得するために、各カテゴリのページの別の最初のスクラップが必要な場合がありますか?または別のアプローチを使用する必要がありますstart_requests ...あなたはどう思いますか?あなたのクモが正確に何
ありがとう、mizhgun!それはまさに何が起こっているのです!私はそのようなことをテストするためにdebbugerと遊びます。 – ArtStack