2015-10-04 2 views
2

Я хочу пополнять авиабилеты с British Airways и хранить их в монгоббе. Я могу пройти мимо формы поиска, но я не могу очистить данные.Python, Selenium и Scrapy не работают вместе?

Мой паук:

from scrapy import Spider 
from scrapy.selector import Selector 
from scrapy.http import FormRequest 
from selenium import webdriver 
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.support.ui import WebDriverWait 
import time 
from flight.items import FlightItem 

class BASpider(Spider): 
name = "BA" 
allowed_domains = ["britishairways.com"] 
start_urls = [ 
    "http://www.britishairways.com/travel/home/public/en_za?DM1_Channel=PPC&DM1_Mkt=ZA&DM1_Campaign=APMEA_ZA_EN_PUREBRAND_MASTERBRAND&Brand=Y&gclid=CLvt24zsqMgCFUGg2wodds4Prw", 
] 

def __init__(self): 
    self.driver = webdriver.Firefox() 

def parse(self, response): 
    self.driver.get(response.url) 
    WebDriverWait(self.driver, 10).until(lambda s: s.find_element_by_xpath('//select[@id="depCountry"]').is_displayed()) 

    departCountry_form = self.driver.find_element_by_id('depCountry') 
    departCity_form = self.driver.find_element_by_id('from') 
    oneWay = self.driver.find_element_by_id('journeyTypeOW') 
    oneWay.click() 
    dest_form = self.driver.find_element_by_id('planTripFlightDestination') 
    date_form = self.driver.find_element_by_id('depDate') 
    butt = self.driver.find_element_by_class_name('button') 
    departCountry_form.send_keys("South Africa") 
    departCity_form.send_keys("Johannesburg") 
    dest_form.send_keys("London") 
    date_form.clear() 
    date_form.send_keys("05/10/15") 

    actions = ActionChains(self.driver) 
    actions.click(butt) 
    actions.perform() 
    time.sleep(35) 



def parse_post(self, response): 
    flightList = Selector(response).xpath('//table[@class="flightList directFlightsTable connectflights"]/tbody/tr') 

    for flight in flightList: 
     item = FlightItem() 
     item['dTime'] = flight.xpath(
      'td[7]/table/tbody/tr/td[@class=" departure"]/div/div/span[1]/text()').extract()[0] 
     item['aTime'] = flight.xpath(
      'td[7]/table/tbody/tr/td[@class=" arrival"]/span[1]/text()').extract()[0] 
     item['flightNr'] = flight.xpath(
      'td[7]/table/tbody/tr/td[@class=" operator"]/div/div/span[2]/href').extract()[0] 
     item['price_economy'] = flight.xpath(
      'td[7]/table/tbody/tr/td[@class=" priceselecter price-M ch3 col1"]/span/span[2]/label/text()').extract()[0] 
     item['price_premium'] = flight.xpath(
      'td[7]/table/tbody/tr/td[@class=" priceselecter price-W ch3 col2"]/span/span[2]/label/text()').extract()[0] 
     item['price_business'] = flight.xpath(
      'td[7]/table/tbody/tr/td[@class=" priceselecter price-C ch3 col3"]/span/span[2]/label/text()').extract()[0] 
     yield item 

    self.driver.close() 

Я не получаю какие-либо ошибки, это просто не очищая.

+0

Я получил некоторые пауки с использованием селена тоже, так что они работают, может быть, вы что-то не хватает, не могли бы вы поделиться журналы и убедитесь, что вы получаете информацию о каждом xpath? Где ваш код вызывает 'parse_post'? – eLRuLL

+0

Я не проверял ваш код, но как ответ на ваш вопрос «Python, Selenium и Scrapy не работают вместе?», Я могу сказать вам, что вы можете использовать Scrapy with Selenium точно. Вы можете использовать эту комбинацию, когда ваш целевой сайт включает в себя некоторое взаимодействие ajax, которое необходимо захватить через взаимодействие с браузером. Вы можете найти пример здесь: http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python/ – narko

ответ

0

Причина, по которой вы ничего не получаете, заключается в том, что метод parse_post() никогда не называется.


Вы могли бы на самом деле экземпляр Selector из-за self.driver.page_source непосредственно внутри parse() обратного вызова:

selector = Selector(text=self.driver.page_source) 
flightList = selector.xpath('//table[@class="flightList directFlightsTable connectflights"]/tbody/tr') 

for flight in flightList: 
    # ... 
+0

Где именно я должен называть parse_post()? К сожалению, я очень новичок в этом – Jaco

+0

@Jaco в порядке, обновил ответ. Обратите внимание, что вам, вероятно, следует избегать вызова 'time.sleep()' внутри и использовать явное ожидание через webdriverwait - ну, в любом случае, это совсем другая история. Надеюсь, это поможет. – alecxe

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