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