【问题标题】:Python Web Scraping using "requests" Help Required需要使用“请求”帮助的 Python Web Scraping
【发布时间】:2020-04-20 17:01:56
【问题描述】:

我想提取https://www.nseindia.com/market-data/exchange-traded-funds-etf的URL数据。此 URL 将数据提取到表格股票市场数据中。从列开始

Symbol
Underlying Assets
Open
High
Low
...
...
52W H
52W L
Today

我的目标是将这些数据放入 Pandas Dataframe 中,包括标题

我写了以下代码

import requests
import json
import pandas as pd
from datetime import datetime
from datetime import timedelta
pd.options.display.float_format = '{:20,.2f}'.format
pd.set_option('display.max_colwidth', None)
import numpy as np
from bs4 import BeautifulSoup 

url="https://www.nseindia.com/market-data/exchange-traded-funds-etf"
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 OPR/67.0.3575.137"}

r=requests.get(url, headers=headers)
r.status_code

# df1=pd.DataFrame().from_records(r['data'])

但我不知道如何继续,对于来自同一网站的另一个链接,我使用了以下代码

rl="https://nseindia.com/api/equity-stockIndices?index=SECURITIES%20IN%20F%26O"

headers = { "Accept-Encoding":"gzip, deflate","Accept-Language":"en-US,en;q=0.9",
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.78"}

r=requests.get(url, headers=headers).json()
df1=pd.DataFrame().from_records(r['data'])

但 requests.get(url, headers=headers).json() 不适用于此 URL。你能帮我把数据导入Dataframe吗?

谢谢

【问题讨论】:

  • 您没有具体说明您的问题。您在获取数据或解析数据时遇到问题吗?
  • 不知道如何将各种js脚本生成的表格数据导入Dataframe。希望我很清楚

标签: python python-3.x pandas web-scraping


【解决方案1】:

正如 apw-ub 所提到的,如果您使用 API url,您的代码可以正常工作。这是完整的代码:

import pandas as pd
pd.options.display.float_format = '{:20,.2f}'.format
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
import requests
import json

url='https://www.nseindia.com/api/etf'
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36 OPR/67.0.3575.137"}
r=requests.get(url, headers=headers)
df = pd.DataFrame().from_records(json.loads(r.text)["data"])
print(df)

【讨论】:

  • 感谢它正在工作。你能告诉我 r=requests.get(url, headers=headers).json() 为什么它不起作用吗?
  • 因为您使用了错误的 URL。就是这样。如果您使用 API url,您编写的内容将正常工作。使用 (nseindia.com/api/etf) 你可以使用: r=requests.get(url, headers=headers).json() df = pd.DataFrame().from_records(r["data"])
  • 谢谢 undrestood,但很想知道您是如何发现 nseindia.com/api/etf 是正确的 URL,因为当我打开 URL 时它显示 nseindia.com/market-data/exchange-traded-仅限基金-ETF。
【解决方案2】:

如果我理解正确,应该使用“json.loads”函数加载字符串 JSON 数据。

json_format = json.loads(response.text)
df = pd.DataFrame().from_records(json_format["data"])

编辑:刚刚意识到您的示例也有效,仔细查看,您可以使用此 URL 获取您想要的 https://www.nseindia.com/api/etf

【讨论】:

  • 嗨,谢谢,我想将表格输出数据加载到 Dataframe 中。我尝试测试您的解决方案,它给出了错误 r=requests.get(url, headers=headers) r.status_code r.text json_format = json.loads(r.text)
  • C:\ProgramData\Anaconda\lib\json\decoder.py in raw_decode(self, s, idx) 353 obj, end = self.scan_once(s, idx) 354 除了 StopIteration 错误: --> 355 raise JSONDecodeError("Expecting value", s, err.value) from None 356 return obj, end JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  • 嗨,有什么帮助吗?谢谢
  • 感谢未恢复,但很想知道您是如何发现 nseindia.com/api/etf 是正确的 URL,因为当我打开 URL 时它只显示 nseindia.com/market-data/exchange-traded-funds-etf。我错过了您在下面的正确 URL 答案。
  • 您可以通过检查页面快速检查他们是否从 API 中提取数据。我在 Chrome 上执行此操作,所以我所做的是: Ctrl + Shift + I 检查元素、访问网络选项卡、刷新页面、按类型排序 (xhr) 并通过预览选项卡中的“预览”选项卡查找类似于数据的内容子窗口,在这种情况下,“etl”是源。幸运的是,这是一个非常简单的示例,许多其他网站将需要配置更广泛的 GET/POST 请求以及触发 JavaScript 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2011-09-12
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多