我在我的第一次尝试刮基于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)
1条答案
按热度按时间xbp102n01#
下面的代码生成的输出与浏览器显示的输出完全相同
输出: