如何修改 Pandas 的 Read_html 用户代理?
Posted
技术标签:
【中文标题】如何修改 Pandas 的 Read_html 用户代理?【英文标题】:How to modify Pandas's Read_html user-agent? 【发布时间】:2013-09-27 03:53:06 【问题描述】:我正在尝试使用 pandas.read_html() 函数通过Transfetmarkt 网站从各种 html 表格中抓取英国足球统计数据。
例子:
import pandas as pd
url = r'http://www.transfermarkt.co.uk/en/premier-league/gegentorminuten/wettbewerb_GB1.html'
df = pd.read_html(url)
但是,此代码会生成 “ValueError: Invalid URL” 错误。
然后我尝试使用 urllib2.urlopen() 函数解析同一个网站。这次我得到一个“HTTPError:HTTP Error 404:Not Found”。在通常的试错故障查找之后,urllib2 标头向网络服务器提供了一个类似 python 的代理,我认为它无法识别。
现在,如果我修改 urllib2 的代理并使用 beautifulsoup 读取其内容,我可以毫无问题地读取表格。
例子:
from BeautifulSoup import BeautifulSoup
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
url = r'http://www.transfermarkt.co.uk/en/premier-league/gegentorminuten/wettbewerb_GB1.html'
response = opener.open(url)
html = response.read()
soup = BeautifulSoup(html)
table = soup.find("table")
如何修改 pandas 的 urllib2 标头以允许 python 抓取该网站?
谢谢
【问题讨论】:
您可能想在 GitHub 上提出问题。我很乐意看看(我写了read_html
)
完成 - github.com/pydata/pandas/issues/4927
【参考方案1】:
目前你不能。相关代码:
if _is_url(io): # io is the url
try:
with urlopen(io) as url:
raw_text = url.read()
except urllib2.URLError:
raise ValueError('Invalid URL: "0"'.format(io))
如您所见,它只是将url
传递给urlopen
并读取数据。您可以提出请求此功能的问题,但我假设您没有时间等待它得到解决,因此我建议使用 BeautifulSoup 解析 html 数据,然后将其加载到 DataFrame 中。
import urllib2
url = 'http://www.transfermarkt.co.uk/en/premier-league/gegentorminuten/wettbewerb_GB1.html'
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
response = opener.open(url)
tables = pd.read_html(response.read(), attrs="class":"tabelle_grafik")[0]
或者如果你可以使用requests
:
tables = pd.read_html(requests.get(url,
headers='User-agent': 'Mozilla/5.0').text,
attrs="class":"tabelle_grafik")[0]
【讨论】:
@PhillipCloud 我把评论放在那里是为了澄清io
是什么:)
啊好吧...继续吧:)
@Viktor 我已经让它工作了,但是 pd.read_html 函数返回一个列表而不是数据框。 from BeautifulSoup import BeautifulSoup import urllib2 import pandas as pd url = r'transfermarkt.co.uk/en/premier-league/gegentorminuten/…' opener = urllib2.build_opener() opener.addheaders = [('User-agent', 'Mozilla/5.0')] response = opener.open( url) html = response.read() soup = BeautifulSoup(html) tables = pd.read_html(str(soup), attrs="class":"tabelle_grafik")
read_html
返回 DataFrame
s 的 list
,因为许多页面有多个表。
我们应该真的考虑在pandas
上使用requests
。这比传递OpenerDirector
实例要好得多。我认为我们在某处使用 requests
时遇到问题...以上是关于如何修改 Pandas 的 Read_html 用户代理?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas pd.read_html() 函数给了我“HTTP 错误 403:禁止”
Pandas read_html 返回原始 HTML 内容 [对于某些行/单元格/等]
pandas read_html ValueError:未找到表