# 得到网站的网页内容
import multiprocessing
import os
import re
from _operator import mul
from urllib.request import *
import numpy
import gevent
from gevent import monkey
# 打上补丁
monkey.patch_all()
# 下载图片
def down_image(image_url, save_url):
# 下载图片
# response = urlopen(image_url)
# content = response.read()
# # 模块头
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
# 得到请求的对象
req = Request(image_url, headers=headers)
# 通过请求的对象打开内容
response = urlopen(req)
content = response.read()
with open(save_url, 'wb') as f:
f.write(content)
# 下载协程
def gevent_down(images_down, save_count):
# 等待的列表
gevent_list = list()
# 当前的个数
count = 1
# 图片的列表,一个图片开一个协程进行下载
for image_url in images_down:
print(image_url)
save_url = "./images/%s-%s.jpg" % (save_count, count)
count += 1
g_down = gevent.spawn(down_image, image_url, save_url)
gevent_list.append(g_down)
gevent.joinall(gevent_list)
def main():
"""得到爬虫的网页内容"""
# 下载图片地址
image_down_url = "https://www.douyu.com/g_yz"
# 模块头
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}
# 得到请求的对象
req = Request(image_down_url, headers=headers)
# 通过请求的对象打开内容
response = urlopen(req)
# 读取内容
content = response.read().decode("utf-8")
# 得到图片地址通过正则
# data-original="https://rpic.douyucdn.cn/live-cover/appCovers/2018/07/25/3874207_20180725222956_big.jpg"
# 得到图片的地址
image_list = re.findall(r'data-original="(https://.+\.jpg)"', content)
# 为了cpu效率,一个cpu一个进程,进程内开相同数据的协程进行下载
# 得到cpu核数
cpu_count = os.cpu_count()
# 对到对应的cpu核数的下载数量
images = numpy.array_split(image_list, cpu_count)
print(images)
for count in range(cpu_count):
# 开进程下载
multiprocessing.Process(target=gevent_down, args=(images[count], count)).start()
if __name__ == '__main__':
main()
python 多进程中开启多协程,完成多任务爬取网页图片
最新推荐文章于 2024-01-09 11:13:29 发布