Python多线程爬取百度图片
时间: 2023-11-05 20:05:45 浏览: 116
python爬取百度图片
以下是Python多线程爬取百度图片的示例代码:
```python
import requests
import os
import re
from queue import Queue
from threading import Thread
class BaiduImageSpider:
def __init__(self, keyword, save_path):
self.keyword = keyword
self.save_path = save_path
self.img_urls = Queue() # 图片链接队列
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
self.page_url = 'https://image.baidu.com/search/index?tn=baiduimage&word={}&pn={}&ie=utf-8'
def download_img(self):
while True:
img_url = self.img_urls.get()
try:
img_data = requests.get(img_url, headers=self.headers, timeout=10).content
except Exception as e:
print('下载图片出错:', e)
else:
file_name = os.path.join(self.save_path, re.split('[/.]', img_url)[-2] + '.jpg')
with open(file_name, 'wb') as f:
f.write(img_data)
print('下载图片:', file_name)
finally:
self.img_urls.task_done() # 标记任务完成
def get_img_urls(self, page_num):
try:
page_url = self.page_url.format(self.keyword, page_num * 30)
html = requests.get(page_url, headers=self.headers, timeout=10).text
except Exception as e:
print('获取图片链接出错:', e)
return []
else:
img_urls = re.findall('"thumbURL":"(.*?)"', html)
return img_urls
def start(self, thread_num=10, page_num=10):
if not os.path.exists(self.save_path):
os.makedirs(self.save_path)
# 创建多个线程用于下载图片
for i in range(thread_num):
t = Thread(target=self.download_img)
t.daemon = True # 设置为守护线程
t.start()
# 获取图片链接并加入队列
for i in range(page_num):
img_urls = self.get_img_urls(i)
for img_url in img_urls:
self.img_urls.put(img_url)
# 等待队列中的任务完成
self.img_urls.join()
if __name__ == '__main__':
spider = BaiduImageSpider('猫', 'images')
spider.start(thread_num=10, page_num=10)
```
上述代码中,`BaiduImageSpider` 类用于爬取百度图片,其中 `download_img()` 方法用于下载图片,`get_img_urls()` 方法用于获取图片链接,`start()` 方法用于启动多线程下载图片。在 `start()` 方法中,首先创建多个线程用于下载图片,然后获取图片链接并加入队列,最后等待队列中的任务完成。其中,`Queue` 类用于实现线程间的通信,`Thread` 类用于创建线程。在 `download_img()` 方法中,使用 `requests` 库下载图片,并将图片保存到指定路径,使用队列的 `task_done()` 方法标记任务完成。在 `get_img_urls()` 方法中,使用 `requests` 库获取页面内容,并使用正则表达式获取图片链接。在 `start()` 方法中,使用 `os` 库创建保存图片的目录,使用参数 `thread_num` 和 `page_num` 分别设置线程数和下载页数。最后,通过调用 `start()` 方法启动多线程下载图片。
阅读全文