python 爬取百度图片

百度图片搜索页面是动态加载的(使用AJAX技术),初始页面只加载部分图片,更多图片通过滚动或分页请求后端API获取。爬虫需要构造URL发送GET请求,获取响应数据。

python 复制代码
import requests
import os
import time
import json
import urllib.parse

def crawl_baidu_images(keyword, num_images=50):
    # 创建保存目录
    save_dir = f"./{keyword}_images"
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    
    # URL编码关键词
    encoded_keyword = urllib.parse.quote(keyword)
    
    # Headers伪装浏览器
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0",
    }
    
    downloaded = 0
    pn = 0  # 起始索引
    rn = 30  # 每页数量
    
    while downloaded < num_images:
        # 构造API URL
        url = f"https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={encoded_keyword}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word={encoded_keyword}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={pn}&rn={rn}&gsm=1e&{int(time.time() * 1000)}="
        # url=f"https://image.baidu.com/search/acjson?tn=resultjson_com&word={keyword}&ie=utf-8&fp=result&fr=&ala=0&applid=8492805389177329582&pn=30&rn=30&nojc=0&gsm=1e&newReq=1"
        # url="https://image.baidu.com/search/acjson?tn=resultjson_com&word=%E5%8A%A8%E6%BC%AB%E5%A3%81%E7%BA%B8&ie=utf-8&fp=result&fr=&ala=0&applid=10053530779953026824&pn=30&rn=30&nojc=0&gsm=1e&newReq=1"
        try:
            session=requests.Session()
            session.headers.update(headers)
            session.get("https://image.baidu.com",headers=headers)
            response = session.get(url, headers=headers)            
            # 解析JSON(有时需去除BOM)
            text = response.text.replace("\ufeff", "")
            data = json.loads(text)
            
            if "data" not in data:
                print("No more data available.")
                break
            
            for item in data["data"]:
                if downloaded >= num_images:
                    break

                if "thumbURL" in item:
                    img_url = item["thumbURL"]
                else:
                    continue
                
                # 下载图片
                try:
                    img_resp = session.get(img_url, headers=headers, timeout=10)
                    img_resp.raise_for_status()
                    file_path = os.path.join(save_dir, f"image_{downloaded + 1}.jpg")
                    with open(file_path, "wb") as f:
                        f.write(img_resp.content)
                    print(f"下载成功: {file_path}")
                    downloaded += 1
                except Exception as e:
                    print(f"不能下载 {img_url}: {e}")
        
        except Exception as e:
            print(f"Request failed: {e}")
        
        # 下一页
        pn += rn
        time.sleep(1 + random.uniform(0, 1))  # 随机延时避免封禁,需要import random
    
    print(f"Total downloaded: {downloaded}")

# 示例调用
if __name__ == "__main__":
    import random  # 用于随机延时
    keyword = input("Enter keyword: ")  # 如 "美女"
    crawl_baidu_images(keyword, num_images=100)
相关推荐
csbysj20205 小时前
SQLite Truncate Table: 完全删除表中的数据
开发语言
呆萌很5 小时前
字典推导式练习题
python
tung tung tung sahur5 小时前
领略 Rust 抽象之美:自定义迭代器实现全解析
开发语言·后端·rust
ftpeak5 小时前
《Rust MP4视频技术开发》第八章:生成MP4
开发语言·rust·音视频·mp4
闲人编程5 小时前
Python在云计算中的应用:AWS Lambda函数实战
服务器·python·云计算·aws·lambda·毕设·codecapsule
好学且牛逼的马5 小时前
【SSM框架 | day25 spring IOC 与 DI 注解开发】
java·开发语言
小兔崽子去哪了5 小时前
Python 数据分析环境搭建与工具使用指南
python
_OP_CHEN6 小时前
C++进阶:(四)set系列容器的全面指南
开发语言·c++·stl·set·multiset·关联式容器·setoj题
不惑_6 小时前
Java 使用 FileOutputStream 写 Excel 文件不落盘?
开发语言·python
十五年专注C++开发6 小时前
Qt-VLC: 一个集成VLC的开源跨平台媒体播放库
开发语言·qt·媒体·libvlc·vlc-qt