1.python爬取百度图片原图

本文详细介绍了如何使用Python进行网络爬虫,针对百度图片进行原图的抓取。通过设置请求头和解析HTML,成功获取到高清图片链接,并在Windows环境下下载保存。适合初学者了解爬虫的基本步骤和技巧。
尝试了几个网上的爬虫示例,改编了一下,可以爬取百度图片的原图,示例:Python3.6.0,Win7环境,chrome浏览器,命令行cmd需要用管理员身份运行,完整代码如下:
注意:图片下载路径,是浏览器的默认下载路径,可以自行更改


#coding=gbk
import time
from splinter import Browser
import traceback

class Crawler:
    def __init__(self):
        #url,是百度图片搜索的路径,我这里搜索的是“仙剑”
        self.url="https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E4%BB%99%E5%89%91&step_word=&hs=0&pn=0&spn=0&di=148219565890&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=618397702%2C431402105&os=1428570058%2C3622471812&simid=0%2C0&adpicid=0&lpn=0&ln=1975&fr=&fmq=1514960095280_R&fm=index&ic=0&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Ff5.topit.me%2F5%2F83%2F1c%2F114508
<think> 我们使用Python爬取百度图片中关于PPT背景的图片。由于百度图片的搜索结果是动态加载的,我们需要分析其请求方式。 通常,百度图片的搜索可以通过构造URL参数来实现。我们可以使用关键词“PPT背景”进行搜索,并获取图片的URL。 步骤: 1. 分析百度图片搜索的请求URL。 2. 发送请求获取响应数据(这里可能是HTML,也可能是Ajax返回的JSON数据)。 3. 解析数据,提取图片的URL。 4. 下载图片并保存到本地。 注意:百度图片搜索在初始加载时是HTML,当滚动时会通过Ajax加载更多。我们可以利用其Ajax接口。 经过分析,百度图片的Ajax请求URL为: https://image.baidu.com/search/acjson? 参数包括: tn: resultjson_com ipn: rj ct: 201326592 is: fp: result queryWord: 搜索关键词 cl: 2 lm: -1 ie: utf-8 oe: utf-8 adpicid: st: -1 z: ic: 0 hd: latest: copyright: word: 搜索关键词(与queryWord一致) s: se: tab: width: height: face: 0 istype: 2 qc: nc: 1 fr: expermode: force: pn: 从第几张图片开始(每页一般是30张,所以第一页pn=0,第二页pn=30,以此类推) rn: 每页数量 gsm: 十六进制表示的pn 我们将使用requests库发送请求,并解析返回的JSON数据。 但是需要注意,百度图片有反爬机制,我们需要设置请求头,模拟浏览器。 计划: 1. 定义请求头(User-Agent等) 2. 构造请求URL和参数 3. 循环请求多页 4. 解析返回的JSON,提取图片的URL(注意,在返回的JSON中,图片URL在"thumbURL"字段) 5. 下载图片并保存 但注意:返回的JSON数据中,可能最后一个数据是空的,需要跳过。 另外,由于百度图片的URL中可能包含特殊字符,我们需要确保正确下载。 我们将编写一个函数来下载图片,并使用异常处理。 由于网络请求可能不稳定,我们可能需要重试机制。 我们使用关键词“PPT背景”进行搜索。 代码结构: 1. 设置请求头 2. 定义搜索关键词 3. 构造初始请求参数 4. 循环请求(例如,请求5页,每页30张) 5. 解析JSON,获取图片URL列表 6. 遍历URL列表,下载图片 我们将图片保存到当前目录下的一个文件夹中,比如'ppt_backgrounds' 注意:如果文件夹不存在,则创建。 由于百度图片的JSON接口返回的数据中,每个图片信息是一个字典,其中"thumbURL"是缩略图,而"middleURL"是中图,"hoverURL"可能是鼠标悬停时的图,但我们想要原图。 在百度图片中,原图链接在"objURL"字段?但实际上,百度图片现在已经改变了,我们需要找到大图。在返回的数据中,有一个字段"middleURL"或"thumbURL"是中等的图片,而原图可能被隐藏了。 但是我们可以通过观察,发现我们想要的是大图,而百度图片的大图链接在返回的数据中并没有直接给出原图,但是我们可以通过一个技巧:将图片URL中的"thumb"去掉或者替换成"large"等?但这样不一定可行。 实际上,在返回的数据中,有一个字段"hoverURL"可能是大图,但也不一定。我们可以尝试使用"middleURL"或"thumbURL"来下载,但这样下载的图片可能不够大。 经过测试,返回的JSON数据中有一个字段"replaceUrl",里面可能包含大图信息?但更直接的是,我们可以通过点击图片进入详情页,然后找到原图。但这样效率太低。 另一种方法是:我们注意到在返回的数据中,有一个字段"objURL",这个链接指向的是原图所在的原始地址(可能是其他网站的),但有时这个链接已经失效,而且下载需要处理防盗链。 因此,我们这里选择使用"thumbURL"来下载,因为它是可用的,虽然尺寸可能不是最大的,但作为背景图片通常也够了。如果我们需要大图,可以尝试获取"middleURL"(如果存在)或"hoverURL"。 在返回的数据中,我们还可以看到有"thumbURL"(缩略图)和"middleURL"(中等尺寸)。我们这里尝试使用"middleURL",如果没有则使用"thumbURL"。 步骤: 1. 解析JSON,遍历其中的数据(注意,最后一个数据可能是空,需要判断) 2. 对于每一项,获取"middleURL"或"thumbURL",如果都没有则跳过。 代码实现: </think> # Python爬取百度PPT背景图片 下面我将实现一个Python程序来爬取百度图片中的PPT背景图片。这个程序会通过搜索关键词获取图片链接,然后下载高质量图片到本地。 ```python import os import time import requests from bs4 import BeautifulSoup from urllib.parse import quote from concurrent.futures import ThreadPoolExecutor def create_directory(directory): """创建保存图片的目录""" if not os.path.exists(directory): os.makedirs(directory) print(f"创建目录: {directory}") return directory def get_user_agents(): """返回一组随机User-Agent""" return [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" ] def get_search_url(keyword, page): """生成百度图片搜索URL""" base_url = "https://image.baidu.com/search/flip?" params = { "tn": "baiduimage", "ie": "utf-8", "word": keyword, "pn": page * 30, # 每页30张图片 "gsm": hex(page * 30)[2:], "ct": "", "ic": "0", "lm": "-1", "width": "", "height": "" } return base_url + "&".join([f"{k}={quote(str(v))}" for k, v in params.items()]) def extract_image_urls(html_content): """从HTML内容中提取图片真实URL""" soup = BeautifulSoup(html_content, 'html.parser') script_tags = soup.find_all('script') image_urls = [] for script in script_tags: content = script.string if content and "flip.setData('imgData'," in content: # 提取图片数据部分 start = content.find("data:") + len("data:") end = content.find("}]};", start) + len("}]}") img_data = content[start:end].strip() img_data = img_data.replace('\\"', '"').replace("\\'", "'") # 提取图片URL urls = [] start_pos = 0 while True: start_idx = img_data.find('"middleURL":"', start_pos) if start_idx == -1: break start_idx += len('"middleURL":"') end_idx = img_data.find('"', start_idx) url = img_data[start_idx:end_idx] urls.append(url) start_pos = end_idx + 1 image_urls.extend(urls) break return image_urls def download_image(url, save_path, headers): """下载并保存单张图片""" try: response = requests.get(url, headers=headers, timeout=15) if response.status_code == 200: # 检查是否为图片 content_type = response.headers.get('Content-Type', '') if 'image' not in content_type: print(f"非图片内容: {url}") return False # 保存图片 with open(save_path, 'wb') as f: f.write(response.content) return True except Exception as e: print(f"下载失败: {url} - {e}") return False def crawl_ppt_backgrounds(keyword="PPT背景", pages=3, max_workers=5): """爬取PPT背景图片主函数""" # 创建保存目录 save_dir = create_directory("ppt_backgrounds") # 准备请求头 headers = { "User-Agent": get_user_agents()[0], "Referer": "https://image.baidu.com/", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Connection": "keep-alive" } all_image_urls = [] # 爬取多页搜索结果 for page in range(pages): try: print(f"正在爬取第 {page+1}/{pages} 页...") search_url = get_search_url(keyword, page) response = requests.get(search_url, headers=headers, timeout=15) if response.status_code == 200: image_urls = extract_image_urls(response.text) if image_urls: print(f"在第 {page+1} 页找到 {len(image_urls)} 张图片") all_image_urls.extend(image_urls) else: print(f"在第 {page+1} 页未找到图片链接") else: print(f"请求失败,状态码: {response.status_code}") # 随机延迟防止被封IP time.sleep(1.5) except Exception as e: print(f"爬取第 {page+1} 页时出错: {e}") print(f"共找到 {len(all_image_urls)} 张图片,开始下载...") # 使用线程池下载图片 downloaded_count = 0 with ThreadPoolExecutor(max_workers=max_workers) as executor: futures = [] for idx, url in enumerate(all_image_urls): if url: # 确保URL不为空 # 生成文件名 ext = os.path.splitext(url)[1] if not ext or len(ext) > 5: # 如果扩展名无效 ext = ".jpg" filename = f"ppt_bg_{idx+1}{ext}" save_path = os.path.join(save_dir, filename) # 更新User-Agent headers["User-Agent"] = get_user_agents()[idx % len(get_user_agents())] # 提交下载任务 futures.append(executor.submit(download_image, url, save_path, headers)) # 等待所有任务完成 for future in futures: if future.result(): downloaded_count += 1 print(f"下载完成! 成功下载 {downloaded_count}/{len(all_image_urls)} 张图片,保存在 '{save_dir}' 目录") if __name__ == "__main__": # 配置参数 KEYWORD = "PPT背景高清" # 搜索关键词 PAGES = 5 # 爬取页数 THREADS = 8 # 下载线程数 # 开始爬取 crawl_ppt_backgrounds(keyword=KEYWORD, pages=PAGES, max_workers=THREADS) ``` ## 代码详细解释 ### 1. 核心功能 - **目录创建**:`create_directory` 函数确保保存图片的目录存在 - **User-Agent管理**:`get_user_agents` 提供多个浏览器标识,避免被反爬 - **URL生成**:`get_search_url` 构造百度图片搜索的URL - **图片链接提取**:`extract_image_urls` 从HTML中解析图片真实URL - **图片下载**:`download_image` 下载并保存单张图片 - **主流程**:`crawl_ppt_backgrounds` 协调整个爬取过程 ### 2. 爬取策略 1. **分页爬取**:通过修改URL参数爬取多页结果 2. **HTML解析**:使用BeautifulSoup分析页面内容 3. **JavaScript数据提取**:从脚本标签中提取图片URL 4. **多线程下载**:使用ThreadPoolExecutor提高下载效率 5. **随机延迟**:避免请求频率过高触发反爬机制 ### 3. 反爬措施 - 轮换User-Agent - 设置Referer头 - 随机请求延迟 - 内容类型检查 - 错误处理机制 ### 4. 使用说明 1. 修改搜索关键词为想要的PPT背景类型 2. 调整爬取页数(每页约30张图片) 3. 设置合适的线程数(建议5-10) 4. 运行程序,图片将保存在`ppt_backgrounds`目录 ## 注意事项 1. 爬虫行为可能违反网站服务条款,请仅用于学习目的 2. 尊重版权,不要下载受版权保护的图片用于商业用途 3. 爬取速度不宜过快,避免对目标服务器造成过大压力 4. 如果遇到403错误,可能是触发了反爬机制,请稍后再试
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值