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

yiytaume  于 2023-09-29  发布在  其他
关注(0)|答案(2)|浏览(113)

我试图通过Transfetmarkt网站使用pandas.read_html()函数从各种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()函数解析同一个网站。这一次我得到了一个“HTTP错误:HTTP错误404:未找到”。在通常的尝试和错误查找之后,urllib2头向Web服务器提供了一个类似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抓取此网站?
谢谢

k10s72fa

k10s72fa1#

目前你不能。相关代码:

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]
sigwle7e

sigwle7e2#

从pandas 2.1.0 * 开始,可以通过向storage_options关键字参数 * 传递头键值Map的字典来发送自定义头。

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
)

另见

相关问题