【爬虫】如何解决爬虫爬取图片时遇到百度安全验证的问题?即页面上没有显示图片的源地址,没有img标签,只有div标签

本文介绍了在使用Python爬虫爬取百度图片时遭遇的反爬虫机制,该机制导致只显示div标签而无img标签和图片URL。解决方案是通过增加更真实的请求头,包括Cookie、Accept、Accept-Encoding和Accept-Language等字段,以模仿人类浏览器行为。作者提供了完整的代码示例,并鼓励读者尝试并点赞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,我是好学的小师弟。这周工作中我在爬虫爬取百度图片的时候 遇到了一个问题,即爬取百度图片的时候,打印爬取的百度图片页面,打印出来的text正文中只有div标签,没有想要下载图片的img标签和图片src原图片地址。如下所示:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title>百度安全验证</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0">
    <meta name="format-detection" content="telephone=no, email=no">
    <link rel="shortcut icon" href="https://www.baidu.com/favicon.ico" type="image/x-icon">
    <link rel="icon" sizes="any" mask href="https://www.baidu.com/img/baidu.svg">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
    <link rel="stylesheet" href="https://ppui-static-wap.cdn.bcebos.com/static/touch/css/api/mkdjump_0635445.css" />
</head>
<body>
    <div class="timeout hide">
        <div class="timeout-img"></div>
        <div class="timeout-title">网络不给力,请稍后重试</div>
        <button type="button" class="timeout-button">返回首页</button>
    </div>
    <div class="timeout-feedback hide">
        <div class="timeout-feedback-icon"></div>
        <p class="timeout-feedback-title">问题反馈</p>
    </div>
<script src="https://wappass.baidu.com/static/machine/js/api/mkd.js"></script>
<script src="https://ppui-static-wap.cdn.bcebos.com/static/touch/js/mkdjump_fbb9952.js"></script>
</body>
</html>

后来发现了,这是百度的反爬虫机制所导致的。察觉到你是爬虫而不是人为下载。

 <head>
    <meta charset="utf-8">
    <title>百度安全验证</title>

 思路:一般我们都是用requests发起get请求,有的时候我们还会加个请求头。但是这个很容易被反爬虫所查获,所以我们尽量要装的像一点,把自己伪装成一个"真人"

header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'}  #header里面只有一个user-agent太少了

解决方法:打开F12,这里以谷歌浏览器为例

把这四个键值对也给copy下来,加到你之前写的请求头header中

'Cookie':'',#cookie你先自己登录百度帐号就有了
'Accept':'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.9'

 即应该写成下面这样

header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
        'Cookie':'',#cookie需要你先自己在浏览器登录百度账号,再按f12就有了
        'Accept':'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
        'Accept-Encoding':'gzip, deflate, br',
        'Accept-Language':'zh-CN,zh;q=0.9'
        }

这样你就能成功获取页面信息,接着进行正则表达式,找到图片源地址了

完整代码

import re
import requests
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
        'Cookie':'',#自己先在浏览器登录百度账号
        'Accept':'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
        'Accept-Encoding':'gzip, deflate, br',
        'Accept-Language':'zh-CN,zh;q=0.9'
        }
url='https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E5%A4%B4%E5%83%8F'
html=requests.get(url,headers=header)
html.encoding='utf8'
print(html.text)

新人创作不易,觉得不错的看官,点个赞吧,么么哒!!!

转载注明出处!

<think>嗯,用户问的是Python爬虫图片和视频的代码区别在哪里。首先,我需要回想一下爬虫处理不同资源的一般流程。通常,爬取数据的基本步骤是发送请求、获取响应、解析内容,然后保存数据。图片和视频都属于二进制文件,但可能在处理方式上有差异。 首先,考虑请求和响应的部分。图片和视频都是通过HTTP GET请求获取的,这部分可能没有太大区别。不过,视频文件通常比图片大很多,可能需要处理流式传输或分块下载的问题。比如,视频可能不会一次性加载,而是分段加载,这时候可能需要用不同的方法,比如设置stream=True参数,分块读取数据。 然后,解析内容。图片的URL通常直接在HTMLimg标签里,直接用src属性就能找到。而视频的源地址可能更复杂,有时候是嵌入在JavaScript中,或者需要解析视频平台的API响应。有些网站还会对视频进行加密或使用动态加载,这时候可能需要分析网络请求,找到真正的视频链接,比如通过检查浏览器的开发者工具中的网络活动。 接下来是保存数据。两者都是二进制写入文件,但视频文件较大,可能需要分块写入,避免内存不足。例如,使用requests库时,对于大文件可以迭代内容块,逐块保存。而图片通常较小,可以一次性读取整个内容并保存。 另外,处理反爬机制时,视频网站可能有更强的防护,比如检查Referer、User-Agent,甚至需要处理Cookies或登录状态。图片可能相对简单,但也不排除有些网站会对图片链接进行保护,比如动态生成token或过期时间。 还有,存储方面的考虑。视频文件占用空间大,下载时间长,可能需要断点续传或错误重试机制。而图片下载失败的话,重试的成本较低。 可能用户在实际操作中遇到下载视频的问题,比如代码在下载大文件时崩溃,或者找不到正确的视频链接。需要解释如何分块下载,处理流式请求,以及解析复杂视频链接的方法。 最后,总结两者的主要区别在于处理大文件的方式、链接解析的复杂度、反爬机制的强度,以及存储时的注意事项。可能需要给出示例代码,对比两者的不同,比如使用stream参数,分块读取,或者不同的解析方法。</think>在Python爬虫中,图片和视频的爬取代码主要有以下核心区别,我们通过关键步骤对比来理解: --- ### **1. 数据量级与请求处理** - **图片**: 通常文件较小(KB~MB级),可直接通过一次性请求下载: ```python response = requests.get(img_url) with open("image.jpg", "wb") as f: f.write(response.content) # 直接写入全部二进制数据 ``` - **视频**: 文件较大(MB~GB级),需启用流式传输避免内存溢出: ```python with requests.get(video_url, stream=True) as r: # 关键参数 stream=True for chunk in r.iter_content(chunk_size=1024*1024): # 分块读取 if chunk: f.write(chunk) ``` --- ### **2. 链接解析复杂度** - **图片链接**: 通常直接暴露在HTML标签中,易于解析: ```html <img src="https://example.com/image.jpg"> <!-- 直接提取src属性 --> ``` - **视频链接**: 常隐藏于JavaScript动态加载数据或加密参数中,例如: ```html <video> <!-- 真实地址可能通过API返回 --> <source data-src="encrypted_video_url?v=123&token=abc"> </video> ``` 需通过分析网络请求(如XHR/Fetch)获取真实地址。 --- ### **3. 反爬机制差异** - **图片**: 简单反爬:校验`Referer`或`User-Agent` 解决方案: ```python headers = {"User-Agent": "Mozilla/5.0", "Referer": "https://example.com"} ``` - **视频**: 高级防护:签名验证、限速、IP封禁 需额外处理: ```python # 示例:带时间戳和签名的视频链接 video_url = "https://example.com/video.mp4?expires=1620000000&sign=abcd1234" ``` --- ### **4. 存储优化** - **图片**: 直接按URL后缀保存(如`.jpg`, `.png`) - **视频**: 可能需强制指定格式(部分链接无后缀): ```python with open("video.mp4", "wb") as f: # 忽略链接中的格式,强制命名为.mp4 ``` --- ### **总结对比表** | 特性 | 图片 | 视频 | |---------------------|-------------------------------|-------------------------------| | **请求方式** | 一次性下载 | 流式分块下载 (`stream=True`) | | **链接可见性** | 直接暴露在HTML中 | 常隐藏于JS或API响应 | | **反爬强度** | 较低 | 较高(签名/IP限速等) | | **存储内存占用** | 低 | 高(需分块写入) | --- ### **典型代码场景对比** 假设爬取目标:图片链接为`img_url`,视频链接为`video_url` ```python # 图片下载(简单场景) import requests resp = requests.get(img_url, headers=headers) open("demo.jpg", "wb").write(resp.content) # 视频下载(大文件优化) resp = requests.get(video_url, stream=True, headers=headers) with open("demo.mp4", "wb") as f: for chunk in resp.iter_content(chunk_size=8192): if chunk: f.write(chunk) ``` --- ### **扩展建议** 1. 视频爬虫优先使用`HEAD`请求预检查文件大小: ```python r = requests.head(video_url) file_size = int(r.headers.get("Content-Length", 0)) ``` 2. 视频网站推荐工具: - 使用`selenium`处理动态加载内容 - 配合`FFmpeg`合并分段视频(如m3u8格式) 理解这些区别后,可根据目标资源类型选择合适的策略,平衡效率与稳定性。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好学的小师弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值