一、前言
有时候我不是很理解聊天斗图的现象,年轻人也就罢了,但我这种四十多岁的圈子里,居然还盛行聊天斗图这种风气…一把年纪了还当斗图狂魔…
他们的图怎么就这么多?结果一问,每个人手机里都专门存了几十张表情包,有的人甚至存了上百张…原来这就是他们“嚣张”斗图的原因?!
我想了想,斗图不就是比谁的表情包多吗?那谁能比我们程序员表情包多?爬虫一爬就是成千上万张!
今天就教大家一招用Python爬虫一键爬取海量表情包,分分钟碾压那些斗图狂魔!并附上源码。
二、思路解析
1.创建请求头,也被称为伪装浏览器
可能有些同学会问了,什么是请求头啊。请求头其实就是一个用户代理,在请求头中是包含了当前用户的操作系统版本信息以及当前用户访问网站所使用的浏览器版本信息。
那么为什么要创建请求头呢,因为在网站访问的过程中,有大部分网站会对当前请求做验证,来判断当前的请求是否合法(不是使用浏览器来获取网站数据的话会被认为非法请求)。如果不添加请求头的话,可能会出现当前网站没有访问权限。
创建方法:
1.打开浏览器
2.按住f12
3.选中NetWork选项卡
4.点击筛选出来的链接(链接选择随意)
5.找到user-agent选项并复制
'user-agent': 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36'
2.使用requests 网络请求库完成网站数据请求
当我们创建完成请求头之后就需要访问网站拿到网站的页面数据了,那么如何获取网站数据呢,这时候就需要使用requests来帮助我们获取了。
在使用requests之前,需要先下载安装。
下载安装命令:pip install requests -i https://pypi.douban.com/simple
安装完成之后我们就可以使用requests了
使用方法:requests.get(‘https://fabiaoqing.com/biaoqing/lists/page/1.html’, headers=headers).text
在获取网页数据的时候,需要调用http协议中的get方法来获取页面数据,一般情况下会返回html页面源代码
需要传入的参数:网站的域名以及请求头
如果想获取文本数据,那么久调用requests中内置的text方法返回文本数据,如果想要获取二进制数据则使用内置的content方法。
3.获取数据后使用bs4对页面数据进行提取
因为一个页面包含的数据太多了,例如:搜索框、页面广告、ICP备案号等等。但是我们只是想要获取页面中的表情包图片,那该怎么办呢?这时候我们就需要用到一个非常好用的第三方包:bs4
使用方法:
1.在浏览器中按住f12调出开发者工具,点击Elements,之后点击元素选择器(左边的小箭头),之后选中页面上的图片,左键点击。浏览器就会帮助我们定位图片所在html代码的位置
2.看到被选中的标签后,查看当前图片的元素标签,当前标签是img,观察当前标签中的属性,有一个class属性,复制该属性的值
3.调用方法:find_all(‘img’, class_=‘ui image lazy’),调用之后会返回图片标签的列表
4.对列表进行循环,将img标签中的data-original属性的值提取出来
for i in img_list:
image_url = i['data-original']
5.提取完成之后将会获得当前页面所有的图片标签,我们对当前获取的链接进行二次请求并使用python内置的with open方法将图片数据下载到本地
with open('./' + '图片名称' + '文件后缀名', 'wb') as f:
image_data = requests.get(image_url, headers=headers).content
f.write(image_data)
至此,一个简单的微信表情包爬虫就制作完成。
三、源码
import os
import requests
from bs4 import BeautifulSoup
if not os.path.exists('./images/'):
os.mkdir('./images/')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
url = 'https://fabiaoqing.com/biaoqing/lists/page/1.html'
response = requests.get(url, headers=headers).text
'''
lxml: html解析库,因为python和html两者没有关系
python没有办法直接控制html代码
我们就需要使用lxml这个库将html代码转成python对象
需要大家去下载 pip install lxml
'''
soup = BeautifulSoup(response, 'lxml')
img_list = soup.find_all('img', class_='ui image lazy')
for img in img_list:
img_url = img['data-original']
img_title = img['title']
print(img_url, img_title)
try:
with open('./images/' + img_title + os.path.splitext(img_url)[-1], 'wb') as f:
'''
因为一张图片是二进制数据
如果我们使用text文本形式返回
会对文件造成破坏
使用content去返回原始数据
'''
image = requests.get(img_url, headers=headers).content
# 写入二进制数据 image这个变量是存储requests返回的二进制数据的
f.write(image)
print('保存成功:', img_title)
except:
pass
文章到这里就结束了,感谢你的观看,只是有些话想对读者们说说。
我退休后一直在学习如何写文章,说实在的,每次在后台看到一些读者的回应都觉得很欣慰,对于自媒体我是个刚入门的人,还是个傻大叔…为了感谢读者们,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
如果你用得到的话可以直接拿走,在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)可以自助拿走,群号是1044939456。
转载:https://blog.csdn.net/zhiguigu/article/details/116652345