Python多线程爬虫快速批量下载图片

1、完成这个需要导入的模块

urllib,random,queue(队列),threading,time,os,json

第三方模块的安装

键盘win+R,输入cmd,来到命令窗口

对于urllib模块,安装代码pip install urllib3

2、怎样多线程爬取图片

首先,我们需要来到这个网址

https://www.quanjing.com/

然后输入关键字,来到另外一个界面,如 我输入 风景

查看一下源代码,可以发现,这些图片的下载链接应该不是直接写在网址内的,我们点击鼠标右键,点击检查,点击Network,点击XHR,按F5刷新,可以发现XHR下面有这些图片的下载链接。

这样我们就只需要这个网址就可以得到这一页所以图片的下载链接了。

https://www.quanjing.com/Handler/SearchUrl.ashx?t=8102&callback=searchresult&q=%E9%A3%8E%E6%99%AF&stype=1&pagesize=100&pagenum=1&imageType=2&imageColor=&brand=&imageSType=&fr=1&sortFlag=1&imageUType=&btype=&authid=&_=1584067448531

通过多个这样的网址进行分析可以发现,‘t=’后面的参数应该是一个四位的随机数,‘q=’后面的参数应该是自己输入图片的类型,也就是 风景,只不过这里对于它进行编码罢了,‘pagnum=’后面的参数是第几页的意思,网址中**‘pagesize=100’**标明每页应该一百张图片,而总的页码数在这上有

最后面的那个参数值应该是一个时间戳,通过处理得到的。

这样我们就可以得到爬取多页的图片了。不过,进行爬取的时候,可以发现,就算得到了这个网址,也得不到这些数据,这个时候,我们可以来到这个网址的请求头那里,通过多次实验可以发现只需在请求头中加上:Referer:即可

这里为了让服务器认为我们是浏览器访问的,我们可以在请求头上添加:User-Agent

代码如下:

def get_time():  # 时间戳处理    str_time = str(time.time())    str_time = str_time[:str_time.find('.')] + str_time[str_time.find('.') + 1:str_time.find('.') + 4]    time.sleep(1.25)  # 没得到一个时间戳,休眠1.25秒    return str_time
​​​​​​
def get_url():    keyword = input('请输入你想下载的图片类型:')    key_word = parse.urlencode({'q': keyword})    num=int(input('请输入你想下载的图片数量:'))//100    headers = {        "Referer": "https://www.quanjing.com/search.aspx?%s" % (key_word),        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"}    url='https://www.quanjing.com/Handler/SearchUrl.ashx?t=%s&callback=searchresult&%s&stype=1&pagesize=100&pagenum=%s&imageType=2&imageColor=&brand=&imageSType=&fr=1&sortFlag=1&imageUType=&btype=&authid=&_=%s'
    list_url=[]    for i in range(1,num+1):        str_1 = str(random.random())        random_1 = str_1[str_1.find('.') + 1:str_1.find('.') + 5]        time_1=get_time()        url_1=url%(random_1,key_word,i,time_1)        list_url.append(url_1)
    return list_url,headers,keyword

通过这样我们就可以得到图片的下载链接了,后面只需多线程下载即可。不过,在多线程下载过程,发现下载的图片的数量远远低于自己输入的图片数量,其实这是因为图片同名的原因,我们可以在图片名称前面添加一个随机随机数即可;

运行:

也许输入完成之后,会达不到自己输入的图片数量程序就自动结束了,建议多试几次。

完成之后,我们可以查看一下当前文件夹下面会多了一个文件夹,所下载的图片就在里面

为了知道我们下载的图片的数量,我们可以这样:

​​​​​​​

import oslist_1=os.listdir('E:\Pycharm_1\爬虫\中国')for i in range(len(list_1)):    print(i+1,list_1[i])

运行结果:

这样就发现这里有400张图片。

3、完整代码如下

import urllib.parse as parse

from urllib import requestimport randomfrom queue import Queueimport threadingimport timeimport jsonimport osdef get_time():  # 时间戳处理    str_time = str(time.time())    str_time = str_time[:str_time.find('.')] + str_time[str_time.find('.') + 1:str_time.find('.') + 4]    time.sleep(1.25)  # 没得到一个时间戳,休眠1.25秒    return str_time
def get_url():    keyword = input('请输入你想下载的图片类型:')    key_word = parse.urlencode({'q': keyword})    num=int(input('请输入你想下载的图片数量:'))//100    headers = {        "Referer": "https://www.quanjing.com/search.aspx?%s" % (key_word),        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"}    url='https://www.quanjing.com/Handler/SearchUrl.ashx?t=%s&callback=searchresult&%s&stype=1&pagesize=100&pagenum=%s&imageType=2&imageColor=&brand=&imageSType=&fr=1&sortFlag=1&imageUType=&btype=&authid=&_=%s'
    list_url=[]    for i in range(1,num+1):        str_1 = str(random.random())        random_1 = str_1[str_1.find('.') + 1:str_1.find('.') + 5]        time_1=get_time()        url_1=url%(random_1,key_word,i,time_1)        list_url.append(url_1)
    return list_url,headers,keywordtuple_1=get_url()list_url,headers,keyword=tuple_1[0],tuple_1[1],tuple_1[2]queue_url = Queue(len(list_url)*100+5)queue_img = Queue(len(list_url)*100+5)
try:  # 防止因为没有该图片类型而报错    num=1    for i in range(len(list_url)):        request_1=request.Request(url=list_url[i],headers=headers)        content=request.urlopen(request_1)
        str_1 = content.read().decode('utf-8')  # 得到的数据字符串类型        str_1 = str_1[str_1.find('(') + 1:str_1.rfind(')')]        dict_1 = json.loads(str_1)        images_list = dict_1['imglist']
        for j in range(len(images_list)):            print('【{}】-{}'.format(num, images_list[j]['caption']))            queue_url.put(images_list[j]['imgurl'])            queue_img.put(images_list[j]['caption'])            num+=1
    def Downlad(queue_url: Queue, queue_img: Queue):        path_1 = './' + keyword        try:            os.mkdir(path_1)        except:            pass        finally:            while True:                if queue_url.empty():                    break                image_name = queue_img.get()                request.urlretrieve(url=queue_url.get(), filename=path_1 + '/【{}】-{}.png'.format(random.random()*1000,image_name))  # 下载图片                # 为了防止出现图片名相同的情况,对于图片命名添加一个随机数                print('线程{}正在下载【{}】'.format(threading.current_thread().getName(), image_name))                time.sleep(0.25)  # 每下载一张图片,休眠0.25秒
    threading_list = []    print('开始下载!')    time.sleep(5)    for i in range(len(list_url)*5):  # 根据用户的输入创建相应多的线程        threading_1 = threading.Thread(target=Downlad, args=(queue_url, queue_img,))        threading_1.start()        threading_list.append(threading_1)
    for i in threading_list:        i.join()
    print('------------------------下载完毕!当前线程为', threading.current_thread().getName())except Exception as e:    print(e,'没有搜到该图片或者今日访问次数过多!')

2021-03-10 Python多线程爬虫快速批量下载图片相关推荐

  1. python+selenium爬虫自动化批量下载文件

    一.项目需求 在一个业务网站有可以一个个打开有相关内容的文本,需要逐个保存为TXT,数据量是以千为单位,人工操作会麻木到崩溃. 二.解决方案 目前的基础办法就是使用python+selenium自动化 ...

  2. Python 3 爬虫之批量下载字帖图片

    朋友想下载这62个网页中的字帖图片:http://www.yac8.com/news/11003.html 一.要点 1. Chrome 「审查元素」中看到的源代码与真实的源码不同. 2. 图片网址附 ...

  3. python网络爬虫--下载图片

    本项目将使用requests库.BeaurifulSoup库.selenium库实现下载百度图片的功能. 1.前言 首先,为什么要使用selenium库呢?因为在我们编写爬虫代码的过程中,可能会遇到一 ...

  4. 如何使用Python批量下载图片

    爬虫程序在采集网页的过程中,需要从网上下载一些图片,比如表情包.壁纸.素材等,如果图片的数量很多,这样做就会非常麻烦和耗时.那么有没有更方便快捷的方法呢?答案是肯定的.我们可以利用Python编程语言 ...

  5. python爬虫之多线程threading、多进程multiprocessing、协程aiohttp 批量下载图片

    一.单线程常规下载 常规单线程执行脚本爬取壁纸图片,只爬取一页的图片. import datetime import re import requests from bs4 import Beauti ...

  6. python爬虫+ffmpeg批量下载ts文件,解密合并成mp4

    标题 python爬虫+ffmpeg批量下载ts文件,解密合并成mp4 文章目录 标题 前言 一.分析目标 二.寻找url规律 三.写代码 总结 前言 (第一次写博客,写的不好请见谅哈~~) 目标是大 ...

  7. python多线程爬虫实例-Python多线程爬虫简单示例

    python是支持多线程的,主要是通过thread和threading这两个模块来实现的.thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用. ...

  8. python 批量下载网页图片_Python实现多线程批量下载图片

    <派森>(Python)3.13 win32 英文安装版 类型:编程工具大小:21M语言:英文 评分:8.7 标签: 立即下载 爬取图片可真的是一个可遇不可求的机会. 有需求就会动力. 目 ...

  9. img绝对路径图片显示_使用python爬虫去风景图片网站批量下载图片

    使用python爬虫(requests,BeautifulSoup)去风景图片网站批量下载图片 1.写代码背景: 今天闲来无事,想弄点图片放到电脑,方便以后使用,故去百度查找一些风景图片网站,发现图片 ...

最新文章

  1. js在控件原有的事件方法中加入自己的方法
  2. 关于一个Panel上鼠标不及时响应MouseLeave事件
  3. Error-Project facet Java version 1.8 is not supported
  4. 设置元素的高度为百分比,结果不起作用的解决方法
  5. linux内核配置成qspi挂载,【分享】在Linux/U-Boot里为QSPI Flash使用UBIFS
  6. Java实现Unicode编码和中文互转
  7. hit网络安全实验报告
  8. VS2015产品激活密钥
  9. python敲七游戏代码_敲七游戏数字表
  10. 鲲鹏920的服务器芯片,鲲鹏920芯片是什么芯片
  11. 用自己的设备跑各种VI-SLAM算法(1)——VINS/PL-VINS/ROVIO/MSCKF
  12. OBLOG Accesss 转SQL Server 常见问题及解决方法
  13. 七牛云测试域名过期了,全部图片下载方法
  14. 数据库相关岗位面试准备建议
  15. android4.4 fragment,在Activity和多个Fragment之间共享资源
  16. Spring Boot Jar包运行指定配置文件
  17. python翻译成中文蟒蛇_python为什么叫大蟒蛇
  18. Stack的概念和算法应用
  19. Android 获取wifi信号强度
  20. 《月球度假村模拟器》用户协议

热门文章

  1. python socket 说明
  2. uni-app读取html缓存,uni-app同步缓存值 设置 读取 删除(示例代码)
  3. java swing面试题_Java面试题之AWT、Swing
  4. 本地maven仓库_Maven(四):仓库
  5. Python入门100题 | 第012题
  6. 【python进阶】_文件和目录操作
  7. 史上最全的MySQL高性能优化实战总结!
  8. python的des和3des加解密
  9. Hadoop家族学习路线图--转载
  10. spring beans源码解读之--BeanFactory的注册