利用爬虫多线程下载可爱妹子图片

利用爬虫多线程下载可爱妹子图片

在上一篇的文章中,我还没学习到多线程的下载方法,所以爬取图片的速度很慢,效果不是很理想(有时候非常急的想要图片),所以经过在网上搜索相关资料后,初步的对上一篇文章的代码进行了优化,采用了多线程的方式,并且缩减了函数的数量,将mkdir函数改为了makedirs函数,更加方便,增加了一个判断图包文件夹是否存在的语句,防止覆盖下载,代码逻辑更明显~~(可能)~~

话不多说,直接撸代码:

from bs4 import BeautifulSoup
import requests
import time
import os
import threading

def get_html(url):
    try:
        response=requests.get(url)
        response.encoding='gb2312'
        if response.status_code==200:
            print('成功连接!网址为'+url)
            return response.text
    except requests.RequestException:
       return None

def get_url_and_name(url):
    "传入的参数为主页面链接,返回值是一个含有2元素的列表,元素1为图包链接,元素2为图包名"
    html=get_html(url)
    soup=BeautifulSoup(html,'lxml')
    name=[]
    url_1=[]
    list2=soup.find_all(class_='t')
    sign=1
    for item in list2:
        if(sign!=1 and sign!=42):
            url_temp=item.find('a').get('href')
            name_temp=item.find(class_='title').find('a').get('title')
            url_1.append(url_temp)
            name.append(name_temp)
        sign=sign+1
    temp=[url_1,name]
    return temp
def pic_down(url,name,path):
    "url为图包链接,name为图包名,path为储存位置"
    address=[]
    file_folder_name=path+'./'+name
    html1=get_html(url)
    soup=BeautifulSoup(html1,'lxml')
    list4=soup.find(class_='page').find_all('a')
    temp=1
    while(temp<len(list4)):
        if(temp==1):
            url_3=url
        else:
            url_3=url.replace('.html','_'+str(temp)+'.html')
        temp=temp+1
        html2=get_html(url_3)
        soup1=BeautifulSoup(html2,'lxml')
        list3=soup1.find(class_='content').find_all('img')
        for item in list3:
            address.append(item.get('src'))   
    if(os.path.exists(file_folder_name)==True):
        return 0
    os.makedirs(file_folder_name)
    print('正在下载的图包名为'+name)
    index=1
    for i1 in address:
        filename = path+'./'+name+'./'+str(index) +'.jpg'
        with open(filename, 'wb') as f:
            img = requests.get(i1).content
            f.write(img)
        index += 1
        time.sleep(2)
    print(name+'下载完毕!')

def main(i):
    url='https://www.keke234.com/gaoqing/list_5_'+str(i)+'.html'
    path=r'M:\2'
    information=get_url_and_name(url)
    num=0
    for item in information[0]:    
        threading.Thread(target=pic_down,args=(item,information[1][num],path)).start()   
        num=num+1
        time.sleep(2)            

if __name__ == '__main__':
    for i in range(2,5):
        main(i)

注意事项==(必看)==

运行程序需要的库在代码上方,请自行安装,在此不赘述方法。在我的本地运行时,没有发现问题,下载速度也很快。在上述代码中,path为下载图包的储存地址,time.sleep的参数为延迟的秒数,建议不要改成太小的数值,防止被封IP。main函数的参数是图战的页数,一共有800页,页数越大,图包的拍摄时间越久,建议不要改成太大的数值,而且main函数上的那个for循环请不要改成太大数值,会被封IP(亲测)
除非你喜欢以前的质量很低的图

请各位使用该代码时候修改参数,防止报错

另外如果出现问题的话可以在下方交流,有意见欢迎提出,因为笔者代码经验也不足,肯定有很多可以提升的地方,请各位不吝赐教。后续我会更新其他的文章,感兴趣的大伙们可以点一下赞和关注,这也是笔者的动力,谢谢!
上一篇的代码的链接是https://blog.csdn.net/qq_39305249/article/details/102628783

你可能感兴趣的:(python,爬虫)