python 多线程池爬虫

该博客展示了如何利用Python的`concurrent.futures`模块实现多线程下载网页图片。代码中定义了一个PictureDownload类,包含了设置User-Agent、响应请求、下载图片等方法。通过正则表达式解析HTML页面获取图片链接,并使用ThreadPoolExecutor进行并发下载,提高了下载效率。
摘要由CSDN通过智能技术生成

在这里插入图片描述

# -*- coding:utf8 -*-
import os.path
import re
import requests
import random
from concurrent.futures import ThreadPoolExecutor


class PictureDownload:
    user_agent = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
    ]

    headers = {
        "User-Agent": random.choice(user_agent),
        "sec-ch-ua-platform": "macOS"
    }

    @staticmethod
    def create_picture(name, content):
        name = os.path.join('/Users/wangze/PycharmProjects/Cloudwise/多线程/picture', name)
        with open(name, 'wb') as f:
            f.write(content)

    def response(self, url):
        response = requests.get(url=url, headers=self.headers)
        return response

    def download_picture(self, url):

        try:
            url_list = re.findall(r"<a href='javascript:void\(0\)' class='active2'>...</a> <a href=.*?>(\d+)</a>",
                                  self.response(url).text)[0]

            for current_url in range(1,int(url_list)+1):
                download_url = url.replace('.html','-{}.html'.format(current_url))
                pictures = re.findall('<img src="(.*?)" alt=(.*?) title="" /></a>',
                                      self.response(download_url).text)
                picture_url = pictures[0][0]
                picture_name = pictures[0][0].split('/')[-1]
                print('下载图片信息\n图片链接: {}\n图片名: {}\n'.format(picture_url, picture_name))
                picture_content = self.response(picture_url).content
                self.create_picture(picture_name, picture_content)
        except IndexError:
            pass

    def html_list(self, url):
        web_page = self.response(url).text
        htmls = list(set(re.findall('<li><a href=(.*?)target="_blank" class="dl-pic">', web_page)))
        html = []
        for page in htmls:
            html.append(page.replace('"', '').replace(' ', ''))
        return html

    def run(self):

        for number in range(1,291):
            url = 'https://www.2meinv.com/index-{}.html'.format(number)
            with ThreadPoolExecutor(50) as t:
                for download_url in self.html_list(url):
                    t.submit(self.download_picture,download_url)
                # self.download_picture(download_url)


if __name__ == '__main__':
    picture = PictureDownload()
    picture.run()




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值