从网站上刮下一张桌子,作为Pandas储存

2024-04-20 13:47:14 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我想在一个网站(这是一个日本期权交易信息)中刮表,并将其存储为一个数据帧

该网站是here,您需要单击“选项报价”以访问我要刮表的页面。最终URL为https://svc.qri.jp/jpx/english/nkopm/,但您不能直接访问此页面

以下是我的尝试:

pd.read_html("https://svc.qri.jp/jpx/english/nkopm/")
...HTTPError: HTTP Error 400: Bad Request

所以我想我需要添加一个用户代理。下面是我的另一个尝试:

url = "https://svc.qri.jp/jpx/english/nkopm/"
pd.read_html(requests.get(url, headers={'User-agent': 'Mozilla/5.0'}).text)
...ValueError: No tables found

又一次尝试

import urllib
url = 'https://svc.qri.jp/jpx/english/nkopm/'
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
response = opener.open(url)
tables = pd.read_html(response.read(), attrs={"class":"price-table"})[0]
...HTTPError: HTTP Error 400: Bad Request

我知道如何玩熊猫,所以一开始就不必将其导入整洁的数据框中。我只需要先导入pandas中的表,但我不确定为什么我甚至不能阅读页面。任何帮助都将不胜感激

顺便说一下,如果单击中间列中的灰色箭头,enter image description here

它将添加另一行,如下所示。 enter image description here

通过点击这些按钮,它可以全部打开和关闭。 enter image description here

如果我也可以导入这些行,那就太好了,但这并不是必须的


Tags: 数据httpsurlreadenglish网站html页面
2条回答

根据Ahmad's的回答,您几乎做到了:

您只需获得以下表格:

import requests
import pandas as pd

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'cross-site',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://www.jpx.co.jp/english/markets/index.html',
    'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,it;q=0.6,la;q=0.5',
}

response = requests.get('https://svc.qri.jp/jpx/english/nkopm/', headers=headers)
table = pd.read_html(response.text, attrs={"class": "price-table"})[0]
print(table)

这将产生:

                                                  CALL  ...                                                PUT
                                       Settlement09/18  ...                                    Settlement09/18
0                                                    2  ...                                               3030
1    Delta  Gamma  Theta  Vega  0.0032  0.0000  -0....  ...              Delta  Gamma  Theta  Vega  -  -  -  -
2                                                Delta  ...                                                NaN
3                                               0.0032  ...                                                NaN
4                                                Delta  ...                                                NaN
..                                                 ...  ...                                                ...

阅读pandas函数的文档read_html它说

Read HTML tables into a list of DataFrame objects.

因此,函数需要以html表的形式进行结构化输入。我实际上无法访问您链接的网站,但我猜它会返回整个网站

您需要以结构化格式提取数据,以便pandas能够理解它。你需要刮它。这方面有很多工具,其中一个很流行的工具是^{}

Tl;dr:所以你需要做的是下载带有requests的网站,将其传递到BeautifulSoup,然后使用BeautifulSoup以结构化格式提取数据


最新答复:

似乎请求返回400的原因是因为网站需要一些额外的标题-我刚刚将浏览器的请求转储到请求中,它工作了

import requests

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'cross-site',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://www.jpx.co.jp/english/markets/index.html',
    'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,it;q=0.6,la;q=0.5',
}

response = requests.get('https://svc.qri.jp/jpx/english/nkopm/', headers=headers, cookies=cookies)

相关问题 更多 >