암스테르담에서 판매중인 데이터를 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를 '루프 오버'하고 싶습니다.나는 이것을 어떻게 설정할 수 있는지보고자합니다. 지금까지 나는 다음과 같은 코드를 작성했습니다 :
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
을 변수로 전달해야합니다.
'설정하는 방법'에 대한 설명이 있으십니까?
안녕 Granitosaurus이없는 한, 나는 모든 페이지 "p1"을 "p255"까지 긁어 내려고하고있다. 기본 페이지에는 링크가 일부만 있습니다 : "p1"에서 "p7"및 "p255". 다른 링크는 "다음"을 클릭 한 후에 만 표시됩니다. 따라서 메인 페이지의 링크 만 사용하여 모든 페이지를 긁을 수있는 방법을 모르겠습니다. –
@khpeek 귀하의 거미가 방문하는 모든 페이지에 '규칙'이 적용됩니다. 그래서 스파이더는 linkextractor의'allow' 속성이 허용하는 한 당신이 방문하는 모든 페이지에서 링크를 추출합니다. – Granitosaurus