问题描述
在Python中,我要在网站中刮擦表格(这是日本期权交易信息),并将其存储为熊猫数据框。
该网站为here,您需要单击“选项报价”才能访问我要在其中刮擦桌子的页面。最终网址为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
我知道如何与大熊猫一起玩,因此一开始不必将其导入整洁的数据框中。我只需要先将表格导入大熊猫即可,但是我不确定为什么我什至无法阅读该页面。任何帮助将不胜感激!
它将添加这样的另一行。
可以通过单击这些按钮将其全部打开和关闭。
如果我也可以导入这些行,那就太好了,但这不是必须的。
解决方法
阅读熊猫函数read_html
的文档
将HTML表读入DataFrame对象列表。
因此,该函数希望以html表的形式进行结构化输入。我实际上无法访问您链接到的网站,但我想它会带您回到整个网站。
您需要以结构化格式提取数据,以便大熊猫能够理解它们。您需要刮一下。有很多工具可以使用,其中一个受欢迎的工具是BeautifulSoup
。
Tl; dr:所以您需要做的是使用requests
下载网站,将其传递到BeautifulSoup
,然后使用BeautifulSoup
以结构化格式提取数据。 / p>
最新答案:
请求返回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)
,
基于Ahmad's的答案,您几乎可以做到了:
获取表格所需的全部是这样:
import requests
import pandas as pd
headers = {
'Connection': 'keep-alive',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
.. ... ... ...