我如何有效地检查数据是否在我的GET请求返回?



我正在抓取网页,需要一次解析几千个GET请求。有时这些请求失败,我得到429和/或403错误,所以我需要在解析响应之前检查是否有数据。我写了这个函数:

def check_response(response):
if not response or not response.content:
return False
else:
soup = BeautifulSoup(response.content, "html.parser")
if not soup or not soup.find_all(attrs={"class": "stuff"}):
return False

return True

这是有效的,但是要循环处理几千个响应可能需要相当长的时间。有没有更好的办法?

可以使用response.status_code属性查看响应的状态码。您可以在MDN上找到HTTP错误代码的完整列表,但如果它是>= 400,那么它肯定是一个错误。尝试使用以下代码:

def check_response(response):
if not response or not response.content or response.status_code >= 400:
return False
else:
soup = BeautifulSoup(response.content, "html.parser")
if not soup or not soup.find_all(attrs={"class": "stuff"}):
return False
return True

请注意,您需要向内缩进return True一级,否则由于else-语句,它将永远不会被调用。

尽管有@Michael M的评论,我还是提出以下建议:

def check_response(response): # the value passed is a returned value from requests.get and therefore will never be falsy
try:
response.raise_for_status()
soup = BeautifulSoup(response.txt, 'lxml')
if soup.find_all(attrs={"class": "stuff"}):
return True
except Exception:
pass
return False

最新更新