【问题标题】:Beautiful Soup return none object for non-dynamic contentBeautiful Soup 为非动态内容返回 none 对象
【发布时间】:2022-01-20 18:23:51
【问题描述】:
import requests as requests
from bs4 import BeautifulSoup
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',
        'cache-control': 'private, max-age=0, no-cache'
    }
htmlFile=requests.get('https://www.goodreads.com/shelf/show/1', headers=headers).text
sou=BeautifulSoup(htmlFile,"html.parser")
re = sou.find(class_="leftContainer").findAll(class_="bookTitle")
print(re)

内容不是动态的,不需要JS之类的。
那么为什么有时 None 对象会返回呢?
反复尝试的while循环可以解决问题,但这并不是真正的解决方案。

【问题讨论】:

  • 我实际上无法在我的机器上重现此错误,可能运行了大约 50 次。有时有多罕见?
  • 大约170次后才收到,可能是服务器限制了请求数?
  • 我在大约第 100 个请求时得到了它。响应代码是 504,这意味着这是服务器的问题,这可能意味着您同时发出了太多请求
  • 谢谢,你是怎么得到响应码的?美汤里有支持这个的功能吗?
  • 好吧,你必须先了解请求。 requests.get 方法返回具有 status_code 字段的 Response 对象。在直接使用text之前,您至少必须打印它

标签: python beautifulsoup python-requests


【解决方案1】:

错误

重现问题后,我推断服务器返回不同 100-200 个请求后的响应。标准的、可解析的响应和没有数据要抓取的响应之间的区别在于,不同的响应作为偶尔的错误页面给出并返回代码[504]。这段代码本质上意味着服务器超时或出错,因此返回一个没有书籍的默认 HTML 页面,从而导致代码中的错误。

来自错误的测试用例响应的片段:

<h1>
                            Goodreads request took too long.
                        </h1>
<p>
                            The latest request to the Goodreads servers took too long to respond. We have been notified of the issue and are looking into it.
                        </p>

解决方案

这可能是偶然的,也可能是为了防止抓取工具使用过多系统资源而施加的限制,但这很可能只是一个正常的服务器端错误,并且是不可避免的。只需在响应错误的情况下包含 try/except 捕获,然后重试请求!

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    相关资源
    最近更新 更多