Scrapy不能刮一个网站

时间:2013-12-10 13:21:32

标签: python hyperlink scrapy scrape

我已经服用了几天,但我仍然找不到答案。 我正在使用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=

它不起作用。我检查了两个链接的源代码,它们是一样的。我真的不明白为什么它不起作用,这让我疯狂了一个星期。

提前谢谢你, 菲尔

2 个答案:

答案 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.comuk.hotels.com,而不是美国版http://www.hotels.com