【问题标题】:Web scraping from a Json page but HTTPError: HTTP Error 400: Bad Request从 Json 页面抓取网页但 HTTPError: HTTP Error 400: Bad Request
【发布时间】:2019-09-07 06:26:46
【问题描述】:

我正在尝试从这个网站获取数据。
https://api.etherscan.io/api?module=account&action=tokentx&contractaddress=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&page=1&offset=100&sort=asc&apikey=YourApiKeyToken
但是,当我执行以下代码时,我不断收到错误

import pandas as pd
import json
import urllib.request
from urllib.request import FancyURLopener

url = 'https://api.etherscan.io/api?module=account&action=tokentx&contractaddress=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2&page='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)     Chrome/37.0.2049.0 Safari/537.36'}
request_interval = 2  # interval

urls = []
df = []
if __name__ == '__main__':
    for i in range(1, 2):
        url = urllib.parse.urljoin(url, '&page='+str(i)+'&offset=10000&sort=asc&apikey=YourApiKeyToken')
        urls.append(str(url))

    for url in urls:
        headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}
        request = urllib.request.Request(url=url, headers=headers)
        html = urllib.request.urlopen(request).read()
        result = json.loads(html.decode('utf-8'))['blockNumber']
        df.extend(json.loads(html.decode('utf-8'))['blockNumber'])
        print('Completed URL : ', url)

pdf = pd.DataFrame(df)

pdf.to_csv("output.csv")

我已经尝试了几种解决方案,我在这里找到了 Stackoverflow。
urllib2.HTTPError: HTTP Error 400: Bad Request - Python
urllib2 HTTP Error 400: Bad Request

我也变了

headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}




{'Authorization': auth,
             'Content-Type':'application/json',
             'Accept':'application/json'}


但仍然出现同样的错误。

谢谢

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    urljoin 的用途与您打算使用的用途不同。

    来自docs

    通过将“基本 URL”(base)与另一个 URL(url)组合来构造一个完整(“绝对”)的 URL。非正式地,这使用基本 URL 的组件,特别是寻址方案、网络位置和(部分)路径,以提供相对 URL 中缺少的组件。例如:

    >>> from urllib.parse import urljoin
    >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
    'http://www.cwi.nl/%7Eguido/FAQ.html'
    

    我不确定你是否可以使用它来组合 url 的查询参数

    有了这个,你在 urljoin 之后得到的 url 就像

    https://api.etherscan.io/&page=1&offset=10000&sort=asc&apikey=YourApiKeyToken
    

    这是错误的。

    使用字符串连接。在第一个 for 循环中,从

    url = urllib.parse.urljoin(url, '&page='+str(i)+'&offset=10000&sort=asc&apikey=YourApiKeyToken')
    

    url = url + str(i) + '&offset=10000&sort=asc&apikey=YourApiKeyToken'
    

    您正在将值重新分配给 for 循环内的主 url 变量。 所以在下一次迭代中,您将在第一次迭代 url 上添加偏移部分。

    添加上述更改,而不是

    for i in range(1, 2):
        url = urllib.parse.urljoin(url, '&page='+str(i)+'&offset=10000&sort=asc&apikey=YourApiKeyToken')
        urls.append(str(url))
    

    你可以这样做

    for i in range(1, 2):
            urls.append(url + str(i) + '&offset=10000&sort=asc&apikey=YourApiKeyToken')
    

    希望您知道第一个循环只会运行一次。 range(1,2) 将返回 [1] 而不是 [1, 2]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多