如何修改Pandas的Read_html用户代理?

问题描述 投票:0回答:2

我正在尝试使用 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:无效 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 抓取该网站?

谢谢

python pandas web-scraping urllib2
2个回答
10
投票

目前还不能。相关代码:

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]

0
投票

从 pandas 2.1.0 开始 可以通过将标头键值映射字典传递到

storage_options
关键字参数来与 HTTP(s) 请求一起发送自定义标头。

import pandas as pd

headers = {"User-Agent": "Mozilla/5.0"}
df = pd.read_html(
    "http://www.transfermarkt.co.uk/en/premier-league/gegentorminuten/wettbewerb_GB1.html",
    storage_options=headers
)

另请参阅

© www.soinside.com 2019 - 2024. All rights reserved.