【问题标题】:Python request library giving wrong content when URL is correct当 URL 正确时 Python 请求库给出错误的内容
【发布时间】:2021-07-15 17:41:19
【问题描述】:

我只是 python 网络抓取的初学者,想从 yahoo Finance 获取股票价格。 这是我的代码

from bs4 import BeautifulSoup
import requests

stock="TSLA"
r = request.get(f"https://ca.finance.yahoo.com/quote/{stock}")
soup = BeautifulSoup(r, "lxml")

#Price
Price= soup1.find("span", class_="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)").text

print("Price:"+ Price)

但问题是 request.get 给出了 404 页面未找到。

print(r.text)

OUTPUT: <Response [404]>

请帮我解决这个问题。我需要使用标头和用户代理吗?还是 cookie 阻止了我?

【问题讨论】:

  • 这可能是用户代理的事情。如果我删除“ca”。从域它工作正常。
  • 您正在抓取整个网页以获得一个股票价格?请阅读ethical web scraping。并考虑使用stock market data API
  • 没问题,数据正在使用 pandas 生成。如果您更喜欢这种方式,那么我可以给出解决方案。
  • @Fazlul 我很高兴看到您的解决方案,请分享。
  • 好的。谢谢@meet

标签: python web-scraping python-requests


【解决方案1】:

这是代码。

import pandas as pd
import requests
stock="TSLA"
url = f"https://ca.finance.yahoo.com/quote/{stock}"
r = requests.get(url, headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'})
data = pd.read_html(r.text)
print(data)

【讨论】:

  • 非常感谢 Fazlul,它有效。我没有使用熊猫,而是使用了 r.text。你使用的标题对我有用。 @Fazlul
【解决方案2】:

404 错误通常表示未找到该 url。你可以阅读更多关于它的信息here。因此,这意味着由于某种原因,当您的代码向该 url 发出 GET 请求时,服务器会回复说嘿,该 url 不在这里。

但是,如果我将您的网址放入我的浏览器,它对于像 APL 这样的有效股票名称就可以正常工作。所以我要检查的第一件事是你是否在代码中输入了错误的股票名称 - 如果是这样,它可能会给你一个 404。

但是使用正确的股票名称调用它也会给我一个 404 错误使用您的代码。因此,在这种情况下,我接下来要做的就是在页面上点击检查,单击网络选项卡,然后刷新,这样您就可以查看浏览器为对感兴趣的 url 进行网络调用所做的工作。如果您复制它,那么您可以通过编程方式访问该页面。

在我的请求标头中,有一个 cookie 和其他一些东西,所以解决这个问题的好方法是使用 requests sessions,它很好地复制了这种行为。为此,首先安装库:

pip install requests-html

那么这段代码对我有用:

from requests_html import HTMLSession


session = HTMLSession()
response = session.get("https://finance.yahoo.com/")
if response.status_code == 200:
    stock_quote_response = session.get(
        "https://finance.yahoo.com/quote/{}".format("APL")
    )
    if stock_quote_response.status_code == 200:
        # Parse the response
    else:
        print("[*] Failed to get stock quote for stock {}".format("APL"))
        print(
            "{} {}".format(
                stock_quote_response.status_code, stock_quote_response.reason
            )
        )

【讨论】:

  • Alex 你能给我一个你的代码示例吗?它显示股票价格。
猜你喜欢
  • 2013-11-21
  • 2021-10-30
  • 1970-01-01
  • 2012-08-06
  • 2021-10-05
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多