【问题标题】:Failed to scrape tabular content from a webpage using requests module无法使用请求模块从网页中抓取表格内容
【发布时间】:2021-08-15 19:45:47
【问题描述】:

我正在尝试使用 requests 模块从 webpage 中抓取表格内容。该页面的内容是高度动态的但是,可以根据开发工具通过 api 访问它。我正在尝试使用适当的参数来模拟相同的发布请求,但我总是得到状态403

import requests
from pprint import pprint

start_url = 'https://opensea.io/rankings'
link = 'https://api.opensea.io/graphql/'
payload = {"id":"rankingsQuery","query":"query rankingsQuery(\n  $chain: [ChainScalar!]\n  $count: Int!\n  $cursor: String\n  $sortBy: CollectionSort\n  $parents: [CollectionSlug!]\n  $createdAfter: DateTime\n) {\n  ...rankings_collections\n}\n\nfragment rankings_collections on Query {\n  collections(after: $cursor, chains: $chain, first: $count, sortBy: $sortBy, parents: $parents, createdAfter: $createdAfter, sortAscending: false, includeHidden: true, excludeZeroVolume: true) {\n    edges {\n      node {\n        createdDate\n        name\n        slug\n        logo\n        stats {\n          floorPrice\n          marketCap\n          numOwners\n          totalSupply\n          sevenDayChange\n          sevenDayVolume\n          oneDayChange\n          oneDayVolume\n          thirtyDayChange\n          thirtyDayVolume\n          totalVolume\n          id\n        }\n        id\n        __typename\n      }\n      cursor\n    }\n    pageInfo {\n      endCursor\n      hasNextPage\n    }\n  }\n}\n","variables":{"chain":None,"count":100,"cursor":"YXJyYXljb25uZWN0aW9uOjk5","sortBy":"SEVEN_DAY_VOLUME","parents":None,"createdAfter":None}}

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
    s.headers['x-api-key'] = '2f6f419a083c46de9d83ce3dbe7db601'
    s.headers['x-build-id'] = 'cplNDIqD8Uy8MvANX90r9'
    s.headers['referer'] = 'https://opensea.io/'
    res = s.post(link,json=payload)
    pprint(res.status_code)
    print(res.json())

如何使用请求模块从该网页中抓取表格内容?

【问题讨论】:

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


    【解决方案1】:

    您可以从脚本标签中对其进行正则表达式,然后重建表。有一些列格式需要做。

    import requests, re, json
    import pandas as pd
    
    r = requests.get('https://opensea.io/rankings')
    data = json.loads(re.search(r'window\.__wired__=([^<]*)', r.text).group(1))
    items = [v for v in data['records'].values() if v['__typename'] in ['CollectionType', 'CollectionStatsType']]
    d = {i['name']:j for i, j in zip(items[::2], items[1::2])}
    df = pd.DataFrame.from_dict(d, orient='index')      
    print(df)
    

    正则表达式:

    【讨论】:

    • 哦...刚刚看到您对后面页面和图表的评论。 GraphQL API 受 CloudFlare 保护。你应该把它放在问题的前面。
    【解决方案2】:

    我不认为 graphql 查询是您想要的。 那里有一个返回数据的 GET 查询。

    尝试一下

    res = s.get('https://api.opensea.io/tokens/?limit=100')
    

    【讨论】:

    • 这是我第一次尝试的。该 url 产生的内容与您在该页面中看到的内容不同。例如,我在回复中没有找到Pudgy Penguins。此外,有必要去graphql 访问下一页。谢谢。
    【解决方案3】:

    我认为 opensea 使用 CloudFlare 来保护其 API.. 尝试通过 ScrapeNinja 或 Puppeteer 发起您的请求 - 这样似乎可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-29
      • 2020-02-14
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多