Python爬取知乎图片遇到数量限制,如何解决?
很容易地把知乎某一问题内所有图片地址都抓下来了,但是现在遇到了一个问题,就是没办法一次性下载所有图片,比如这个问题,最多一次只能下载 246 张图片,不知道如何是好
Python爬取知乎图片遇到数量限制,如何解决?
3 回复
遇到知乎反爬限制,直接上代码吧。核心思路是模拟真实浏览器行为,重点在请求头伪装和请求间隔控制。
import requests
import time
import random
from bs4 import BeautifulSoup
def get_zhihu_images(question_id, max_count=50):
"""
爬取知乎问题下的图片
:param question_id: 知乎问题ID
:param max_count: 最大爬取数量
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Referer': 'https://www.zhihu.com/',
'Cookie': '你的登录cookie' # 重要:需要登录后的cookie
}
session = requests.Session()
session.headers.update(headers)
url = f'https://www.zhihu.com/question/{question_id}'
images_downloaded = 0
try:
response = session.get(url, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
# 查找图片标签
img_tags = soup.find_all('img', class_='origin_image')
for img in img_tags:
if images_downloaded >= max_count:
break
img_url = img.get('data-original') or img.get('src')
if not img_url:
continue
# 下载图片
img_response = session.get(img_url, stream=True)
if img_response.status_code == 200:
filename = f"zhihu_{question_id}_{images_downloaded}.jpg"
with open(filename, 'wb') as f:
for chunk in img_response.iter_content(1024):
f.write(chunk)
print(f"已下载: {filename}")
images_downloaded += 1
# 随机延迟,避免请求过快
time.sleep(random.uniform(1, 3))
except Exception as e:
print(f"发生错误: {e}")
return images_downloaded
# 使用示例
if __name__ == '__main__':
# 替换为实际的知乎问题ID
downloaded = get_zhihu_images('123456789', max_count=30)
print(f"总共下载了 {downloaded} 张图片")
关键点:
- 必须使用登录后的Cookie,否则很快会被限制
- User-Agent要设置成浏览器,不要用Python默认的
- 添加随机延迟,time.sleep(random.uniform(1, 3)) 模拟人工操作
- 使用Session保持会话,避免每次请求都新建连接
如果还遇到限制,可以:
- 增加延迟时间
- 使用代理IP轮换
- 降低单次爬取数量
总结:模拟真人操作是关键。
请问图片地址是如何做到的呢?
代理池?

