我正在做一个简单的刮板操作,以从steamDB(https://steamdb.info/sales/?min_discount=50&min_rating=70)中提取蒸汽销售信息。这是我的代码:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://steamdb.info/sales/?min_discount=50&min_rating=70")
# extract the sale table and list of entries
table = driver.find_element_by_xpath("//*[@id='DataTables_Table_0']/tbody")
# key info: name/ price/ discount/ rating/ end time/ appid
for i in driver.find_elements_by_xpath(".//tr"):
for cnt, td in enumerate(i.find_elements_by_xpath(".//td")):
print(cnt, td.text)
print(i.get_attribute("data-appid"))
print("===========================")
基本上我只是发现该表包含所有销售信息,并提取了关键文本,例如游戏名称,价格,折扣,销售开始时间,结束时间等。
但是,在表中的几行数据之后,我发现销售结束/开始/游戏发布时间的文本缺失:
这是一个很好的人,应该像这样:
0
1
2 Undertale
Daily Deal
3 -61%
4 ¥ 14
5 94.18%
6 2 hours # sales end in
7 2 days ago # sales start from
8 4 years ago # game released
391540 # appid
===========================
这是一个不好的样子,
0
1
2 South Park™: The Stick of Truth™
Ubisoft Publisher Weekend new highest discount
3 -80%
4 $5.99
5 95.53%
6
7
8
213670
如您所见,抓取工具可以在索引6,7,8中检测到td
标签,但无法从中提取任何文本。
一些观察:
答案 0 :(得分:1)
这是因为滚动时这些列信息正在动态加载。请使用下面的脚本来解决此问题。
driver.get("https://steamdb.info/sales/?min_discount=50&min_rating=70")
# extract the sale table and list of entries
table = driver.find_element_by_xpath("//*[@id='DataTables_Table_0']/tbody")
# key info: name/ price/ discount/ rating/ end time/ appid
for i in table.find_elements_by_xpath(".//tr"):
driver.find_element_by_xpath("//li[@class='paginate_button next']").location_once_scrolled_into_view
for cnt, td in enumerate(i.find_elements_by_xpath(".//td")):
print(cnt, td.text)
print(i.get_attribute("data-appid"))
print("===========================")
答案 1 :(得分:0)
正如supputuri所说,问题来自网页的动态加载。经过一些实验后,我发现一个不错的解决方案是手动模拟向下滚动页面的过程,因此代码如下所示:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
time.sleep(0.5)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(0.5)
脚本将向下滚动到页面的一半,然后等待半秒钟,以使网页加载内容,然后进行浏览。这取决于网页的长度(如果长度太长,则每次滚动之间都会存在一些“间隙”)
我知道这种解决方案很幼稚,所以请告诉我是否有更好的解决方案。