使用 scrapy (python) 抓取 react/typescript 应用程序 - 脚本不加载
Scraping a react/typescript app with scrapy (python) - Scripts don't load
我正在努力抓取某个网页 (beachvolleyball.nrw)。
在过去的 2 天里,我使用了我能找到的所有库,但始终无法加载脚本标签。
当使用开发人员工具 select 比赛时,数据正在加载,但我无法将其与 selenium 和其他工具一起使用 -.-
我要抓取的对象:
Dom 中的元素:
我已经尝试了很多不同的方法,向您展示一个声音没有多大意义。
请在打开网页时查看 DOM ,当元素尚未加载时,
帮助我使用 Splash 3.5 或您喜欢的任何其他解决方案加载数据:)
非常感谢!在那之前我会继续努力:)
TLDR:我无法使用启动或在 DOM 中导航的任何其他解决方案从 here 加载脚本不是问题!
您要抓取的 table 由 websockets 加载。您可以使用开发人员工具中的网络选项卡进行检查。这包含在您的网络浏览器中。通常由 F12
或 [CTRL] + [SHIFT] + 'C'
打开。然后导航到“网络”选项卡,在这里您可以看到 websockets 和从服务器发送的消息,以及通过浏览器发送到服务器的消息。我认为最简单的方法是通过 selenium Or connecting to the WebSocket by using a library like websocket-client
由 JavaScripts
呈现的页面您可以使用 selenium 并等待 table 先加载,然后再从 table.
获取值
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(executable_path="/path/to/chromedriver")
driver.get("https://www.beachvolleyball.nrw/")
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,".table-tournaments.table.table-hover")))
rows=driver.find_elements_by_css_selector(".table-tournaments.table.table-hover>tbody>tr")
for row in range(len(rows)):
if len(rows[row].find_elements_by_xpath("./th"))>0:
print("Row numner: " + str(row))
for th in rows[row].find_elements_by_xpath("./th"):
print(th.text)
print("====================================")
if len(rows[row].find_elements_by_xpath("./td")) > 0:
print("Row numner: " + str(row))
for td in rows[row].find_elements_by_xpath("./td"):
print(td.text)
print("====================================")
控制台输出:
Row numner: 0
OKTOBER 2020
====================================
Row numner: 1
03.10. Sa.
C
Hürth
30/32
====================================
Row numner: 2
03.10. Sa.
C
Münster
2/12
====================================
Row numner: 3
03.10. Sa.
S
Brühl Senioren
3/8
====================================
Row numner: 4
03.10. Sa.
S
Brühl Senioren
6/8
====================================
Row numner: 5
04.10. So.
C
Hürth
11/16
====================================
Row numner: 6
04.10. So.
C
Hürth
6/16
====================================
Row numner: 7
04.10. So.
C
Münster
16/16
====================================
Row numner: 8
10.10. Sa.
C
Münster
15/12
====================================
Row numner: 9
17.10. Sa.
C
Münster
16/16
====================================
Row numner: 10
DEZEMBER 2020
====================================
Row numner: 11
30.12. Mi.
B
Beachliga Castrop-Rauxel
41/40
====================================
Row numner: 12
31.12. Do.
B
Beachliga Castrop-Rauxel
36/35
====================================
Row numner: 13
31.12. Do.
B
Beachliga Castrop-Rauxel
29/35
====================================
我正在努力抓取某个网页 (beachvolleyball.nrw)。
在过去的 2 天里,我使用了我能找到的所有库,但始终无法加载脚本标签。
当使用开发人员工具 select 比赛时,数据正在加载,但我无法将其与 selenium 和其他工具一起使用 -.-
我要抓取的对象:
Dom 中的元素:
我已经尝试了很多不同的方法,向您展示一个声音没有多大意义。 请在打开网页时查看 DOM ,当元素尚未加载时, 帮助我使用 Splash 3.5 或您喜欢的任何其他解决方案加载数据:)
非常感谢!在那之前我会继续努力:)
TLDR:我无法使用启动或在 DOM 中导航的任何其他解决方案从 here 加载脚本不是问题!
您要抓取的 table 由 websockets 加载。您可以使用开发人员工具中的网络选项卡进行检查。这包含在您的网络浏览器中。通常由 F12
或 [CTRL] + [SHIFT] + 'C'
打开。然后导航到“网络”选项卡,在这里您可以看到 websockets 和从服务器发送的消息,以及通过浏览器发送到服务器的消息。我认为最简单的方法是通过 selenium Or connecting to the WebSocket by using a library like websocket-client
由 JavaScripts
呈现的页面您可以使用 selenium 并等待 table 先加载,然后再从 table.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(executable_path="/path/to/chromedriver")
driver.get("https://www.beachvolleyball.nrw/")
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,".table-tournaments.table.table-hover")))
rows=driver.find_elements_by_css_selector(".table-tournaments.table.table-hover>tbody>tr")
for row in range(len(rows)):
if len(rows[row].find_elements_by_xpath("./th"))>0:
print("Row numner: " + str(row))
for th in rows[row].find_elements_by_xpath("./th"):
print(th.text)
print("====================================")
if len(rows[row].find_elements_by_xpath("./td")) > 0:
print("Row numner: " + str(row))
for td in rows[row].find_elements_by_xpath("./td"):
print(td.text)
print("====================================")
控制台输出:
Row numner: 0
OKTOBER 2020
====================================
Row numner: 1
03.10. Sa.
C
Hürth
30/32
====================================
Row numner: 2
03.10. Sa.
C
Münster
2/12
====================================
Row numner: 3
03.10. Sa.
S
Brühl Senioren
3/8
====================================
Row numner: 4
03.10. Sa.
S
Brühl Senioren
6/8
====================================
Row numner: 5
04.10. So.
C
Hürth
11/16
====================================
Row numner: 6
04.10. So.
C
Hürth
6/16
====================================
Row numner: 7
04.10. So.
C
Münster
16/16
====================================
Row numner: 8
10.10. Sa.
C
Münster
15/12
====================================
Row numner: 9
17.10. Sa.
C
Münster
16/16
====================================
Row numner: 10
DEZEMBER 2020
====================================
Row numner: 11
30.12. Mi.
B
Beachliga Castrop-Rauxel
41/40
====================================
Row numner: 12
31.12. Do.
B
Beachliga Castrop-Rauxel
36/35
====================================
Row numner: 13
31.12. Do.
B
Beachliga Castrop-Rauxel
29/35
====================================