Python:对网站的请求在任何情况下都没有提供我需要的 html

Python: request to website doesn't gives the html I need in any cases

根据我的问题 我对网站 finance.yahoo.com 上的请求还有一些疑问。

我的请求没有 User-Agent 请求给了我 html 我想从网站收集一些数据的代码。

以 'ALB' 作为参数的调用工作正常,我得到请求的数据:

import bs4 as bs
import requests
def yahoo_summary_stats(stock):
    response = requests.get(f"https://finance.yahoo.com/quote/{stock}")
    #response = requests.get(f"https://finance.yahoo.com/quote/{stock}", headers={'User-Agent': 'Custom user agent'})

    soup = bs.BeautifulSoup(response.text, 'lxml')

    table = soup.find('p', {'class': 'D(ib) Va(t)'})

    sector = table.findAll('span')[1].text
    industry = table.findAll('span')[3].text
    print(f"{stock}: {sector}, {industry}")
    return sector, industry

web.yahoo_summary_stats('ALB')

输出:

ALB: Basic Materials, Specialty Chemicals

调用 yahoo_summary_stats('AEE') 无法以这种方式工作,因此我需要激活 headers 才能成功请求站点。

但是现在使用参数headers={'User-Agent': 'Custom user agent'} 代码不起作用,他无法找到带有 class 'D(ib) Va(t)'.

的段落 p

我该如何解决这个问题?

此页面使用 JavaScript 显示信息但 requests,BeautifulSoup 不能 运行 JavaScript.

但在没有 JavaScript 的情况下在 Web 浏览器中检查页面 我在子页面 Profile 上看到此信息。

"https://finance.yahoo.com/quote/{stock}/profile?p={stock}"

代码可以从该页面获取 stock 两者的代码。但它需要 User-Agent 来自真正的浏览器(或者至少是短版本 'Mozilla/5.0'

import bs4 as bs
import requests

def yahoo_summary_stats(stock):

    url = f"https://finance.yahoo.com/quote/{stock}/profile?p={stock}"

    headers = {'User-Agent': 'Mozilla/5.0'}

    print('url:', url)
    
    response = requests.get(url, headers=headers)

    soup = bs.BeautifulSoup(response.text, 'lxml')

    table = soup.find('p', {'class': 'D(ib) Va(t)'})

    sector = table.findAll('span')[1].text
    industry = table.findAll('span')[3].text

    print(f"{stock}: {sector}, {industry}")

    return sector, industry

# --- main ---

result = yahoo_summary_stats('ALB')
print('result:', result)

result = yahoo_summary_stats('AEE')
print('result:', result)

结果:

url: https://finance.yahoo.com/quote/ALB/profile?p=ALB
ALB: Basic Materials, Specialty Chemicals
result: ('Basic Materials', 'Specialty Chemicals')

url: https://finance.yahoo.com/quote/AEE/profile?p=AEE
AEE: Utilities, Utilities—Regulated Electric
result: ('Utilities', 'Utilities—Regulated Electric')

我觉得你取错了URL

response = requests.get(f"https://finance.yahoo.com/quote/{stock}/profile?p={stock}", headers={'User-Agent': 'Custom user agent'})

改成上面的URL连同user-agent就可以解决了。