【问题标题】:Python Web Scrape - 403 ErrorPython Web 抓取 - 403 错误
【发布时间】: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 和消除歧义的基本指针稀缺的混淆的原因。使用请求模块无法获得太多乐趣,它没有返回会话。它是如何获取会话对象的?

标签: python python-3.x web-scraping urllib http-status-code-403


【解决方案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 - 这可能有点超出我的想象,但我会读到它。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多