《零基础:21天搞定Python分布爬虫》练习-斗图啦(多线程)

 python   高蒙   阅读(1380)   评论(0)   2019-04-01 16:22:17     


from urllib import request
from lxml import etree
from queue import Queue
import requests
import os
import re
import threading

IMAGES_DIR = './images/'


# 生产者
class Producter(threading.Thread):
    def __init__(self, page_queue, imgs_queue, *args, **kwargs):
        super(Producter, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.imgs_queue = imgs_queue
        self.headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
            "cookie": "__cfduid=d2a61de29a61781abd96707aa8981826c1554019090; UM_distinctid=169d2c18026211-001319c41bb32e-3c604504-1fa400-169d2c180275e4; _ga=GA1.2.679455519.1554019091; _gid=GA1.2.1187621390.1554019091; yjs_id=ca79619b6d61f50846a806c1e6d8172b; ctrl_time=1; CNZZDATA1256911977=696277388-1554018365-%7C1554019265; XSRF-TOKEN=eyJpdiI6IlZmQXFuVXJ5Q3VTZDZOb3I2ZnhTemc9PSIsInZhbHVlIjoieXVJekZkc1IwMExxZnlLalY1Tk1IYit5M2NKaGtkeXNDaHRqYTJSVFlwRG1GK2ttekMzam9tMDZVWkt2WWRFXC8iLCJtYWMiOiI2NTA1OGRkMmNiNDFmZDEzMTgxZmU3NzQ2NzRlZGYzNThiZjkyYzMxZjkxZjM5YTNkMTI2MjQ1NTlhY2ViMmMyIn0%3D; doutula_session=eyJpdiI6InFiazlaZU4xdDZ6K2N4cW5talNid2c9PSIsInZhbHVlIjoiVTdSOFF6SExVN25mdTNCWWF3bzdXSFFHNTJOQnh3YUpnQm9RRDRESmQ0ZzdEa2VZejcrc0s3dEtFXC9EZFJRa0oiLCJtYWMiOiJjOWU1ZTBmNjU5MmJhZTVmNDRjODU0YmIzYmJjMDI1YTAxNmRhNTExZTkwOTQ5YjkwMGEyYmRmOGY0NzNhNjFiIn0%3D",
        }

    def run(self):
        while True:
            if self.page_queue.empty():
                print('分页数据获取结束~')
                break
            self.parse_url(self.page_queue.get())

    def parse_url(self,url):
        res = requests.get(url, headers=self.headers)
        text = res.text
        html = etree.HTML(text)
        imgs_url = html.xpath('//div[@class="page-content text-center"]//a//img[@class!="gif"]')
        for i in imgs_url:
            # 获取图片地址 图片名称数据
            img = i.get("data-original")
            img = img.strip('!dta')
            filename = i.get("alt")
            # 替换特殊字符
            filename = re.sub(r'[\??\.\,,\*\!!。\/\%]', '', filename)
            # 获取图片的扩展名
            ext = os.path.splitext(img)[1]
            # 写入元祖的方式
            self.imgs_queue.put((img, IMAGES_DIR + filename + ext))
            # print(img, IMAGES_DIR + filename + ext)


# 消费者
class Consumer(threading.Thread):
    def __init__(self, page_queue, imgs_queue, *args, **kwargs):
        super(Consumer, self).__init__(*args, **kwargs)
        self.page_queue = page_queue
        self.imgs_queue = imgs_queue

    def run(self):
        while True:
            if self.page_queue.empty() and self.imgs_queue.empty():
                print('图片下载结束~')
                break
            # 下载图片
            img_url, filename = self.imgs_queue.get()
            request.urlretrieve(img_url, filename)
            print(filename + '下载完成')


def main():
    # 先判断文件夹是否存在
    if os.path.exists(IMAGES_DIR) is False:
        os.mkdir(IMAGES_DIR)

    page_queue = Queue(100)
    imgs_queue = Queue(7000)

    for i in range(1, 101):
        # 功能只测试第20页
        if i > 20:
            break
        url = 'https://www.doutula.com/photo/list/?page=%d' % i
        page_queue.put(url)

    # 开启5个线程执行生产者
    for i in range(3):
        t1 = Producter(page_queue, imgs_queue)
        t1.start()

    # 开始3个线程执行消费者
    for i in range(3):
        t2 = Consumer(page_queue, imgs_queue)
        t2.start()


if __name__ == '__main__':
    main()





相关文章



我要评论


站长昵称:(*)

输入内容:


评论列表


高蒙

男,程序猿一枚

 

人生要是没有理想, 那跟一条咸鱼有什么分别。


关于我

  http://www.shuchengxian.com

高蒙个人博客是以PHP技术为主的程序员个人博客。博客主要发布php开发中遇到的问题以及解决办法,同时个人博客也分享网站模板素材,jquery插件等方面素材。


站点声明:相关侵权、举报、投诉及建议等,请发E-mail:936594075#qq.com(#替换成@)。

Copyright © 2018, www.shuchengxian.com, All rights reserved. 个人博客皖公网安备 34152302000022号 皖ICP备15015490号

关键词:个人博客,PHP博客,PHP博客程序,高蒙博客,高蒙个人博客,php程序员博客,程序员个人博客