等待,然后返回网页内容



我正在尝试刮擦此网站:http://www.fivb.org/en/beachvolleyball/playersranking_w.asp,但是此页面加载了表的内容(可能是通过ajax(,在加载页面后。

我的尝试:

import requests
from bs4 import BeautifulSoup, Comment
uri = 'http://www.fivb.org/EN/BeachVolleyball/PlayersRanking_W.asp'
r = requests.get(uri)
soup = BeautifulSoup(r.content) 
print(soup)

但是,与id='BTechPlayM'的DIV保持空,无论我做什么。我尝试了:

  • 在请求上设置超时:requests.get(uri, timeout=10)
  • 通过标头
  • 使用Eventlet,设置延迟
  • 最新的事情是尝试使用硒般的图书馆,使用phantomjs(从NPM安装(,但是这个兔子 - 剩下的兔子一直越来越深。

有没有办法将请求发送到URI,等待x秒,然后返回内容?

...或向URI发送请求,继续检查div是否包含元素;并且仅返回内容,只要有?

简短答案:不,您不能使用requests

,但是,正如您所说,表数据是使用JavaScript动态生成的。数据是从此URL获得的。但是,响应不采用JSON格式。这是JavaScript。因此,从这些数据中,您可以获取所需的数据,这些数据可在列表中使用Regex。

获得。

但是,再次,Regex返回的数据是字符串格式而不是实际列表。您可以使用ast.literal_eval()将此字符串转换为列表。例如,数据看起来像这样:

'["1", "Humana-Paredes", "CAN", "4", "1,720", ""]'

完成代码:

import re
import requests
import ast
r = requests.get('http://www.fivb.org/Vis/Public/JS/Beach/TechPlayRank.aspx?Gender=1&id=BTechPlayW&Date=20180326')
data = re.findall(r'([[^[]]*])', r.text)
for player in data:
    details = ast.literal_eval(player)
    print(details)  # this var is a list (format shown below)

部分输出:

['1', 'Humana-Paredes', 'CAN', '4', '1,720', '']
['', 'Pavan', 'CAN', '4', '1,720', '']
['3', 'Talita', 'BRA', '4', '1,660', '']
['', 'Larissa', 'BRA', '4', '1,660', '']
['5', 'Hermannova', 'CZE', '4', '1,360', '']
['', 'Slukova', 'CZE', '4', '1,360', '']
['7', 'Laboureur', 'GER', '4', '1,340', '']
...

此列表的基本格式(details(是:

[<Rank>, <Name>, <Country>, <Nb. part.>, <Points>, <Entry pts.>]

您可以根据需要使用此数据。例如,使用details[1]将为您提供所有名称。

您可以使用硒,因为请求没有提供选项 -

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup, Comment
uri = 'http://www.fivb.org/EN/BeachVolleyball/PlayersRanking_W.asp'
browser = webdriver.Chrome("./chromedriver") #download chromebrowser
browser.set_page_load_timeout(60)
browser.get(uri) #open page in browser
text = browser.page_source
browser.quit()
soup = BeautifulSoup(text) 
print(soup)

您将必须下载Chromedriver

最新更新