实例一下python多线程图片小爬虫

tips

这个多线程已经说的比较清楚了,这篇博客是前两篇有关于多线程的一个实例衍生。
这个代码还是很简单的。
爬虫不太懂得我先前没怎么写完爬虫的博客,我没辙。
但是多线程这块我讲的很明白了,看不懂我也没辙,要不然就私信有时间就回。
几分钟搞定python多线程
几分钟python多线程深入解读
那么接下来代码如下;

import requests
from lxml import etree
import threading
import os
from urllib import request
from queue import Queue
url_frist_save=Queue(1000)
#url_save=Queue(200)
headers={
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
                      ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}

url_root='http://pic.netbian.com'
def get_url():
    date_frist=requests.get(url_root,headers=headers)
    date_frist=date_frist.content.decode('gbk')
    date_frist_=etree.HTML(date_frist)
    uel_1=date_frist_.xpath('//li//a[@href and @title and @target]/@href')[4:]
    for i in uel_1:
        url=url_root+i
        url_frist_save.put(url)
    for i in range(2,101):
        urlx='http://pic.netbian.com/index_{name}.html'.format(name=str(i))
        date_frist = requests.get(urlx, headers=headers)
        date_frist = date_frist.content.decode('gbk')
        date_frist_ = etree.HTML(date_frist)
        uel_1 = date_frist_.xpath('//li//a[@href and @target]/@href')[1:]
        for i in uel_1:
            url = url_root + i
            url_frist_save.put(url)


def down_load():
    if not  os.path.exists(r'C:\Users\a3139\Desktop\projects\爬虫dome\pictures'):
        os.makedirs(r'C:\Users\a3139\Desktop\projects\爬虫dome\pictures')
    while True:
        date_frist=requests.get(url_frist_save.get(),headers=headers)
        date_frist=date_frist.content.decode('gbk')
        date_frist_=etree.HTML(date_frist)
        url_down=url_root+str(date_frist_.xpath('//div[@class="photo-pic"]/a/img/@src')[0])
        name=str(date_frist_.xpath('//div[@class="photo-pic"]/a/img/@title')[0])
        path=r'C:\Users\a3139\Desktop\projects\爬虫dome\pictures'+'\\'+name+'.jpg'
        print(path)
        print(url_down)
        try:
            request.urlretrieve(url_down,path)
            request.urlcleanup()
        except:
            print('此图片下载失败')




        if url_frist_save.empty():
            print(url_frist_save.empty())
            break





for i in range(5):
    t1=threading.Thread(target=get_url)
    t2=threading.Thread(target=down_load)
    t1.start()
    t2.start()


在这里插入图片描述
这里要注意的是我在这里为这个爬虫开了五个线程,但是这个并不意味着使用Queue可将100个网页爬取分成每个线程爬取20个,同样他们还是爬取100个每个线程。区别是以前是甲先做完再乙去做,现在是甲乙同时做为一组即一个线程。除非你给他们分配任务。我之所以这写主要是为了保证我可以爬取的图片不会遗漏,这个线程没有爬到这张图片,但是不代表另一个爬取不到,

猜你喜欢

转载自blog.csdn.net/FUTEROX/article/details/107869189
今日推荐