【问题标题】:How to use selenium for webscraping google flights?如何使用硒进行网页抓取谷歌航班?
【发布时间】:2021-10-27 00:29:01
【问题描述】:

我正在尝试获取特定航班的航空公司名称和价格。我在使用 x.path 和/或使用正确的 html 标签时遇到问题,因为当我运行下面的代码时,我得到的只是 14 个空列表。

from selenium import webdriver
from lxml import html
from time import sleep

driver = webdriver.Chrome(r"C:\Users\14074\Python\chromedriver")
URL = 'https://www.google.com/travel/flights/searchtfs=CBwQAhopagwIAxIIL20vMHBseTASCjIwMjEtMTItMjNyDQgDEgkvbS8wMWYwOHIaKWoNCAMSCS9tLzAxZjA4chIKMjAyMS0xMi0yN3IMCAMSCC9tLzBwbHkwcAGCAQsI____________AUABSAGYAQE&tfu=EgYIAhAAGAA'

driver.get(URL)

sleep(1)

tree = html.fromstring(driver.page_source)

for flight_tree in tree.xpath('//div[@class="TQqf0e sSHqwe tPgKwe ogfYpf"]'):
     title = flight_tree.xpath('.//*[@id="yDmH0d"]/c-wiz[2]/div/div[2]/div/c-wiz/div/c-wiz/div[2]/div[2]/div/div[2]/div[6]/div/div[2]/div/div[1]/div/div[1]/div/div[2]/div[2]/div[2]/span/text()')
     price = flight_tree.xpath('.//span[contains(@data-gs, "CjR")]')

     print(title, price)
    
#driver.close()

这只是我的代码的第一部分,但如果不让它工作,我真的无法继续。如果有人对我做错了什么有一些想法,那就太棒了!这让我快疯了。谢谢!

【问题讨论】:

    标签: python selenium google-chrome selenium-webdriver web-scraping


    【解决方案1】:

    我注意到您的代码存在一些问题。首先,我相信当进入这个页面时,首先google会在向你显示页面内容之前显示“我同意条款和条件”弹出窗口,因此你需要先点击那个按钮。

    此外,您应该直接在驱动程序上使用 find_elements_by_xpath 函数,而不是使用页面内容,因为这也允许您呈现 javascript 内容。你可以在这里找到更多信息:python tree.xpath return empty list

    要了解有关如何使用 selenium 和 python 进行抓取的更多信息,您可以查看本指南:https://www.webscrapingapi.com/python-selenium-web-scraper/

    我使用以下代码来抓取标题。 (我还更改了 xpath,通过直接从谷歌浏览器中提取它们。您可以通过右键单击一个元素 -> 检查并在元素所在的元素选项卡中,您可以右键单击 -> 复制 ->复制xpath)

    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    
    # I used these for the code to work on my windows subsystem linux
    option = webdriver.ChromeOptions()
    option.add_argument('--no-sandbox') 
    option.add_argument('--disable-dev-sh-usage')
    
    driver = webdriver.Chrome(ChromeDriverManager().install(), options=option)
    URL = 'https://www.google.com/travel/flights/searchtfs=CBwQAhopagwIAxIIL20vMHBseTASCjIwMjEtMTItMjNyDQgDEgkvbS8wMWYwOHIaKWoNCAMSCS9tLzAxZjA4chIKMjAyMS0xMi0yN3IMCAMSCC9tLzBwbHkwcAGCAQsI____________AUABSAGYAQE&tfu=EgYIAhAAGAA'
    
    driver.get(URL)
    
    driver.find_element_by_xpath('//*[@id="yDmH0d"]/c-wiz/div/div/div/div[2]/div[1]/div[4]/form/div[1]/div/button/span').click() # this is necessary to pres the I agree button
    
    elements = driver.find_elements_by_xpath('//*[@id="yDmH0d"]/c-wiz[2]/div/div[2]/div/c-wiz/div/c-wiz/div[2]/div[3]/div[3]/c-wiz/div/div[2]/div[1]/div/div/ol/li')
    
    for flight_tree in elements:
         title = flight_tree.find_element_by_xpath('.//*[@class="W6bZuc YMlIz"]').text
    
         print(title)
    

    【讨论】:

      【解决方案2】:

      我尝试了下面的代码,屏幕最大化并有明确的等待,并且可以成功提取信息,请参见下文:

      示例代码:

      driver = webdriver.Chrome(driver_path)
      driver.maximize_window()
      driver.get("https://www.google.com/travel/flights/searchtfs=CBwQAhopagwIAxIIL20vMHBseTASCjIwMjEtMTItMjNyDQgDEgkvbS8wMWYwOHIaKWoNCAMSCS9tLzAxZjA4chIKMjAyMS0xMi0yN3IMCAMSCC9tLzBwbHkwcAGCAQsI____________AUABSAGYAQE&tfu=EgYIAhAAGAA")
      wait = WebDriverWait(driver, 10)
      titles = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div/descendant::h3")))
      
      for name in titles:
        print(name.text)
        price = name.find_element(By.XPATH, "./../following-sibling::div/descendant::span[2]").text
        print(price)
      

      进口:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

      输出:

      Tokyo
      ₹38,473
      Mumbai
      ₹3,515
      Dubai
      ₹15,846
      

      【讨论】:

      • 感谢您的回复,非常感谢!我试过了,它确实有效,但它只是从谷歌航班的主页上提取航班信息。代码如何像我在代码中那样查找特定航班的 URL?当我使用相应的 xpath 在该页面上尝试它时它不起作用。谢谢!
      • 你能给我那个新的网址吗?
      • 当然可以! google.com/travel/flights/… 也许我没有提取正确的 HTML 标签,但感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多