前言

在QQ斗图中,为什么有些人总有斗不完的图,今天,这里有了这个斗图小程序,终于可以告别斗图斗不赢的痛了。

文章目录

  • 1.完成这个小程序需要导入的模块
  • 2.了解两个HTTP状态码
  • 3.怎样实现
  • 4.最终代码
  • 5.改进与总结

1.完成这个小程序需要导入的模块

urllib,bs4,threading,queue,os,time,random
urllib和bs4这两个模块是第三方库,需要额外安装
我们按win+R 输入cmd ,然后输入 ***pip install urllib3 ,pip install bs4***安装成功即可(注意:这是要在配好环境变量的前提下)

2.了解两个HTTP状态码

这个小程序,在做的过程中,会报服务器相关原因的错误。

状态码 内容 说明
4xx 客服端错误 这类的状态码代表了客服端看起来可能发生了错误,妨碍了服务器的处理
403 Forbidden 服务器已经理解请求,当时拒绝执行它
404 Not Found 请求失败,请求的资源在服务器上找不到

这两个错误待会会在我们实现这个小程序的过程当中逐渐显现出来。

3.怎样实现

我们需要来到这个网址 ***http://www.doutula.com/***,进入这个界面,输入一个表情包的类型
如我输入 龙王

可以发现这个网址好像就是我们能爬取这一页表情包的网址了,但这样的表情包总不可能只有一页,来到第二页,可以发现,网址变了。

我们要爬取所有页的表情包,就只有根据这个网址来进行爬取。
http://www.doutula.com/search?type=photo&more=1&keyword=%E9%BE%99%E7%8E%8B&page=2
对这个网址进行分析,我们可以发现,其实主要变化的就是keywordpage,keyword是我们输入表情包的类型,page是这类表情包的页码,为了能爬取所有页的表情包,我们只需改变页码的值就行了,当这个网址出现404错误,就表明所有这类表情包已经基本爬取完毕!

代码如下:

def get_url():num=1       # 主要通过这个参数得到用户输入类型的所有表情包imgs_url=[]   # 用于返回表情包的下载链接imgs_name=[]  # 用于返回表情包的名称keyword=input('请输入你想下载的表情包类型:')keyword_1=parse.urlencode({'keyword':keyword})while True:url='http://www.doutula.com/search?type=photo&more=1&{}&page={}'.format(keyword_1,str(num))headers = {'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'}  # 请求头try:request_1=request.Request(url=url,headers=headers)html=request.urlopen(request_1)html=html.read().decode('utf-8')soup=BeautifulSoup(html,'lxml')list_1=soup.select('a.col-xs-6.col-md-2')for html_1 in list_1:try:imgs_url.append(html_1.select('img')[-1]['data-original'])imgs_name.append(html_1.select('p')[0].get_text())except:time.sleep(0.125)except Exception as e:print(e,'所有图片加载完毕!')break  # 当出现404时表明此时所有图片已经都得到了num+=1return imgs_name,imgs_url,keyword

代码中之所以这句代码要以-1为索引,是因为动态图片的网页中有两个 img 标签,且最后面那个 img标签下面有表情包的下载链接,而静态表情包 只有一个 img 标签。

 imgs_url.append(html_1.select('img')[-1]['data-original'])

通过这个函数,我们可以得到表情包的下载链接、表情包的名称。不加一个请求头的话,会出现403错误,如下:

加上请求头:

之后,我们就只要多线程下载这些表情包即可。

def Downlad(queue_imgsname:Queue,queue_urls:Queue,keyword:str):path_1='./'+keywordtry:os.mkdir(path_1)except:passwhile True:if queue_imgsname.empty():breakimgname=queue_imgsname.get()url_1=queue_urls.get()print('线程{}正在下载{}'.format(threading.current_thread().getName(),imgname))try:request.urlretrieve(url=url_1,filename=path_1+'/'+'-【{}】.gif'.format(random.random()))#用随机数来命名文件名称是为了防止出现文件名命名出错的情况 osError,也能避免因同名的表情包被覆盖的情况except Exception as e:print(e)time.sleep(0.125) # 如果文件名有错误,那就休眠0.125秒finally:time.sleep(0.25)

这是那个实现多线程下载的那个函数,之所以命名图片后缀名为“.gif”是表情包有动态的原因。
还有部分包情包无法下载,会出现403错误。

4.最终代码

import urllib.parse as parse
from urllib import request
from bs4 import BeautifulSoup
import threading
from queue import Queue
import os
import random
import timedef get_url():num=1       # 主要通过这个参数得到用户输入类型的所有表情包imgs_url=[]   # 用于返回表情包的下载链接imgs_name=[]  # 用于返回表情包的名称keyword=input('请输入你想下载的表情包类型:')keyword_1=parse.urlencode({'keyword':keyword})while True:url='http://www.doutula.com/search?type=photo&more=1&{}&page={}'.format(keyword_1,str(num))headers = {'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'}  # 请求头try:request_1=request.Request(url=url,headers=headers)html=request.urlopen(request_1)html=html.read().decode('utf-8')soup=BeautifulSoup(html,'lxml')list_1=soup.select('a.col-xs-6.col-md-2')for html_1 in list_1:try:imgs_url.append(html_1.select('img')[-1]['data-original'])imgs_name.append(html_1.select('p')[0].get_text())except:time.sleep(0.125)except Exception as e:print(e,'所有图片加载完毕!')break  # 当出现404时表明此时所有图片已经都得到了num+=1return imgs_name,imgs_url,keyworddef Downlad(queue_imgsname:Queue,queue_urls:Queue,keyword:str):path_1='./'+keywordtry:os.mkdir(path_1)except:passwhile True:if queue_imgsname.empty():breakimgname=queue_imgsname.get()url_1=queue_urls.get()print('线程{}正在下载{}'.format(threading.current_thread().getName(),imgname))try:request.urlretrieve(url=url_1,filename=path_1+'/'+'-【{}】.gif'.format(random.random()))#用随机数来命名文件名称是为了防止出现文件名命名出错的情况 osError,也能避免因同名的表情包被覆盖的情况except Exception as e:print(e)time.sleep(0.125) # 如果文件名有错误,那就休眠0.125秒finally:time.sleep(0.25)if __name__ == '__main__':tuple_1=get_url()imgs_name,imgs_url,keyword=tuple_1[0],tuple_1[1],tuple_1[2]queue_imgsname=Queue(len(imgs_name)+5)  #防止队列出现阻塞现象queue_urls=Queue(len(imgs_url)+5)threading_num=len(imgs_name)//10  # 根据表情包的数量来创建相应多的线程threading_list=[]  # 线程列表for i in range(len(imgs_name)):queue_imgsname.put(imgs_name[i])queue_urls.put(imgs_url[i])time.sleep(5)  # 在开始下载之前,休眠五秒print('开始下载!')for i in range(threading_num):threading_1=threading.Thread(target=Downlad,args=(queue_imgsname,queue_urls,keyword,))threading_1.start()threading_list.append(threading_1)for i in threading_list:i.join()print('--------------------下载完毕!当前线程为{}'.format(threading.current_thread().getName()))

运行结果:

这个运行之后,同一个文件夹下面会多一个文件夹,文件夹的名称就是自己输入表情包的类型

只不过下载的图片中有个别表情包出错了。
下载动态图片试一下:

点击其中一张,可以看到表情包是动态的。

5.改进与总结

1.本小程序还有一定的改进,如下载的表情包出错,如果大家有什么好的改进措施,欢迎在下方留言;
2.文章表达不清楚的,希望大家谅解,我相信以后我一定写的更好。

Python多线程爬虫教你如何快速下载表情包,告别斗图斗不赢的烦恼!相关推荐

  1. 2021-03-10 Python多线程爬虫快速批量下载图片

    Python多线程爬虫快速批量下载图片 1.完成这个需要导入的模块 urllib,random,queue(队列),threading,time,os,json 第三方模块的安装 键盘win+R,输入 ...

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

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

  3. python爬电影_使用Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  4. Python 多线程爬虫

    多线程爬虫 有些时候,比如下载图片,因为下载图片是一个耗时的操作.如果采用之前那种同步的方式下载.那效率肯会特别慢.这时候我们就可以考虑使用多线程的方式来下载图片. 多线程介绍: 多线程是为了同步完成 ...

  5. 2019.1.12日 PYTHON多线程爬虫笔记

    多线程爬虫 有些时候,比如下载图片,因为下载图片是一个耗时的操作.如果采用之前那种同步的方式下载.那效率肯会特别慢.这时候我们就可以考虑使用多线程的方式来下载图片. 多线程介绍: 多线程是为了同步完成 ...

  6. python多线程爬虫实例-Python实现多线程爬虫

    编辑推荐: 本文主要介绍对Python多线程爬虫实战的整体的思路,希望对大家有帮助. 本文来知乎,由火龙果软件Alice编辑,推荐. 最近在写爬虫程序爬取亚马逊上的评论信息,因此也自学了很多爬虫相关的 ...

  7. Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片

    Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...

  8. python多线程下载表情包

    threading模块 简单使用 import threading,time ''' 想要学习Python?Python学习交流群:973783996满足你的需求,资料都已经上传群文件,可以自行下载! ...

  9. python多线程爬虫 和讯期货 标题和内容页的URL

    #coded by 伊玛目的门徒 import re import requests import time from bs4 import BeautifulSoupurllist=[] title ...

最新文章

  1. FreeSwitch Sip【转】
  2. 实现IFrame的自适应高度
  3. 开发中的问题——环境相关
  4. CCIE理论-第二篇-SDN-FabricPath技术
  5. 美国签证过不了,ICLR 2020搬到埃塞俄比亚,同性恋学者:不去,保命要紧
  6. matlab打开模型步骤,基于Matlab/Simulink的模型开发(连载一)
  7. 智能读物产品优化、运营方案
  8. 新浪微博Emoji表情解析
  9. 未检测到与wia兼容的设备_关于检测到不兼容硬件设备的解决办法
  10. pyecharts绘制地图
  11. c语言编译bss和data,.bss段和.data段的区别
  12. R: symbol lookup error: /home/lib/../../libreadline.so.6: undefined symbol: PC
  13. 直观理解语义分割中IOU
  14. IDEA的debug调试功能
  15. understand学习
  16. 以连边为中心的功能连接用于个体识别
  17. 新手怎么租用传奇服务器
  18. python中axes什么意思_matplotlib中的axes.flat是做什么的?/p precodefor i, ax in enumerate(axes.flat): /code...
  19. 迅为-i.MX6ULL开发板-QT实战项目DHT11网络编程实战练习(一)
  20. 三大变换与自控(一)傅里叶级数

热门文章

  1. 互联网与神经学的交叉对比研究--论文全文
  2. php中yield的用法
  3. Linux国内常用软件源的介绍
  4. Nginx代理服务和文件路径
  5. 巴菲特投资理念是什么?投资案例有哪些?《巴菲特估值逻辑-20个投资案例深入复盘》
  6. 百度AI深度学习课程——《乘风破浪的姐姐》数据爬取
  7. 局域网arp攻击_谈谈电子欺骗中的ARP欺骗
  8. win7下如何修改我的文档、桌面、IE收藏夹路径
  9. php渐变背景颜色,css背景颜色渐变案例:线性渐变和径向渐变效果实例详解
  10. SpringBoot spring security Github 登陆