无法使用Python和漂亮的汤进行网络抓取

时间:2019-12-10 14:20:05

标签: python python-requests http-status-code-403

我正在尝试进行一些网络爬网(用于使用Python udemy自动完成无聊的课程),但是我一直遇到HTTPError: 403 Client Error: HTTP Forbidden for url:错误。这是我一直在使用的代码:

import bs4
import requests
ro = requests.get('https://www.amazon.com/Automate-Boring-Stuff-Python-Programming/dp/1593275994/')
ro.raise_for_status()

这是我收到的错误消息:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    ro.raise_for_status()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: HTTP Forbidden for url: https://www.carsales.com.au/cars/details/2012-mazda-3-neo-bl-series-2-auto/SSE-AD-6368302/

我已经在线阅读了有关更改用户代理的信息,但我也不知道这是什么或如何执行。有人可以在这里提供一些帮助吗?我完全迷路了,我似乎无法在任何地方获得任何网络抓取信息。如果有帮助,我就在Mac上。谢谢。

2 个答案:

答案 0 :(得分:1)

requests包允许您更改用户代理,这使服务器认为您是其他浏览器。

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0'}
ro = requests.get('https://www.amazon.com/Automate-Boring-Stuff-Python-Programming/dp/1593275994/', headers=headers)
ro.raise_for_status()

soup = BeautifulSoup(ro.text, 'html.parser')
print(soup.prettify())

答案 1 :(得分:0)

首先,我建议使用if语句或切换用例语句将ro.raise_for_status()替换为ro.status_code,但是,如果要使用ro.raise_for_status(),则可以在try内使用它-catch块。关于该错误,Amazon似乎阻止了具有默认requests模块用户代理的请求,为解决此问题,您可能需要将用户代理更改为以下内容:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36,以获取更多信息。有关实施此操作的信息,请检查this页的 使用Python请求 部分。

P.S:请确保检查Web抓取Amazon是否合法。