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} 张图片")

关键点:

  1. 必须使用登录后的Cookie,否则很快会被限制
  2. User-Agent要设置成浏览器,不要用Python默认的
  3. 添加随机延迟,time.sleep(random.uniform(1, 3)) 模拟人工操作
  4. 使用Session保持会话,避免每次请求都新建连接

如果还遇到限制,可以:

  • 增加延迟时间
  • 使用代理IP轮换
  • 降低单次爬取数量

总结:模拟真人操作是关键。


请问图片地址是如何做到的呢?

代理池?

回到顶部