2016-07-13 2 views
1

암스테르담에서 판매중인 데이터를 http://www.funda.nl/koop/amsterdam/에 수집하려고합니다. 메인 페이지는 집의 제한된 수를 나타내고, 하단이 보이는 페이저있다 : Scrapy에서 스크래핑 된 여러 start_urls를 반복하는 방법

enter image description here

는 ("Volgende"는 네덜란드에서 "다음"수단). 이것으로부터 총 255 페이지가 있다고 추론합니다. 각 페이지의 URL은 http://www.funda.nl/koop/amsterdam/p2/, http://www.funda.nl/koop/amsterdam/p3/ 등입니다. 모든 주택에 대한 데이터를 얻으려면 모든 서브 페이지 p1, p2, ..., p255를 '루프 오버'하고 싶습니다.

나는 이것을 어떻게 설정할 수 있는지보고자합니다. 지금까지 나는 다음과 같은 코드를 작성했습니다 :

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 

단순히 숫자 255은 내가 다음에 적용 할 수 있도록 다른 start_urls를 '합성'에이 번호를 사용하고 싶습니다 돌려 다시 get_max_page_number 호출 le2 linkextractor에, LinkExtractor le1, 각 페이지의 개별 주택 링크를 가져옵니다.

문제는 제가 이해하기에, scrapy이 요청을 비동기 적으로 처리하기 때문에 처음에는 숫자 255를 얻은 다음 그 번호를 사용하여 다른 요청을 생성 할 수는 없습니다. 그렇다면 두 개의 스파이더를 순서대로 사용하여 스크립트에서 호출해야하며 두 번째 스파이더에서는 start_url을 변수로 전달해야합니다.

'설정하는 방법'에 대한 설명이 있으십니까?

답변

0

여기에서 문제가 복잡해 지므로 최대 페이지를 알 필요가 없습니다.

Scrapy에는 URL을 dupefilter로 할 수 있으므로 linkextractor를 사용하여 매번 표시되는 모든 페이지를 추출 할 수 있으며 강제로 사용하지 않는 한 페이지를 방문하지 않아도됩니다.

그래서 당신이 여기에서 필요로하는 모든 LinkExtractors 두 개의 규칙입니다 : 모든 링크를 추출하고 parse_item의 콜백이 하나 눈에 보이는 모든 페이지를 추출하고 콜백 또는 follow=Truesee docs here

+0

안녕 Granitosaurus이없는 한, 나는 모든 페이지 "p1"을 "p255"까지 긁어 내려고하고있다. 기본 페이지에는 링크가 일부만 있습니다 : "p1"에서 "p7"및 "p255". 다른 링크는 "다음"을 클릭 한 후에 만 ​​표시됩니다. 따라서 메인 페이지의 링크 만 사용하여 모든 페이지를 긁을 수있는 방법을 모르겠습니다. –

+0

@khpeek 귀하의 거미가 방문하는 모든 페이지에 '규칙'이 적용됩니다. 그래서 스파이더는 linkextractor의'allow' 속성이 허용하는 한 당신이 방문하는 모든 페이지에서 링크를 추출합니다. – Granitosaurus

관련 문제