2016-06-16 1 views
3

저는 제 문제를 설명하기 위해 파이썬, 스커션 및 게시판을 처음 사용합니다.크롤링 된 페이지는 있지만 0 개의 항목을 스크랩했습니다.

내 목표는 베를린의 베를린에있는 특정 날짜 (예 : 미리 정의 된 start_url 참조)의 예약 가능한 호텔 이름 (및 가격)을 Scrapy를 통해 수집하는 것입니다.

나는 중요한 부분이 생각 :

  1. 내가 끝날 때까지 다음의 모든 페이지를 쪽수를 매기다 싶어요.
  2. 각 페이지마다 모든 호텔의 이름을 수집하고 이름을 각각 저장해야합니다.

내가 실행하면는 "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 

답변

-1

나는 문제가이 선에 XPath있을 수 있습니다 생각 :

//div[contains(@class, 'sr_item_content') and contains(@class, 'sr_item_content_slider_wrapper')] : 당신의 라인을 따라 더 뭔가를 정의해야 것 같습니다 this SO question에서

hotels = s.xpath('//div[@class="sr_item_content sr_item_content_slider_wrapper"]')

더 디버깅 할 수 있도록 t 그는 index_pages의 내용을 먼저보고 그 수준에서 기대하는 것을 반환하는지 확인하십시오.

또한 Xpath 빌드에 도움이되는 Xpath Visualiser (질문에서 언급 함)을 확인하십시오.

+1

감사합니다. "hotel = s.xpath ('// div [contains (@class,"sr_item_new ")]") "이제 각 호텔 블록을 소개하므로"hotels = s.xpath 터미널이 크롤링 된 각 페이지에 대해 더 많은 정보를 보여 주지만 크롤링 된 각 페이지에 대해 "IndexError : 목록 색인이 범위를 벗어남"을 반환합니다. 아이디어가 있습니까? Btw, XPath Visualizer를 사용해 보았습니다. 예약 XML을 처리 할 수없는 것 같습니다. 몇 번이라도 충돌이 발생하기 때문입니다. –

+0

@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

+0

예, 예를 들었습니다. 'item ['title '] = hotel.xpath ('div [2 ]/div [1]/div [1]/h3/a/span/text() '). 추출() [0]'. 그래도 작동하지 않습니다. 기본적으로 나는 긁는 문제가 있지만 크롤링 된 각 페이지에서 오류가있는 0 개의 항목을 수집합니다. 내 실수는 무엇입니까? 호텔 경로를 기반으로 나머지 요소 인 XPath를 요소에 사용합니다. 고맙습니다. –

관련 문제