Python Web 抓取 - 403 错误
Posted
技术标签:
【中文标题】Python Web 抓取 - 403 错误【英文标题】:Python Web Scrape - 403 Error 【发布时间】:2018-06-13 09:07:28 【问题描述】:我正在尝试使用 python beautifulsoup 和 urllib 打开这个网站,但我不断收到 403 错误。有人可以指导我解决这个错误吗?
我当前的代码是这样的;
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
my_url = 'https://www.cubesmart.com/florida-self-storage/st--petersburg-self-storage/3337.html?utm_source=local&utm_medium=organic&utm_campaign=googlemybusiness&utm_term=3337'
uClient = uReq(my_url)
但我收到 403 错误。
我四处搜索并尝试使用以下方法,但它也给了我同样的错误。
from urllib.request import Request, urlopen
url="https://www.cubesmart.com/florida-self-storage/st--petersburg-self-storage/3337.html?utm_source=local&utm_medium=organic&utm_campaign=googlemybusiness&utm_term=3337"
req = Request(url, headers='User-Agent': 'Mozilla/5.0')
web_byte = urlopen(req).read()
webpage = web_byte.decode('utf-8')
感谢任何帮助。
【问题讨论】:
听起来很奇怪,看来您必须提供一些身份验证,因为 403 意味着服务器拒绝连接:[description][1],但是这些链接不应该需要任何! [1]:en.wikipedia.org/wiki/HTTP_403 有什么理由不使用requests
库,OP?
@Petar - 没有理由。我仍然是 python 的初学者,不熟悉请求库。你能指导我吗?
requests
模块未安装在 3.8 中,这对我来说是造成与 urllib2、urllib3 和消除歧义的基本指针稀缺的混淆的原因。使用请求模块无法获得太多乐趣,它没有返回会话。它是如何获取会话对象的?
【参考方案1】:
尝试使用requests
中的session()
,如下所示:
import requests
my_session = requests.session()
for_cookies = my_session.get("https://www.cubesmart.com")
cookies = for_cookies.cookies
headers = 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'
my_url = 'https://www.cubesmart.com/florida-self-storage/st--petersburg-self-storage/3337.html?utm_source=local&utm_medium=organic&utm_campaign=googlemybusiness&utm_term=3337'
response = my_session.get(my_url, headers=headers, cookies=cookies)
print(response.status_code) # 200
【讨论】:
@Andersson - 谢谢,这可以打开 url,但是我从这里去哪里呢?我需要编写一个循环来抓取网站的某些部分。如何打印出需要捕获并写入 csv 文件的数据所在位置的 html 部分? 我更喜欢使用lxml.html 进行网页抓取。您可以import lxml.html
,获取页面HTML source = lxml.html.fromstring(response.content)
,然后例如获取所有链接文本节点为print([link.text for link in source.xpath("//a[text()]")])
@ Andersson - 从未遇到过 lxml.html。我得仔细看看它是怎么回事。我假设它具有抓取页面一部分的功能,循环通过我正在寻找的特定标准,然后移动到下一部分等等。例如;获取中 10x10 单位描述、价格、旧价格等,然后向下移动到 9x10 并对所有中号重复,然后移动到大号。
@D-Ru,它可以让你刮掉你想得到的一切。当然,您应该熟悉 XPath 1.0 或 CSS 语法才能轻松定位所需节点...
@ Andersson - 这可能有点超出我的想象,但我会读到它。谢谢以上是关于Python Web 抓取 - 403 错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mechanize 进行抓取,遇到 HTTP 错误 403
网络抓取 ESPN 的 NBA 数据时,有没有办法修复 HTTP 错误 403?
使用 HttpWebRequest.GetResponse() 进行屏幕抓取时出现错误“远程服务器返回错误:(403) Forbidden”