+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-04(1)

2019-06(3)

2019-07(6)

2019-08(114)

2019-09(83)

python面向对象爬取肖战图片

发布于2020-08-02 10:24     阅读(1059)     评论(0)     点赞(22)     收藏(1)


今天小编想大家介绍的是用python在堆糖上爬取肖战的图片。

主要步骤:

1.获取网址
2.运用requests包模拟网站,向服务器发送请求,获取响应
3.清洗数据,通过正则表达式筛选自己需要的数据
4.保存数据

关键字:requests,正则表达式,面向对象

本文通过面向对象的方法介绍爬虫,下一期小编在介绍面向过程如何爬取。
现在就正式给大家讲解爬虫步骤。

import re  # 正则表达式
import requests  # 爬虫用的包
from urllib.request import urlretrieve  # 本文用来下载图片
import os # 标准库,本文用来新建文件夹

1.构建大体框架
构建好面向对象的大体框架,分好步骤,这样写代码思路才够清晰。

class Xiaozhan(object):
    def __init__(self):
        pass
    def run(self):
    	pass
if __name__ == "__main__":
	xiaozhan = Xiaozhan()
	xiaozhan.run()

构建好这样的框架才能饶昂整个程序跑起来,run函数则是我们的主函数,那么我们在主函数里先注释好我们需要做的步骤,主要步骤则是开始写的四条。
2.获取网址

    def __init__(self):
        self.base_url = "https://www.duitang.com/search/?kw=肖战&type=feed#!s-p{}"

在这里插入图片描述
我们接着翻到第二页
在这里插入图片描述
我在翻一页看看会怎么样
在这里插入图片描述
我们发现了规律,每翻一页s-p{}就会增加1,我们就可以通过这个规律来获取更多的网址。我们就定义获取网址的一个函数。

    def Geturl(self):
        all_url = []
        for item in range(3):
            all_url.append(self.base_url.format(item))
        return all_url

定义一个列表来保存网址,通过for循环增加网址。基础网址我们已经初始化了,这里可以直接用。
3.发送请求,获取响应
那么现在我们有了网址,下一波就模拟网页想服务器发送请求,获取响应。
点击鼠标右键,点击检查(小编用的谷歌浏览器,其他浏览器也可以右键)
在这里插入图片描述
进来会发现这个页面,如果没有,就ctrl+r 刷新下
在这里插入图片描述
我大体介绍下这个网页的构成,这里是网页的源代码,又一个个标签组成的(小编也是初学者,目前还没有学习前端的知识,这是个人的理解)
点击network,会发现有许多选项,就随便点击一个
在这里插入图片描述
在这里插入图片描述
我们现在重点关注右边,往下找,会找到user_agent,这是就浏览器的信息,服务器也是通过这个信息来判断是浏览器来发送的请求,还是其他,这个非常关键。那么现有了网址,也有了user-agent,就可以模拟浏览器了。
在这里插入图片描述
在初始化函数里添加我们刚刚找到的user-agent,注意要用字典的形式。

    def __init__(self):
        self.base_url = "https://www.duitang.com/search/?kw=肖战&type=feed#!s-p{}"
        self.header = {"user-agent":
                           "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36"
                       }

定义函数来获取网页的源代码,运行函数

    def Respons(self, all_url):
        text_list=[]
        for url in all_url:
            r = requests.get(url, headers=self.header)
            text_list.append(r.text)
        return text_list

在这里插入图片描述
点击这个按钮,再去点击图片,可以快速找到该图片的源代码
在这里插入图片描述
我们发现图片的网址构成组成方式相同,都是<img data-rootid…构成,我们就把这个标签复制下来,就通过正则表达筛选。
4.清洗数据,获取图片网址
我们就创建一个新函数来清洗数据。

     def clear(self, respons):
        for i in respons:
            qqq = r'<img data-rootid=".*?" alt="肖战" data-iid="" src="(.*?)" height=".*?"/>'
            pi = re.findall(qqq, i)
            return pi  # 返回图片的网址

正则表达式不清楚的可以去看小编之前的文章,讲解了如何使用正则表达式(小编这里筛选数据运用的正则表达式也不是特别好,欢迎各位批评建议)。
运行代码就可以得到图片的网址。
在这里插入图片描述
5.保存数据

        def save(self, url_list):
        i = 0
        # print(url_list)
        if not os.path.exists("肖战图片"):
            os.mkdir("肖战图片")  # 判断有没有该文件夹,如果没有就创建改文件夹
        for url in url_list:
            i = i + 1
            print(url)
            file_path = "./肖战图片" + "/" + str(i) + ".jpg"
            urlretrieve(url, file_path)  # 下载图片,具体的用法可以去搜索下,很简单的
            print("第%d张图片下载成功" % i)

循环通过网址下载图片,并保存在文件夹里。
当然,别忘了主函数run函数的完善,小编没有具体讲,主要就是调用乡音的函数就好了。
完整代码展示
最后展示下完整的代码。

import re  # 正则表达式
import requests  # 爬虫用的包
from urllib.request import urlretrieve  # 本文用来下载图片
import os  # 标准库,本文用来新建文件夹


class Xiaozhan(object):
    def __init__(self):
        self.base_url = "https://www.duitang.com/search/?kw=肖战&type=feed#!s-p{}"
        self.header = {"user-agent":
                           "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36"
                       }

    def Geturl(self):
        all_url = []
        for item in range(3):
            all_url.append(self.base_url.format(item))
        return all_url  # 返回全部网址

    def Respons(self, all_url):
        text_list = []
        for url in all_url:
            r = requests.get(url, headers=self.header)
            text_list.append(r.text)
        return text_list  # 返回网址的源代码

    def clear(self, respons):
        for i in respons:
            pi = re.findall(r"src=\"(https:.*)\" ", i)
            return pi  # 返回图片的网址

    def save(self, url_list):
        i = 0
        # print(url_list)
        if not os.path.exists("肖战图片"):
            os.mkdir("肖战图片")  # 判断有没有该文件夹,如果没有就创建改文件夹
        for url in url_list:
            i = i + 1
            print(url)
            file_path = "./肖战图片" + "/" + str(i) + ".jpg"  # 文件路径
            urlretrieve(url, file_path)  # 下载图片,具体的用法可以去搜索下,很简单的
            print("第%d张图片下载成功" % i)

    def run(self):
        # 1.获取网址的列表
        titile_url = self.Geturl()
        # print(titile_url)
        # 2.发送请求,获取响应
        respons = self.Respons(titile_url)
        # print(respons)
        # 3.通过正则表达式清洗数据
        picture = self.clear(respons)
        print(picture)
        # 4.保存数据
        download = self.save(picture)
        # print(download)


if __name__ == "__main__":
    xiaozhan = Xiaozhan()
    xiaozhan.run()

运行整个程序,就可以看到当前路径多了一个肖战图片的文件夹,点开就可以看见帅气的肖战了,嘻嘻!

希望大家坚持学习,不忘初心,离自己目标越来越近!

原文链接:https://blog.csdn.net/qq_48657881/article/details/107731216



所属网站分类: 技术文章 > 博客

作者:虎王168

链接: https://www.pythonheidong.com/blog/article/469018/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

22 0
收藏该文
已收藏

评论内容:(最多支持255个字符)