我是Python,Scrapy和这个主板的新手,所以当我试图说明我的问题时,请耐心等待。
我的目标是在预订网站上收集柏林所有可用酒店的名称(以及可能的价格)特定日期(例如参见预定义的start_url),并在Scrapy的帮助下。
我认为关键部分是:
如果我跑" 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
答案 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。