python 多进程中开启多协程,完成多任务爬取网页图片

# 得到网站的网页内容
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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值