アムステルダムで販売するためのデータをhttp://www.funda.nl/koop/amsterdam/で収集しようとしています。メインページには、家の限られた数を示しており、一番下に次のようになりますポケベルがあります:Scrapyで、それ自体がスクレイプされたいくつかのstart_urlsをループする方法
(「Volgendeは」オランダ語で「次へ」を意味)が。これから私は合計255ページあると推測します。これらの各ページにはURL http://www.funda.nl/koop/amsterdam/p2/,http://www.funda.nl/koop/amsterdam/p3/などがあります。すべての家のデータを取得するには、すべてのサブページp1、p2、...、p255を 'ループオーバー'したいと思います。
私は「セットアップする」方法を見ています。単に私は、その後に適用するために異なるstart_urls
「を合成する」に、この番号を使用したい番号255を返すバックget_max_page_number
を呼び出しle2
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from Funda.items import FundaItem
# from scrapy.shell import inspect_response
class FundaSpider(CrawlSpider):
name = "Funda"
allowed_domains = ["funda.nl"]
start_urls = ["http://www.funda.nl/koop/amsterdam/"]
le1 = LinkExtractor(allow=r'%s+huis-\d{8}' % start_urls[0]) # Link to the page of an individual house, such as http://www.funda.nl/koop/amsterdam/huis-49805292-nieuwendammerdijk-21/
le2 = LinkExtractor(allow=r'%s+p\d+' % start_urls[0]) # Link to a page containing thumbnails of several houses, such as http://www.funda.nl/koop/amsterdam/p10/
rules = (
Rule(le1, callback='parse_item'),
Rule(le2, callback='get_max_page_number')
)
def parse_item(self, response):
links = self.le1.extract_links(response)
for link in links:
if link.url.count('/') == 6 and link.url.endswith('/'):
item = FundaItem()
item['url'] = link.url
yield item
def get_max_page_number(self, response):
links = self.le2.extract_links(response)
max_page_number = 0
for link in links:
if link.url.count('/') == 6 and link.url.endswith('/'):
page_number = int(link.url.split("/")[-2].strip('p'))
if page_number > max_page_number:
max_page_number = page_number
return max_page_number
LinkExtractor、:今まで私は、次のコードを書いていますLinkExtractor le1
は、各ページの個々の住宅へのリンクを取得します。
scrapy
はこれらの要求を非同期的に処理するので、最初に番号255を取得してからその番号を使用して他の要求を生成することはできません。そうであれば、2つのスパイダーを順番に使用してスクリプトから呼び出す必要があり、2番目のスパイダーではstart_url
を変数として渡す必要があります。
「これを設定する」方法の指針はありますか?
こんにちはGranitosaurusを持っていないものを持っている一つ、私はすべてのページ "p1"を "p255"まで削り取ろうとしています。メインページにはリンクがいくつか含まれています: "p1"から "p7"と "p255"。他のリンクは「次へ」をクリックすると表示されます。だから私はどのように私はメインページ上のリンクのみを使用してすべてのページをこすって見ることができないのですか? –
@khpeekあなたのスパイダーが訪れるすべてのページにあなたの 'rules'が適用されます。したがって、あなたのlinkextractorの 'allow'属性が許可する限り、スパイダーはアクセスするすべてのページからリンクを抽出します。 – Granitosaurus