我已经服用了几天,但我仍然找不到答案。 我正在使用scrapy(python)来抓取this webpage。
这是我的目录:
hotels/
|_ scrapy.cfg
|_ hotels/
|_ __init__.py
|_ items.py
|_ pipelines.py
|_ settings.py
|_ spiders/
|_ __init__.py
|_ hotels_spyder.py
items.py的内容
from scrapy.item import Item, Field
class HotelsItem(Item):
nameHotel = Field()
idHotel = Field()
hotels_spyder.py的内容
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from hotels.items import HotelsItem
class HotelsSpider(BaseSpider):
name = "hotels"
allowed_domains = ["hotels.com"]
start_urls = ["http://fr.hotels.com/search.do?destination=New+York&arrivalDate=13%2F04%2F2015&departureDate=15%2F04%2F2015&rooms=1&children%5B0%5D=2&searchParams.rooms%5B0%5D.numberOfAdults=2&searchParams.rooms%5B0%5D.childrenAges%5B0%5D=7&searchParams.rooms%5B0%5D.childrenAges%5B1%5D=7&searchParams.landmark=&searchParams.resolvedLocation=CITY%3A1506246%3AEXACT_RED%3AHIGH&destinationId="]
def parse(self, response):
sel = Selector(response)
sites = sel.xpath('//h3[@class="hotel-name"]')
items = []
for site in sites:
item = HotelsItem()
type(item)
item['nameHotel'] = site.xpath('a/text()').extract()
item['idHotel'] = site.xpath('a/@id').extract()
items.append(item)
return items
settings.py的内容
BOT_NAME = 'hotels'
SPIDER_MODULES = ['hotels.spiders']
NEWSPIDER_MODULE = 'hotels.spiders'
所以这一切都正常。它做我想要的(仍然需要清理空间和东西)。
但我的最终目标是刮掉美国版本的网站。 所以我试着将hotels_spyder.py中名为“start_urls”的列表替换为:http://www.hotels.com/search.do?destination=New+York&arrivalDate=03%2F18%2F15&departureDate=03%2F20%2F15&rooms=1&children[0]=2&searchParams.rooms[0].numberOfAdults=2&searchParams.rooms[0].childrenAges[0]=7&searchParams.rooms[0].childrenAges[1]=7&searchParams.landmark=&searchParams.resolvedLocation=CITY%3A1506246%3AEXACT_RED%3AHIGH&destinationId=
它不起作用。我检查了两个链接的源代码,它们是一样的。我真的不明白为什么它不起作用,这让我疯狂了一个星期。
提前谢谢你, 菲尔
答案 0 :(得分:0)
我拿了你的代码并检查它是否正常。最后我意识到你的start_urls
英文版本应该不同。
您使用了以 http://www.hotels.com ... 开头的网址。要获得该网站的英文版本,您需要正确的前缀。在法文版的抓取中,它是fr
。对于英文版,它是uk
。
尝试以下start_urls
。它适用于我的抓取工具:
start_urls = ['http://uk.hotels.com/search.do?destination=New+York&arrivalDate=13%2F04%2F2015&departureDate=15%2F04%2F2015&rooms=1&children[0]=2&searchParams.rooms[0].numberOfAdults=2&searchParams.rooms[0].childrenAges[0]=7&searchParams.rooms[0].childrenAges[1]=7&searchParams.landmark=&searchParams.resolvedLocation=CITY%3A1506246%3AEXACT_RED%3AHIGH&destinationId=']
答案 1 :(得分:0)
实际上我需要用美元来获得价格。唯一能以美元购买的地方显然是http://www.hotels.com/。
令人困惑的部分是它正在处理http://fr.hotels.com或uk.hotels.com,而不是美国版http://www.hotels.com