selenium BeautifulSoup对象看起来与我在Chrome中看到的完全不同

yhived7q  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(112)

我在我的第一次尝试刮基于React的动态网站-Booking.com搜索结果页。我想收集特定酒店在相同条件下的当前价格。这个网站是很容易刮数据与简单的CSS选择器之前,但现在他们改变了如何编码和每个元素,我想要的是用“data-testid”属性和一系列未知的随机数来描述,就我在chromedev工具中看到的。现在我之前写的代码不起作用了,我需要重写。

昨天,我从另一个问题中得到了一个智慧,在这个例子中,我在Chrome开发工具中看到的内容与Soup对象的HTML内容不同。所以我尝试预先打印整个Soup对象来检查实际的CSS,然后使用这些CSS类选择元素。我还确保使用selenium来捕获js-illusted日期。
一开始看起来不错,但是返回的soup对象与我看到的完全不同。例如,the request URL应该返回一个位于列表顶部的名为“cup of tea ensemble”的酒店,其价格为4个成人在2022-12-22住一晚,如其在url参数中指定的那样,但是当查看soup对象时,酒店没有排在第一位,我在url中添加的大多数参数都被忽略了。
这通常会发生在试图刮取基于React的网站吗?如果是,我如何避免这种情况来收集数据,因为我在Web浏览器中看到?
我不确定这是否有帮助,但我附上了我使用的当前代码。感谢您的阅读,我感谢任何建议!

from bs4 import BeautifulSoup
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

booking_url = 'https://www.booking.com/searchresults.ja.html?lang=ja&ss=Takayama&dest_id=6411914&dest_type=hotel&checkin=2022-12-22&checkout=2022-12-23&group_adults=4&no_rooms=1&group_children=0&sb_travel_purpose=leisure'
#booking_url = 'https://www.google.co.jp/'

options = Options()
options.add_argument('--headless')

driver = webdriver.Chrome(executable_path='./chromedriver', chrome_options=options)
driver.get(booking_url)
html = driver.page_source.encode('utf-8')

soup = BeautifulSoup(html, 'html.parser')
print(soup)
xbp102n0

xbp102n01#

下面的代码生成的输出与浏览器显示的输出完全相同

import time
from bs4 import BeautifulSoup
import pandas as pd
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from selenium.webdriver.common.by import By

webdriver_service = Service("./chromedriver") #Your chromedriver path
driver = webdriver.Chrome(service=webdriver_service)

driver.get('https://www.booking.com/searchresults.ja.html?label=gen173nr-1FCAQoggJCDWhvdGVsXzY0MTE5MTRIFVgEaFCIAQGYARW4ARfIAQzYAQHoAQH4AQOIAgGoAgO4AuiOk5wGwAIB0gIkZjkzMzFmMzQtZDk1My00OTNiLThlYmYtOGFhZWM5YTM2OTIx2AIF4AIB&aid=304142&lang=ja&dest_id=6411914&dest_type=hotel&checkin=2022-12-22&checkout=2022-12-23&group_adults=4&no_rooms=1&group_children=0&sb_travel_purpose=leisure&offset=0')
#driver.maximize_window()
time.sleep(5)

soup = BeautifulSoup(driver.page_source,"lxml")
for u in soup.select('div[data-testid="property-card"]'):
    title = u.select_one('div[class="fcab3ed991 a23c043802"]').get_text(strip=True)
    print(title)
    #price = u.select_one('span[class="fcab3ed991 bd73d13072"]').get_text(strip=True)
    #print(price)

输出:

cup of tea ensemble
FAV HOTEL TAKAYAMA
ワットホテル&スパ飛騨高山
飛騨高山温泉 高山グリーンホテル
岡田旅館  和楽亭
ザ・町家ホテル高山
旅館あすなろ
IORI STAY
風屋
Tabist 風雪
飛騨高山 本陣平野屋 花兆庵
Thanyaporn Hotel
旅館むら山
cup of tea
つゆくさ
旅館 一の松
龍リゾート&スパ
飛騨高山の宿 本陣平野屋 別館
飛騨牛専門 旅館 清龍
Tomato Takayama Station
民宿 和屋
ビヨンドホテル 高山 セカンド
旅館 岐山
Utatei
ビヨンドホテル高山1s

相关问题