python项目实战之爬取表情包图片
时间:2019-11-11
本文章向大家介绍python项目实战之爬取表情包图片,主要包括python项目实战之爬取表情包图片使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用python爬取《斗图啦》网站表情包图片并保存
目标网站地址:http://www.doutula.com/photo/list/?page=1
打开目标页面源代码,可以找到我们所需要爬取的表情包图片地址,发现标签<a><img>保存着所需要的数据信息,解析获取标签内容即可
创建爬虫的一般流程:发起请求---获取响应内容---解析响应内容---保存数据
创建DouTuLa爬虫类
class DouTuLa(object): def __init__(self): pass
首先发起请求,使用urllib模块中的request.Request()向目标网页发起请求,打开目标页面,设置User-Agent请求头,来模拟真实浏览器浏览,避免被反爬,request.urlopen()来打开页面
def OpenPage(self, url): #模拟真实浏览器 #携带User-Agent头 #方法一 #self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} #req = urllib.request.Request(url, headers = self.headers) #方法二 req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0') response = urllib.request.urlopen(req) html = response.read() #读取网页的内容 return html
接着获取请求页面返回的内容,并进行解码设置。解析获取的网页内容,找到所需要的数据文件
def GetPage(self, url): html = self.OpenPage(url).decode("utf-8") #解码,一般网页都是utf-8格式 ImgHtml = etree.HTML(html) #初始化生成Xpath解析对象 #print(ImgHtml) #//div[@class="random_picture"]/ul/li/div/div/a #返回一个列表每个元素都是Element类型 ImgItems = ImgHtml.xpath('//div[@class="random_picture"]/ul/li/div/div/a') #print(ImgItems) ImgDict = {} for item in ImgItems: ImgUrl = item.xpath('./@href') #ImgName = item.xpath('./p/text()') ImgNum = ImgUrl[0].split('/')[-1] #获取每张图片的序号 #ImgSrc = item.xpath('./img/@src') ImgSrc = item.xpath('./img/@data-original') #获取图片的地址 #print(ImgUrl) #print(type(ImgUrl)) #print(ImgName) #print(type(ImgName)) #print(ImgSrc) #print(type(ImgSrc)) #print(ImgNum) #print(type(ImgNum)) #以字典的格式进行保存图片的序号和图片的地址 ImgDict[ImgNum] = ImgSrc[0] #print(ImgDict) return ImgDict
解析内容之后,下载图片保存在本地文件中
def DownLoadImg(self, url): #获取保存图片信息的字典 ImgDict = self.GetPage(url) #print(ImgDict) #每一个页面成功获取的图片 ImgCount = 0 for kv in ImgDict.items(): #print(kv) #print(type(kv)) self.SaveImg(kv[0],kv[1]) ImgCount += 1 if ImgCount != 0: print("成功下载{0}张".format(str(ImgCount)))
实现图片的保存功能
def SaveImg(self, num, url): #print(os.getcwd()) #创建保存图片的文件夹,并进入到该文件夹中 if os.path.exists("./image"): os.chdir("image") #print("已存在") else: os.mkdir("image") #不存在就创建该文件夹 os.chdir("image") #创建成功否进入到该文件夹中 print("不存在但此次创建成功") #通过图片地址找到图片 #self.FindImg(url) #统一设置图片的格式为jpg filename = num + ".jpg" #保存图片 with open(filename, 'wb') as f: img = self.OpenPage(url) f.write(img) #print(os.getcwd()) #退出到上一文件夹 os.chdir("..") #print(os.getcwd())
功能实现完成后,进行测试保存图片,设置时间休眠,也可以一定程度上避免被反爬
if __name__ == "__main__": if os.path.exists("./SpiderProject/doutuSpider"): os.chdir("SpiderProject/doutuSpider") else: print("不存在该文件夹,请创建") StrUrl = "http://www.doutula.com/photo/list/?page=" doutu = DouTuLa() #循环获取5个页面的图片 [1, 6) for i in range(1, 6): doutu.DownLoadImg(StrUrl + str(i)) #获取每张页面里的所有图片后,睡眠5秒,避免频繁访问被限制 time.sleep(5)
用到了urllib、time、os、lxml模块,多次练习来加强自己的掌握程度
原文地址:https://www.cnblogs.com/no-end-to-learning/p/11836950.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter基础widgets教程-ButtonBar篇
- 如何在linux服务上创建samba文件共享服务
- Salesforce Javascript(二) 箭头函数
- java面试基础部分;
- 7-2.表单-HTML基础
- 如何在github上传多个项目
- Flutter基础widgets教程-Card篇
- Springboot热部署,使用spring-boot-devtools、springloaded两种方式进行热部署
- SpringBoot中jsp里面的静态资源js、css、images访问不到解决办法
- spring boot jsp里面的静态资源访问不到解决办法
- Flutter基础widgets教程-Center篇
- 如何上传项目到GitHub
- ES6编码规范
- Flutter基础widgets教程-Checkbox篇
- linux的相关命令行