2013-12-10 4 views
2

Я был на нем пару дней, но я все еще не могу найти ответ. Я использую scrapy (python), чтобы очистить this webpage.Scrapy не может царапать сайт

Here're мои каталоги:

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' 

Так что все это работает должным образом. Он делает то, что я хочу (все же мне нужно чистить места и прочее).

Но моя конечная цель - очистить американскую версию веб-сайта. Итак, я попытался заменить список с именем «start_urls», который у меня есть в hotel_spyder.py с этим: 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=

И он не работает. Я проверил исходный код обеих ссылок, и это то же самое. Я действительно не понимаю, почему это не работает, и это сводило меня с ума на неделю.

Спасибо заранее, Philippe

+0

Как это не работает? Какие ошибки вы получаете? –

+2

Он не может работать в данный момент, потому что запрос, который вы указываете в качестве ссылки, указывает дату прибытия до сегодняшнего дня, чтобы страница выдавала страницу с ошибкой. –

+0

Вы правы, это была более старая версия, и я редактировал свой вопрос. Тем не менее это не работает. Дело в том, что я не получаю никаких ошибок, но у меня тоже нет выхода. – l3aronsansgland

ответ

0

Я взял свой код и проверили, если это нормально. Наконец я понял, что ваша start_urls для английская версия должна отличаться.

Вы использовали URL-адрес, начинающийся с 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=']

0

На самом деле мне нужно, чтобы получить цены в долларах. И единственное место, где он доступен в долларах, по-видимому, находится на http://www.hotels.com/.

Запутанной часть является то, что он работает на http://fr.hotels.com или uk.hotels.com, но не на американской версии http://www.hotels.com

Смежные вопросы