저는 제 문제를 설명하기 위해 파이썬, 스커션 및 게시판을 처음 사용합니다.크롤링 된 페이지는 있지만 0 개의 항목을 스크랩했습니다.
내 목표는 베를린의 베를린에있는 특정 날짜 (예 : 미리 정의 된 start_url 참조)의 예약 가능한 호텔 이름 (및 가격)을 Scrapy를 통해 수집하는 것입니다.
나는 중요한 부분이 생각 :- 내가 끝날 때까지 다음의 모든 페이지를 쪽수를 매기다 싶어요.
- 각 페이지마다 모든 호텔의 이름을 수집하고 이름을 각각 저장해야합니다.
내가 실행하면는 "scrapy runspider bookingspider.py -o items.csv -t CSV"아래에있는 내 코드, 단말기는 사용 가능한 모든 페이지를 크롤 저를 보여 주지만, 결국 난 단지 빈을 얻을 items.csv.
단계 1은 후속 URL이 크롤링 중임을 보여주기 때문에 (예 : [...] offset = 15, [...] offset = 30) 1 단계가 작동합니다. 따라서 제 문제는 2 단계라고 생각합니다. 2 단계에서 각 호텔 정보가 별도로 포함되어 루프의 기초가 될 수있는 컨테이너 나 블록을 정의해야합니다. "div class ="sr_item_content sr_item_content_slider_wrapper ""모든 호텔 블록은이 요소가 상위 레벨에 있으므로이 부분을 확실히 알지 못합니다. 어쩌면 하나는 더 높은 레벨 인 을 고려해야 만합니다 (그러나 호텔 블록에서 동일하지 않으므로 어떤 요소를 사용해야합니까?). 어쨌든 호텔 이름이 들어있는 요소에 대해 나머지 XPath를 알아 냈습니다.
비슷한 설정 (다른 웹 사이트는 있지만)으로 2 개의 튜토리얼을 따라했지만 어떻게 든 여기서는 작동하지 않습니다.
어쩌면 당신은 모든 도움이 대단히 감사하게 생각할 수 있습니다. 고맙습니다!
from scrapy.spiders import CrawlSpider
from scrapy.selector import Selector
from scrapy.item import Item, Field
from scrapy.http.request import Request
class HotelItem(Item):
title = Field()
price = Field()
class BookingCrawler(CrawlSpider):
name = 'booking_crawler'
allowed_domains = ['booking.com']
start_urls = ['http://www.booking.com/searchresults.html?checkin_monthday=25;checkin_year_month=2016-10;checkout_monthday=26;checkout_year_month=2016-10;class_interval=1;dest_id=-1746443;dest_type=city;offset=0;sb_travel_purpose=leisure;si=ai%2Cco%2Cci%2Cre%2Cdi;src=index;ss=Berlin']
custom_settings = {
'BOT_NAME': 'booking-scraper',
}
def parse(self, response):
s = Selector(response)
index_pages = s.xpath('//div[@class="results-paging"]/a/@href').extract()
if index_pages:
for page in index_pages:
yield Request(response.urljoin(page), self.parse)
hotels = s.xpath('//div[@class="sr_item_content sr_item_content_slider_wrapper"]')
items = []
for hotel in hotels:
item = HotelItem()
item['title'] = hotel.xpath('div[1]/div[1]/h3/a/span/text()').extract()[0]
item['price'] = hotel.xpath('//div[@class="sr-prc--num sr-prc--final"]/text()').extract()[0]
items.append(item)
for item in items:
yield item
감사합니다. "hotel = s.xpath ('// div [contains (@class,"sr_item_new ")]") "이제 각 호텔 블록을 소개하므로"hotels = s.xpath 터미널이 크롤링 된 각 페이지에 대해 더 많은 정보를 보여 주지만 크롤링 된 각 페이지에 대해 "IndexError : 목록 색인이 범위를 벗어남"을 반환합니다. 아이디어가 있습니까? Btw, XPath Visualizer를 사용해 보았습니다. 예약 XML을 처리 할 수없는 것 같습니다. 몇 번이라도 충돌이 발생하기 때문입니다. –
@MaikDrop 걱정할 필요가 없습니다! 아마도'item [ 'title'] = hotel.xpath ('div [1]/div [1]/h3/a/span/text()'라는 줄에있는 배열 일 것입니다.[가격]] = hotel.xpath ('// div [@ class = "sr-prc-num sr-prc-final"]/text()') 추출() [0] ) [0]'이 (가) 비어 있습니다. 이 줄의 코드도 업데이트 했습니까? 이 게시물이 문제를 해결했다면 답으로 표시해야합니다. 그러면 다음 호에 대한 새로운 질문을 만들 수 있습니다. – Bassie
예, 예를 들었습니다. 'item ['title '] = hotel.xpath ('div [2 ]/div [1]/div [1]/h3/a/span/text() '). 추출() [0]'. 그래도 작동하지 않습니다. 기본적으로 나는 긁는 문제가 있지만 크롤링 된 각 페이지에서 오류가있는 0 개의 항목을 수집합니다. 내 실수는 무엇입니까? 호텔 경로를 기반으로 나머지 요소 인 XPath를 요소에 사용합니다. 고맙습니다. –