Scrapy抓取了网页,但抓取了0项

时间:2016-06-16 18:09:33

标签: python web-scraping scrapy web-crawler

我是Python,Scrapy和这个主板的新手,所以当我试图说明我的问题时,请耐心等待。

我的目标是在预订网站上收集柏林所有可用酒店的名称(以及可能的价格)特定日期(例如参见预定义的start_url),并在Scrapy的帮助下。

我认为关键部分是:

  1. 我希望将所有下一页分页到最后。
  2. 在每个页面上,我想收集每家酒店的名称,并分别保存名称。
  3. 如果我跑" scrapy runspider bookingspider.py -o items.csv -t csv"对于我的下面的代码,终端显示它爬过所有可用的页面,但最后我只得到一个空的items.csv。

    步骤1似乎有效,因为终端显示后续网址正在被抓取(例如[...]偏移= 15,然后[...]偏移= 30)。因此,我认为我的问题是第2步。 对于第2步,需要定义一个容器或块,其中每个酒店信息单独包含,并可作为循环的基础,对吧? 我选择了" div class =" sr_item_content sr_item_content_slider_wrapper"",因为每个酒店街区都有这个元素处于上级,但我真的不确定这个部分。也许人们必须考虑更高的水平 (但我应该选择哪个元素,因为它们在整个酒店街区都不一样?)。 无论如何,基于此我找出了包含酒店名称的元素的剩余XPath。

    我遵循了两个类似设置的教程(虽然不同的网站),但不知怎的,它在这里不起作用。

    也许你有一个想法,非常感谢每一个帮助。谢谢!

    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 个答案:

答案 0 :(得分:-1)

我认为问题可能出在您的XPath这一行:

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

this SO question来看,您需要更多地定义更多内容:

//div[contains(@class, 'sr_item_content') and contains(@class, 'sr_item_content_slider_wrapper')]

为了帮助您进一步调试,您可以先尝试输出index_pages的内容,看看它是否肯定会返回您在该级别上所期望的内容。

另外,请检查Xpath Visualiser(也在问题中提到),这有助于构建Xpath。