用python一键保存几千张表情包斗图,分分钟征服朋友圈所有好友

x33g5p2x  于2022-03-11 转载在 Python  
字(2.9k)|赞(0)|评价(0)|浏览(482)

现在年轻人聊天,不带点表情包都不好意思说自己是年轻人, 表情包已然成为人与人聊天中不可缺少的部分。

刚认识的朋友丢几个表情包出去分分钟拉进关系,女朋友生闷气了整两个表情包开心一下,也可以化解尴尬,没时间打字整两张表情包,礼貌而不失尴尬。

一、欲扬先抑

准备工作很重要,先知道我们要干啥,用什么来做,怎么做,再去一步步实时,稳扎稳打。

开发环境配置

  1. Python 3.6
  2. Pycharm

打开你的浏览器搜索你要安装的软件名字

Python

后面带官方的就是官网了,但凡名字下方带了广告二字就别点,自信点,那就是广告。

直接点下面的 Python 3.10.2 下载最新版本即可,不用点那啥 Download

pycharm

随便点一个 Download


专业版社区版都OK

安装方法一个个讲太久了,可以扫文章最下面的码有视频

模块安装配置

  1. requests
  2. parsel
  3. re

打开电脑,按住win+r,输入cmd,回车,输入pip install (加上要安装的模块名),回车即可安装。

二、代码

目标:fabiaoqing
地址前面后面大家自己补全一下,包括后面代码里的,这应该没有不会的吧。

导入模块

  1. import requests
  2. import parsel
  3. import re
  4. import time

请求网址

  1. url = f'fabiaoqing/biaoqing/lists/page/{page}.html'

请求头

  1. headers = {
  2. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
  3. }

返回网页源代码

  1. response = requests.get(url=url, headers=headers)

解析数据

  1. selector = parsel.Selector(response.text) # 把respons.text 转换成 selector 对象

第一次提取 提取所有的div标签内容

  1. divs = selector.css('#container div.tagbqppdiv') # css 根据标签提取内容

通过标签内容提取他的图片url地址

  1. img_url = div.css('img::attr(data-original)').get()

提取标题

  1. title = div.css('img::attr(title)').get()

获取图片的后缀名

  1. name = img_url.split('.')[-1]

保存数据

  1. new_title = change_title(title)

对表情包图片发送请求 获取它二进制数据

  1. img_content = requests.get(url=img_url, headers=headers).content

保存数据

  1. def save(title, img_url, name):
  2. img_content = get_response(img_url).content
  3. try:
  4. with open('img\\' + title + '.' + name, mode='wb') as f:
  5. # 写入图片二进制数据
  6. f.write(img_content)
  7. print('正在保存:', title)
  8. except:
  9. pass

替换标题中的特殊字符

因为文件命名不明还有特殊字符,所以我们需要通过正则表达式替换掉特殊字符。

  1. def change_title(title):
  2. mode = re.compile(r'[\\\/\:\*\?\"\<\>\|]')
  3. new_title = re.sub(mode, "_", title)
  4. return new_title

记录时间

  1. time_2 = time.time()
  2. use_time = int(time_2) - int(time_1)
  3. print(f'总共耗时:{use_time}秒')

兄弟们,这里是单线程,下面是多线程,我就直接上代码了。

  1. import requests
  2. import parsel
  3. import re
  4. import time
  5. import concurrent.futures
  6. def change_title(title):
  7. mode = re.compile(r'[\\\/\:\*\?\"\<\>\|]')
  8. new_title = re.sub(mode, "_", title)
  9. return new_title
  10. def get_response(html_url):
  11. headers = {
  12. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
  13. }
  14. repsonse = requests.get(url=html_url, headers=headers)
  15. return repsonse
  16. def save(title, img_url, name):
  17. img_content = get_response(img_url).content
  18. try:
  19. with open('img\\' + title + '.' + name, mode='wb') as f:
  20. f.write(img_content)
  21. print('正在保存:', title)
  22. except:
  23. pass
  24. def main(html_url):
  25. html_data = get_response(html_url).text
  26. selector = parsel.Selector(html_data)
  27. divs = selector.css('#container div.tagbqppdiv')
  28. for div in divs:
  29. img_url = div.css('img::attr(data-original)').get()
  30. title = div.css('img::attr(title)').get()
  31. name = img_url.split('.')[-1]
  32. new_title = change_title(title)
  33. save(new_title, img_url, name)
  34. if __name__ == '__main__':
  35. time_1 = time.time()
  36. exe = concurrent.futures.ThreadPoolExecutor(max_workers=10)
  37. for page in range(1, 201):
  38. url = f'fabiaoqing/biaoqing/lists/page/{page}.html'
  39. exe.submit(main, url)
  40. exe.shutdown()
  41. time_2 = time.time()
  42. use_time = int(time_2) - int(time_1)
  43. print(f'总共耗时:{use_time}秒')

兄弟们,18秒一千多张,这结束的有点快了啊

大家看完觉得有用的话,点个赞收藏一下呗,爱你摸摸大,你看代码运行这么快,我可不希望大家平常也这么快,不太好~

相关文章