领导提出了这样的一个需求,公司要建立一个测试图片库,想要从百度上下载一些图片来扩展图片库,通过人工的方式下载起来比较麻烦,所以想通过Python脚本的方式来爬取百度图片并保存到本地,要实现这个功能,我们可以使用requests库进行网页请求,使用BeautifulSoup库解析HTML,来获取百度图片并保存到本地。
下面我们就来详细介绍一下如何实现这个操作?
安装所需库
确保已经安装了requests和BeautifulSoup库。如果没有可以通过如下的命令安装,如下所示。
pip install requests
pip install beautifulsoup4
编写爬虫代码
下面是一个示例代码,从百度图片中搜索关键词并下载前几张图片到本地,如下所示。
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import quote
def fetch_image_urls(query, num_images):
search_url = "https://image.baidu.com/search/acjson"
params = {
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': 201326592,
'is': '',
'fp': 'result',
'queryWord': query,
'cl': 2,
'lm': -1,
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': -1,
'z': '',
'ic': '',
'hd': '',
'latest': '',
'copyright': '',
'word': query,
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': 0,
'istype': 2,
'qc': '',
'nc': 1,
'fr': '',
'expermode': '',
'force': '',
'pn': 0,
'rn': num_images,
'gsm': '1e',
}
response = requests.get(search_url, params=params)
response.raise_for_status()
data = response.json().get('data', [])
image_urls = [item['thumbURL'] for item in data if 'thumbURL' in item]
return image_urls
def save_images(image_urls, save_dir):
if not os.path.exists(save_dir):
os.makedirs(save_dir)
for idx, url in enumerate(image_urls):
try:
response = requests.get(url)
response.raise_for_status()
image_path = os.path.join(save_dir, f'image_{idx + 1}.jpg')
with open(image_path, 'wb') as f:
f.write(response.content)
print(f"Saved {url} to {image_path}")
except requests.RequestException as e:
print(f"Failed to save {url}: {e}")
def main():
query = "猫" # 替换为你想搜索的关键词
num_images = 10 # 想要下载的图片数量
save_dir = './baidu_images' # 图片保存路径
query = quote(query)
image_urls = fetch_image_urls(query, num_images)
save_images(image_urls, save_dir)
if __name__ == '__main__':
main()
代码中fetch_image_urls函数实现了向百度图片发送图片请求的操作,然后获取到结果中的图片URL。通过save_images方法遍历所有的图片的URL ,并且将图片保存到指定的位置。然后我们可以在main函数中实现指定图片数量、指定下载路径的操作。
注意
通过上面这个方式可能会遇到限制访问的问题,需要对相关操作进行预防。要尽量模拟用户使用浏览器的方式进行间隔请求。或者是使用IP代理池、或者是其他手段来避免被限制。