这段代码实现了多进程下载妹子图网站(https://www.2meinv.com/)的图片。使用了requests
和gevent
库来进行并发下载操作,多进程用于加速不同图片集的下载。代码主要涵盖以下几个部分:
get_last_page
: 从链接中提取页数。image_downLoad
: 下载单张图片。img_req
: 解析单个图片集的页面,获取图片链接和标题。- 主程序部分:
save_path
: 图片保存的目录。start
和end
: 图片集的起始和结束ID,表示需要下载哪些图片集的图片。process_num
: 每次启动的进程数。
主要逻辑如下:
- 循环下载图片集,每次启动
process_num
个进程。 - 每个进程调用
img_req
函数,解析图片集的每一页,并使用gevent
并发下载图片。 - 各个进程会并行下载不同的图片集。
这段代码是一个多进程并发下载的示例,但在实际应用中需要注意合法使用爬虫,避免给网站服务器造成过大负担,以及遵守相关法律法规。此外,爬取网站的图片涉及版权问题,需要注意尊重版权。
加入了多进程和协程,提高了下载速度。同时具备了异常处理机制,出现错误不会中断程序.
import os
import re
import time
import multiprocessing
import gevent
from gevent import monkey
from lxml import etree
monkey.patch_all()
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59',
'Referer': 'https://www.2meinv.com/'
}
def get_last_page(text):
return int(re.findall('[^/$]\d*', re.split('/', text)[-1])[0])
def image_downLoad(img_url, img_save_path, img_name):
try:
img_file = img_save_path + img_name
img_data = requests.get(url=img_url, headers=headers).content
if not os.path.exists(img_save_path):
os.makedirs(img_save_path)
if not os.path.exists(img_file):
with open(img_file, 'wb') as fp:
fp.write(img_data)
print(img_name, '图片下载成功!!!')
except BaseException as e:
print(img_url, '下载图片出错了!')
def img_req(urls, path):
try:
no = re.findall('[^-$][\d]', urls)[1] + re.findall('[^-$][\d]', urls)[2]
res = requests.get(urls + ".html", headers=headers).content
r_tree = etree.HTML(res)
pages = r_tree.xpath('/html/body/div[2]/div/h1/span')[0].text
last_page = get_last_page(pages)
except BaseException as e:
print(no, '出错了')
return
img_list = []
for i in range(2, last_page + 1):
try:
next_url = urls + "-" + str(i) + ".html"
print('开始解析:', next_url)
time.sleep(1)
_next = requests.get(next_url, headers=headers).content
_next_html = etree.HTML(_next)
img_url = _next_html.xpath('/html/body/div[5]/a/img/@src')[0]
title = _next_html.xpath('/html/body/div[5]/a/img/@alt')[0]
img_name = img_url.split("/")[-1]
img_save_path = path + title + "/"
img_list.append({'img_url': img_url, 'img_save_path': img_save_path, 'img_name': img_name})
except BaseException as e:
print(title, '图片地址解析出错了')
g = []
for im in img_list:
g.append(gevent.spawn(image_downLoad, im['img_url'], im['img_save_path'], im['img_name']))
gevent.joinall(g)
print(no, '下载完成了!')
if __name__ == '__main__':
save_path = "G:/spider/image/2meinv/"
start = 5000
end = 2000
process_num = 10
while start > end:
process = []
for i in range(start, (start - process_num) - 1, -1):
urls = 'https://www.2meinv.com/article-' + str(i)
m_p = multiprocessing.Process(target=img_req, args=(urls, save_path))
m_p.start()
process.append(m_p)
for k in process:
k.join()
start -= process_num
评论前必须登录!
注册