【问题标题】:Python: request to website doesn't gives the html I need in any casesPython:对网站的请求在任何情况下都没有提供我需要的 html
【发布时间】:2022-01-04 07:01:12
【问题描述】:

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

没有用户代理请求的我的请求给了我想要从网站收集一些数据的 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={'User-Agent': 'Custom user agent'},代码不起作用,他找不到类'D(ib) Va(t)'的段落p。

我该如何解决这个问题?

【问题讨论】:

  • 这些页面可能是(部分)使用 Javascript 生成的。如果是这种情况,BeautifulSoup 很可能会“错过”您正在寻找的项目。也可能是每只股票都不存在具有这些类别的段落。在使用基于 Javascript 的网站时尝试 selenium
  • 首先,您应该在浏览器中检查当您关闭 JavaScript(并重新加载页面)时是否可以看到页面,然后您可以显示 response.text 以查看您是否没有收到机器人/垃圾邮件发送者的警告/黑客/等。 - 它可能会通知该页面需要 cookie 或 JavaScript 或发送给您ReCaptcha。第三:检查两个页面是否使用相同的类等。某些服务器可能为不同的用户使用不同的(随机)类。

标签: python html python-requests request-headers


【解决方案1】:

我认为您获取的网址有误

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

将上面的 URL 与 user-agent 一起更改将解决它。

【讨论】:

    【解决方案2】:

    此页面使用JavaScript显示信息但requests,BeautifulSoup无法运行JavaScript

    但是在没有 JavaScript 的情况下在网络浏览器中检查页面我在子页面 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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-22
      • 2015-02-28
      • 2019-01-06
      • 2011-04-10
      • 2012-03-28
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      相关资源
      最近更新 更多