为了账号安全,请及时绑定邮箱和手机立即绑定

使用BeautifulSoup从investing.com为BTC/ETH抓取数据

使用BeautifulSoup从investing.com为BTC/ETH抓取数据

隔江千里 2021-09-23 09:19:35
我已经编写了一些代码来从投资网站上抓取 BTC/ETH 时间序列,并且运行良好。但是,我需要更改请求调用,以便下载的数据来自 Kraken 而不是默认的 bitfinex 并且来自 01/06/2016 而不是默认的开始时间。这个选项可以在网页上手动设置,但我不知道如何通过请求调用发送它,除了它可能涉及使用“数据”参数。感谢任何建议。谢谢,知识管理代码已经用 python 编写并且适用于默认值import requestsfrom bs4 import BeautifulSoupimport osimport numpy as np# BTC scrape https://www.investing.com/crypto/bitcoin/btc-usd-historical-data# ETH scrape https://www.investing.com/crypto/ethereum/eth-usd-historical-dataticker_list = [x.strip() for x in open("F:\\System\\PVWAVE\\Crypto\\tickers.txt", "r").readlines()]urlheader = {  "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",  "X-Requested-With": "XMLHttpRequest"}print("Number of tickers: ", len(ticker_list))for ticker in ticker_list:    print(ticker)    url = "https://www.investing.com/crypto/"+ticker+"-historical-data"    req = requests.get(url, headers=urlheader, data=payload)    soup = BeautifulSoup(req.content, "lxml")    table = soup.find('table', id="curr_table")    split_rows = table.find_all("tr")    newticker=ticker.replace('/','\\')    output_filename = "F:\\System\\PVWAVE\\Crypto\\{0}.csv".format(newticker)    os.makedirs(os.path.dirname(output_filename), exist_ok=True)    output_file = open(output_filename, 'w')    header_list = split_rows[0:1]    split_rows_rev = split_rows[:0:-1]    for row in header_list:        columns = list(row.stripped_strings)        columns = [column.replace(',','') for column in columns]        if len(columns) == 7:            output_file.write("{0}, {1}, {2}, {3}, {4}, {5}, {6} \n".format(columns[0], columns[2], columns[3], columns[4], columns[1], columns[5], columns[6]))为默认交换和默认日期范围下载数据,但我想指定 Kraken 和默认开始和结束时间(01/06/16 和最后一整天,即总是昨天)
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

小背景

有很多网站根据用户活动(例如您填写用户名和密码的登录页面)或单击按钮,使用称为表单的东西将数据发送到服务器。这里正在发生类似的事情。

我怎么知道的?

  • 更改默认页面并转到Kraken 历史数据页面。您会看到网址已更改为https://www.investing.com/crypto/bitcoin/btc-usd-historical-data?cid=49799

  • 现在,右键单击页面并单击Inspect。查看刚刚打开的分屏的最上面一行。单击网络选项卡。此选项卡将显示您在浏览器中访问的任何网页的请求/响应周期。

  • 搜索您看到的红色按钮旁边的清除按钮,然后单击它。现在,你有一个干净的石板。当您更改该页面上的日期时,您将能够看到发送到服务器的请求。

  • 根据您的需要更改日期,然后单击Apply。您将看到一个名为HistoricalDataAjax的请求已发送到服务器(请参阅下面的附加图片以获得更清晰的信息)。单击它并在“标题”选项卡中向下滚动。您可以看到名为Form Data的部分。这是发送到服务器的额外隐藏(尚未如此隐藏)的信息。它作为POST请求发送,因为您在 url 中没有看到任何更改。

  • 您还可以在同一标题部分看到请求 URLhttps://www.investing.com/instruments/HistoricalDataAjax

//img1.sycdn.imooc.com//614bd64c0001692015501300.jpg

现在做什么?

你需要聪明,在你的 python 代码中进行3 处更改。

  • 将请求从GET更改为POST

  • 发送表单数据作为该请求的有效负载。

  • 将 url 更改为您刚刚在“标题”选项卡中看到的那个。

    url = " https://www.investing.com/instruments/HistoricalDataAjax "

    payload = {'header': 'BTC/USD Kraken 历史数据', 'st_date': '12/01/2018', 'end_date': '12/01/2018', 'sort_col': 'date', 'action ':'历史数据','smlID':'145284','sort_ord':'DESC','interval_sec':'每日','curr_id':'49799'}

    requests.post(url, data=payload, headers=urlheader)

进行上述更改并让代码的其他部分保持不变。你会得到你想要的结果。您也可以根据需要修改日期。


查看完整回答
反对 回复 2021-09-23
  • 1 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信