首页 > 编程问答 >Python 抓取 urllib2 HTTP 错误

Python 抓取 urllib2 HTTP 错误

时间:2024-07-27 15:16:55浏览次数:14  
标签:python web-scraping urllib2 http-error

我正在尝试抓取一个网站,但我的代码仅在我打开该网站然后刷新它时才有效。我尝试了多种方法,但不断出现以下两个错误: 第一个:ValueError:“HTTPError:HTTP错误416:请求的范围无法满足”

urlslist = open("list_urls.txt").read()
urlslist = urlslist.split("\n")
for urlslist in urlslist:

htmltext = urllib2.urlopen("www..."+ urlslist)
data = json.load(htmltext)

我也尝试过使用一些标头等,但收到错误“ValueError:无法解码JSON对象”:

req = urllib2.Request('https://www....)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36')

htmltext = urllib2.urlopen(req)
data = json.load(htmltext)

我被难住了,有什么帮助吗?


当然,我可以帮助解决使用 Python 和 urllib2 进行网页抓取时遇到的问题。看起来遇到了“HTTP 错误 416:请求的范围无法满足”和“ValueError:无法解码 JSON 对象”错误。让我们分解一下这些错误以及如何解决它们。

1. HTTP 错误 416:请求的范围无法满足

此错误表示的请求中发送的“Range”标头与服务器可以或愿意返回的内容不匹配。这在处理下载文件或流式传输数据时更为常见,而不是在抓取典型的网页时。

  • 是否尝试下载或流式传输内容? 如果是,可能需要检查请求中发送的“Range”标头,并确保它在服务器的预期范围内。
  • 是否在循环或使用同一连接发出多个请求? 服务器可能不支持持久的“Range”请求。尝试删除任何“Range”标头,或为每个请求使用新的连接。

鉴于提到的代码,似乎并没有明确使用“Range”标头。这可能暗示问题出在尝试抓取的网站,或者它如何处理机器人流量。

2. ValueError:无法解码 JSON 对象

此错误表明 json.load(htmltext) 收到的数据不是有效的 JSON 格式。

  • 确定目标 URL 返回的是 JSON 数据吗? 在浏览器中打开 URL 并检查源代码。它应该是结构化的数据,而不是 HTML 或 XML。
  • 网站是否可能发送了需要处理的额外数据或错误消息? 在尝试将其解析为 JSON 之前,打印 htmltext.read() 的输出以检查其内容。

以下是改进代码的一些技巧:

import urllib2
import json

urlslist = open("list_urls.txt").read().splitlines()

for url in urlslist:
    try:
        req = urllib2.Request(url)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36') 

        response = urllib2.urlopen(req)

        # 检查状态码是否指示成功(200 OK)
        if response.getcode() == 200:
            htmltext = response.read()

            try:
                data = json.loads(htmltext)
                # 处理 JSON 数据
                print(data) 
            except ValueError as e:
                print(f"错误:无法解析 JSON 数据 - {e}")
                print(htmltext) # 打印非 JSON 数据以进行调试
        else:
            print(f"错误:HTTP 状态码 - {response.getcode()}")

    except urllib2.URLError as e:
        print(f"错误:无法抓取 URL - {url} - {e}")

说明:

  • 错误处理: 该代码包含 try...except 块来捕获 urllib2.URLError (用于网络问题)和 ValueError (用于 JSON 解析问题)。这有助于识别和调试问题。
  • 用户代理: User-Agent 标头已更新为更像浏览器,这有时可以帮助避免网站阻止。
  • 状态码检查: 在尝试解析 JSON 之前,代码现在会检查 HTTP 状态码 200 (成功)。

如果在进行这些更改后仍然遇到问题,请提供尝试抓取的特定 URL 和可能遇到的任何特定错误消息,以便我提供更具体的帮助。

标签:python,web-scraping,urllib2,http-error
From: 36295047

相关文章

  • 【Python】利用 face_recognition 库进行人脸检测识别【附完整示例】
    1.背景条件1.1安装所需库首先安装face_recognition和Pillow这两个库。您可以使用以下命令来安装它们:pipinstallface_recognitionPillow-ihttps://pypi.tuna.tsinghua.edu.cn/simple1.2拷贝代码安装完成后,您就可以在本地运行以下提供的代码了。importfac......
  • 太强了,Python+Excel真的是神仙组合!
    本书是由流行开源Python库xlwings的创始人:费利克斯·朱姆斯坦(FelixZumstein)所撰写。他详细阐述了如何将Python与Excel结合使用,让任务自动化,从而实现效率飞跃。为了帮助初学者克服对Python的恐惧,作者特意将教程内容设计成从简单到复杂的顺序进行介绍。这本书PDF共282页,分为4个......
  • 在 Python 中获取精确的 Android GPS 位置
    我尝试在Python中获取Android手机的GPS位置(使用QPython3应用程序)。这种可行,但是Android中似乎有几个LocationProvider:gps:纯gps定位,速度慢,耗能,但非常准确,正是我所需要的。网络:GPS和wifi/小区定位的混合,更快,但不太准确被动......
  • 使用 docker run 将 Python 单击选项传递给 ENTRYPOINT 会出现错误:“在 $PATH 中找不
    我有一个简单的python脚本,我想在docker容器内运行它。它打印一行消息“Hello{name}”。python脚本使用clickCLI界面来定义收件人名称,如果我直接运行它(不使用dockerrun命令),它将如下所示:pythonhello.py-nSmithDockerbuild命令:dockerbuild.-thello:1.......
  • 标题:在 OpenSees Python 中定义具有特定卸载行为的双线性弹塑性材料
    我正在使用Python中的OpenSees,我想定义一种在负载下表现出双线性弹塑性行为的材料。但是,我需要在卸载过程中将材质返回到其原始位置,遵循准确的加载路径。在此处输入图像描述我不确定如何在OpenSees中正确实现卸载行为,我正在寻找实现这一具体材料反应的指导。......
  • 使用正则表达式删除Python中常见的公司名称后缀
    我正在努力删除一些公司名称中的后缀。预期结果如下:原始名称:AppleInc.SonyCorporationFiatChryslerAutomobilesS.p.A.SamsungElectronicsCo.,Ltd.清除名称:AppleSonyFiatChryslerAutomobilesSamsungElectronics到目前为止我所做的:importred......
  • 如何将 Brave 网络浏览器与 python、selenium 和 chromedriver 结合使用?
    我从Google的Chrome切换到Brave网络浏览器并且很难让它像Chrome一样与Brave一起使用。Brave是基于Chromium的,所以我猜它应该不会那么难。我确保我的Brave和Chromedriver处于相同版本,像这样,~/some/path$chromedriver--versionChromeDriver76.0.3......
  • 覆盖 python 应用程序时权限被拒绝
    我使用python制作了一个粗略的自动更新应用程序,并使用freeze-cx制作了exe文件。首先,该应用程序检查firebase服务器上是否有最新版本的文件可用,如果可用则下载zip文件。并且应用程序解压并覆盖文件。this_file_path=sys.executableifgetattr(sys,'frozen......
  • Python数据分析案例55——基于LSTM结构自编码器的多变量时间序列异常值监测
    案例背景时间序列的异常值检测是方兴未艾的话题。比如很多单变量的,一条风速,一条用电量这种做时间序列异常值检测,想查看一下哪个时间点的用电量异常。多变量时间序列由不同变量随时间变化的序列组成,这些时间序列在实际应用中通常来自不同的传感器或数据源。多变量时间序列异......
  • 我没有 python 但我有 python3
    我最近格式化了我的笔记本电脑并安装了Ubuntu操作系统。我没有明确安装Python。为了检查它是否已预安装,我在终端中运行python--version并得到了这个:$python--versionCommand'python'notfound,butcanbeinstalledwith:sudoaptinstallpython3......