【问题标题】:How to act when not receiving the data when scraping with python?用python抓取时收不到数据怎么办?
【发布时间】:2020-08-15 06:53:10
【问题描述】:

这个网站有关于库存和 我正在尝试从该站点中提取一些数据。 https://quickfs.net/company/AAPL:US

AAPL 是股票名称,可以更改。

页面看起来像一张大桌子:the columns are years and the rows are calculated values like: Return on Assets and Gross Margin

为此,我尝试遵循一些教程:

Introduction to Web Scraping (Python) - Lesson 02 (Scrape Tables)

Intro to Web Scraping with Python and Beautiful Soup

Web Scraping HTML Tables with Python

Web scraping with Python — A to Z Part A — Handling BeautifulSoup and avoiding blocks

我在导入包后一开始就卡住了:

from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq

这个函数从网页中检索数据:

def make_soup(url):
    thepage=uReq(url)
    soupdata=soup(thepage, "html.parser")
    return(soupdata)

然后

soup=make_soup("https://quickfs.net/company/AAPL:US")

现在,当试图查看汤里的数据时

soup.text

输出只是这个,而不是网页中的所有数据:

'\n\n\n\n\n\n\n\n\n\n\n\nExport Fundamental Data U.S. and International Stocks - QuickFS.net\n\n\n\n\n\n  \r\n  Loading QuickFS...\r\n  \n\n\n\n\n\n\n\n\n\n\n\n\n\n'

我认为这是特定网页的问题,但我不知道如何处理。

输入不同的 url,函数 make_soup(url) 有时会起作用。

请大家帮忙

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    这是因为该页面是完全动态的,这意味着 javascript 正在完成所有工作,而 BeautifulSoup4 不运行 JS。

    你必须在这里选择:

    • A) 切换到 Selenium 之类的东西
    • B) 检查站点向 api/server 发送的 XHR 消息,并尝试从 python 模拟。

    在 B 的情况下,您会看到该站点正在调用:

    curl 'https://api.quickfs.net/stocks/AAPL:US/ovr/Annual/' \
    -XGET \
    -H 'Accept: application/json, text/plain, */*' \
    -H 'Content-Type: application/json' \
    -H 'Origin: https://quickfs.net' \
    -H 'Accept-Language: en-us' \
    -H 'Host: api.quickfs.net' \
    -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15' \
    -H 'Referer: https://quickfs.net/company/AAPL:US' \
    -H 'Accept-Encoding: gzip, deflate, br' \
    -H 'Connection: keep-alive' \
    -H 'X-Auth-Token: ' \
    -H 'X-Referral-Code: '
    

    你可以这样做:

    import requests
    
    response = request.get("https://api.quickfs.net/stocks/AAPL:US/ovr/Annual/")
    data = response.json()
    

    其中数据将是网站用来呈现信息的原始数据:

    {
        "datasets": {
            "metadata": {
                "_id": {},
                "qfs_symbol": "NAS:AAPL",
                "currency": "USD",
                "fsCat": "normal",
                "name": "Apple Inc.",
                "gs3_version_at_metadata_update": 20191106,
                "exchange": "NASDAQ",
                "industry": "Technology Hardware & Equipment",
                "symbol": "AAPL",
                "country": "US",
                "price": 278.58,
            ...
        }
    }
    

    【讨论】:

    • 谢谢!请问你怎么知道“那个页面是完全动态的”?以及您编写的第一个代码块(在“您会看到该站点正在进行此调用”之后)您是如何得到它的?提前致谢
    • 不客气!我总是查看网站的“真实”源代码(查看源代码:quickfs.net/company/AAPL:US)。通常,如果站点中的信息比源中的信息多得多,那可能是因为它是用 javascript 加载的。下一步是弄清楚 JS 是如何获取这些信息的。如果您打开开发工具上的网络选项卡并刷新站点,您会看到对 api(即 AJAX)进行了 XHR 调用。如果您右键单击该调用并单击“复制为 cURL”,您将获得我发布的第一个代码块。
    • 再次感谢您!!我从中学到了很多东西!如果可以的话,还有一个问题。在这个页面的右上角有一个下拉菜单,第一个值是“概览”,然后是“损益表”,最后一个是关键比率。我正在尝试从关键比率页面中提取数据,但是当我按照您上次评论中的说明接收关键比率页面的 URL 时,通过刷新网页并查看 XHR 调用网页返回到概览页面,我找不到此关键比率页面的 URL。有办法处理吗?
    • 似乎这些只会触发不同的方式来呈现相同的数据,在这种情况下,您可能需要检查网站的 javascript 文件的代码,看看它们是如何处理的。
    猜你喜欢
    • 2020-07-08
    • 2020-10-23
    • 2021-02-05
    • 2023-01-29
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多