如何使用 Python 中的 Selenium 从滚动添加 div 的网页中抓取数据?

How do I scrape data using Selenium in Python from a webpage that adds div on scroll?

我正在尝试从以下网页抓取数据:https://skiplagged.com/flights/YTO/DXB/2020-08-21

我要定位的元素如下:div[@class='infinite-trip-list']//div[@class='span1 trip-duration']

这是一个在用户滚动时动态添加元素的列表。我的目标是将这些元素存储在一个变量中以提取每次飞行的持续时间。到目前为止,我无法做到这一点,这是我在阅读有关此类问题的几篇 Whosebug 帖子后尝试过的方法。

mylist = []

last = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(1) #let the page load
    new = driver.execute_script("return document.body.scrollHeight")
    infinite_list = driver.find_elements_by_xpath("//div[@class='infinite-trip-list']//div[@class='span1 trip-duration']")
    for elem in infinite_list:
        if elem not in mylist:
            mylist.append(elem.text)
    if new == last: #if new height is equal to last height then we have reached the end of the page so end the while loop
        break
    last = new #changing last's value to new

这是将页面滚动到底部,结果我只看到最后 10 个值出现。 我无法编写一段可以滚动并仅添加正在添加的新 div(元素)的代码。

使用 Requets API 尝试以下方法,它快速、可靠且需要更少的代码即可获得所需的输出。我已经从网站上获取了 API URL 并根据搜索 GET 结果。

  1. 首先我创建了动态 URL。如果您看到下面的脚本,我已经声明了 6 个变量以在变量中创建 API URL,您可以传递您的搜索条件,例如从,到,出发日期,return 日期,不。成人或儿童。
  2. 创建 URL 请求方法后将 ping API URL 以获取数据并将该数据转换为 JSON.
  3. 最后,首先我要获取航班号以获取该航班号的详细信息,如价格、持续时间和航段(基本上是 HOP 详细信息,如航班号、不同机场的航空公司名称及其时间)。

You can fetch more details by using the below script right now it is fetching prices, flight number, hop details at airport, duration etc.

def scrap_flights_details():

from_source = 'YTO'
to_destination = 'DXB'
depart_date = '2020-08-21'
return_date = ''
counts_adults = 1
counts_children = ''

API_URL = 'https://skiplagged.com/api/search.php?from=' + str(from_source) + '&to=' + str(to_destination) + '&depart=' + str(depart_date) + '&'\
       'return=' + str(return_date) + '&format=v3&counts%5Badults%5D=' + str(counts_adults) + '&counts%5Bchildren%5D=' + str(counts_children)
print('URL created: ',API_URL)
flights_details = requests.get(API_URL,verify=False).json()

for flight_number in flights_details['itineraries']['outbound']:
    print('-' * 100)
    print('Flight Number : ',flight_number['flight'])
    print('Flight Price : ', flight_number['one_way_price'])
    number = flight_number['flight']
    print('Flight Details : ',flights_details['flights'][number])
    print('-' * 100) 

scrap_flights_details()