在返回网页

时间:2018-03-30 10:09:34

标签: python web-scraping python-requests web-crawler

我正在尝试抓取这个网站: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(installed from NPM),但这只兔子整体只是越来越深。

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

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

2 个答案:

答案 0 :(得分:1)

简短回答:不。你不能使用requests

但是,正如您所说,表数据是使用JavaScript动态生成的。数据来自this 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]将为您提供所有名称。

答案 1 :(得分:0)

您可以使用selenium,因为请求不提供wait-

选项
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