【问题标题】:Have made this scraper but the function returns no values? Just empty cells制作了这个刮刀,但函数没有返回值?只是空单元格
【发布时间】:2022-01-03 23:39:09
【问题描述】:

所以我制作了一个网络爬虫,一切似乎都运行良好,但是,没有返回任何值?假设网址有问题,但我似乎看不到任何东西。

import pandas as pd 
    import datetime
    import requests
    from requests.exceptions import ConnectionError
    from bs4 import BeautifulSoup
    
    def web_content_div(web_content, class_path):
        web_content_div = web_content.find_all('div', {'class': class_path})
        try:
            spans = web_content_div[0].find_all('span')
            texts = [span.get_text() for span in spans]
        except IndexError:
            texts = []
    
        return texts
    
    def real_time_price(stock_code):
        url= 'https://uk.finance.yahoo.com/quote/' + stock_code + '?p=' + stock_code + '&.tsrc=fin-tre-srch'
        try:
        
            r = requests.get(url)
            web_content = BeautifulSoup(r.text, 'lxml')
            texts = web_content_div(web_content, 'My(6px) Pos(r) smartphone_Mt(6px) W(100%)')
            if texts != []:
              price, change = texts[0], texts[1]
            else:
              price, change = [], []
    
        except ConnectionError:
            price, change = [], []
    
        return price, change 
    
    Stock = ['BRK-B']
    print(real_time_price('BRK-B'))

【问题讨论】:

  • 你调试了吗?什么(哪一行)返回“无值”(然后返回什么)?
  • 这能回答你的问题吗? scrape data with beautifulsoup results in 404
  • 请在提问前搜索 SO - 这一定是最常见的问题之一,几乎所有情况下的答案都是“用户代理”、“cookies”或“使用selenium启用 JavaScript” - 除非您已检查所有三个,否则很明显您根本没有真正努力寻找答案。

标签: python


【解决方案1】:

该 URL 没有任何问题,您可以通过从命令行运行类似的内容轻松检查该 URL(如果没有,请为您的操作系统获取 curl):

curl --output result.txt "https://uk.finance.yahoo.com/quote/BRK-B?p=BRK-B&.tsrc=fin-tre-srch"

这行得通,并将您所追求的文本保存在 result.txt 中。

所以,这不是 URL - 通常怀疑是用户代理,你瞧,欺骗普通的网络浏览器用户代理工作得很好:

        headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"}
        r = requests.get(url, headers=headers)

这只是一些随机的用户代理字符串,你可以尝试找到更通用的东西,但这里的关键是雅虎不想提供你的 Python 脚本,你必须对雅虎撒谎你的' 真的是为了得到你想要的(你自己承担风险,我不是说你应该这样做,我只是说这怎么可能 - 不要)。

由于您指出上述“不这样做” - 我只能假设您确实尝试过并注意到内容被正确检索,但您传递给 find_all 的表达式没有得到任何结果。那是因为你不能只在一个由空格分隔的字符串中传递所有类:'My(6px) Pos(r) smartphone_Mt(6px) W(100%)'

但是,如果您只传递'smartphone_Mt(6px)',您会注意到它无论如何只能找到一个结果。如果需要其他元素,您可以再做一些工作,做出更具体的选择。

【讨论】:

  • 很抱歉,这行不通:) 但这次我一定会做一些研究啊哈!
  • 它确实可以解决您原本会得到的 404 - 但您在使用 bs4 时可能会遇到其他问题
  • 是的,这就是我感到困惑的原因,我没有收到任何错误,我只得到 ([],[]) 作为我的结果,我认为这很奇怪,因为一切都检查出来了。我之前在抓取 yahoo Finance 时没有使用过用户代理
  • 刚刚看到您的编辑,谢谢,我会继续努力,以便获得股票价格。
【解决方案2】:

当然,您的问题可能有不同的原因,我无法得出结论并建议一个通用的解决方案来彻底解决问题。
首先,我在本地运行您的代码,在制作requests.get 时得到404,并认为url 格式错误或错误。然后我猜 python requests 之前经历过一些奇怪的行为,导致一些问题并且没有得到你想要的。
但后来我猜想,问题可能是由于页面的动态行为,使用javascriptxhr requests 将数据写入页面或使用document.write(sth) 填充页面导致html文件不包含实际数据。
为了解决javascript 的问题,我推荐使用selenium 或类似的库。 Selenium 也可以在您加载页面时出现pop-up 的情况下为您提供帮助,例如对话框显示“您是否同意我们的规则或接受 cookie 或...”,您可以通过单击右键来处理这些条件。
最后,您可以尝试在标题中使用user-agent,有时可能会出现这种情况。我查看了your sites' robots.txt 并发现它Disallows 一些代理,因此更改此参数始终是一个好主意(以及服务器检查的其他一些参数)。 (也尝试将您的查询params 分开,这样更干净):

   ...
   url= 'https://uk.finance.yahoo.com/quote/' + stock_code
   params = {
        'p': stock_code,
        '.tsrc': 'fin-tre-srch',
    }
    headers = {'user-agent': 'my-app/0.0.1'}
    # alternatively: headers = {'user-agent': 'PostmanRuntime/7.28.4'}
    url = 'https://uk.finance.yahoo.com/quote/BRK-B'
    try:
        r = requests.get(url, params=params, headers=headers)
   ...

【讨论】:

  • 对不起,我想我可能措辞不好,没有值我的意思是我得到 0 个错误,但是当我运行代码时没有打印任何内容。我想我错过了一些非常基本的东西:(
猜你喜欢
  • 2021-01-31
  • 1970-01-01
  • 2015-09-18
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2020-07-12
  • 1970-01-01
相关资源
最近更新 更多