浅析Python模块的引入和调用

大家好,我是IT共享者,人称皮皮。这篇文章我们来浅析Python模块的引入和调用。

一、前言

Python中的模块,有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include引入math.h这个头文件,否则是无法正常进行调用的。

那么在Python中,如果要引用一些其他的函数,该怎么处理呢?

在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。

说的通俗点 :模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。

二、模块引入

1. import

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。

形如 :

 import module1,mudule2...

当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。

在调用math模块中的函数时,必须这样引用:

  模块名.函数名

为什么必须加上模块名调用呢?

因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名。

   import math


    #这样会报错
    print sqrt(2)


    #这样才能正确输出结果
    print math.sqrt(2)

有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:

   from 模块名 import 函数名1,函数名2....

不仅可以引入函数,还可以引入一些全局变量、类等。

注意:

  1. 这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。

2. 如果想一次性引入math中所有的东西,还可以通过from math import 来实现

2. from…import

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中。

语法如下:

   from modname import name1[, name2[, ... nameN]]

例如,要导入模块fib的fibonacci函数,使用如下语句:

   from fib import fibonacci

注意:

  • 不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入。

3. from … import *

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

   from modname import *

注意:

  • 这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

4 . 定位模块

当你导入一个模块,Python解析器对模块位置的搜索顺序是:

  1. 当前目录
  2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
  4. 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

三、as 的三种用法

1. with…as…

第一种是和with结合使用,主要用于文件的读写操作,省去了关闭文件的麻烦。

写法:

with open("文件路径","读写方式") as 赋值变量:
    #  执行代码块

实例:

#test.py
with open("1.txt") as f:
    print f.read()


#1.txt(两个文件在同一目录下)

运行结果:

 

2. 导入模块起别名

导入模块是对模块进行重命名,也就是给模块起一个别名。示例代码在下方的第三点有演示。

3. except结合使用

第一种:给traceback模块起别名为a

示例代码 :

import traceback as a
try:
    while 1/0 < 0:
        print True

第二种:和except组合使用,将捕获到的异常对象赋值给e。

实例代码 :

except Exception as e:
    print "e=",e
    a.print_exc()

四、总结

本文详细的讲解了Python基础 ( 模块 )的引入,调用 。介绍了常用的三种模块。模块时的需要注意的事项,以及在实际操作中会遇到的问题,提供了解决方案。希望可以帮助你更好的学习Python。

Python解析库lxml与xpath用法总结

本文主要围绕以xpath和lxml库进行展开:

一、xpath 概念、xpath节点、xpath语法、xpath轴、xpath运算符

二、lxml的安装、lxml的使用、lxml案例

一、xpath

1.xpath概念

XPath 是一门在 XML 文档中查找信息的语言。XPath 使用路径表达式在 XML 文档中进行导航 。XPath 包含一个标准函数库 。XPath 是 XSLT 中的主要元素 。XPath 是一个 W3C 标准 。

2.xpath节点

xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。

节点关系:父、子、兄弟、先辈、后辈。

3.xpath语法

xpath语法在W3c网站上有详细的介绍,这里截取部分知识,供大家学习。

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用”|”运算符,您可以选取若干个路径。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

4.xpath 轴

轴可定义相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

5.xpath运算符

下面列出了可用在 XPath 表达式中的运算符:

运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有拥有 book 和 cd 元素的节点集
+ 加法 6 + 4 10
减法 6 – 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。
!= 不等于 price!=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
< 小于 price<9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
<= 小于或等于 price<=9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
> 大于 price>9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
>= 大于或等于 price>=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。
or price=9.80 or price=9.70 如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。
and price>9.00 and price<9.90 如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。
mod 计算除法的余数 5 mod 2 1

好了,xpath的内容就这么多了。接下来我们要介绍一个神器lxml,他的速度很快,曾经一直是我使用beautifulsoup时最钟爱的解析器,没有之一,因为他的速度的确比其他的html.parser 和html5lib快了许多。

二、lxml

1.lxml安装

lxml 是一个xpath格式解析模块,安装很方便,直接pip install lxml 或者easy_install lxml即可。

2.lxml 使用

lxml提供了两种解析网页的方式,一种是你解析自己写的离线网页时,另一种 则是解析线上网页。

导入包:

from lxml import  etree

1.解析离线网页:

html=etree.parse('xx.html',etree.HTMLParser())
aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')
print(aa)

2.解析在线网页:

from lxml import etree
import requests
rep=requests.get('https://www.baidu.com')
html=etree.HTML(rep.text)
aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')
print(aa)

那么我们怎么获取这些标签和标签对应的属性值了,很简单,首先获取标签只需你这样做:


然后我们可以,比方说,你要获取a标签内的文本和它的属性href所对应的值,有两种方法,

1.表达式内获取

aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/text()')


ab=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]/@href')

2.表达式外获取

aa=html.xpath('//*[@id="s_xmancard_news"]/div/div[2]/div/div[1]/h2/a[1]')


aa.text


aa.attrib.get('href')

这样就完成了获取,怎么样,是不是很简单了,哈哈哈。

下面再来lxml的解析规则:

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
html = lxml.etree.HTML(text)
#使用text构造一个XPath解析对象,etree模块可以自动修正HTML文本
html = lxml.etree.parse('./ex.html',etree.HTMLParser())
#直接读取文本进行解析
from lxml import etree
result = html.xpath('//*')
#选取所有节点
result = html.xpath('//li')
#获取所有li节点
result = html.xpath('//li/a')
#获取所有li节点的直接a子节点
result = html.xpath('//li//a')
#获取所有li节点的所有a子孙节点
result = html.xpath('//a[@href="link.html"]/../@class')
#获取所有href属性为link.html的a节点的父节点的class属性
result = html.xpath('//li[@class="ni"]')
#获取所有class属性为ni的li节点
result = html.xpath('//li/text()')
#获取所有li节点的文本
result = html.xpath('//li/a/@href')
#获取所有li节点的a节点的href属性
result = html.xpath('//li[contains(@class,"li")]/a/text())
#当li的class属性有多个值时,需用contains函数完成匹配
result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
#多属性匹配
result = html.xpath('//li[1]/a/text()')
result = html.xpath('//li[last()]/a/text()')
result = html.xpath('//li[position()<3]/a/text()')
result = html.xpath('//li[last()-2]/a/text()')
#按序选择,中括号内为XPath提供的函数
result = html.xpath('//li[1]/ancestor::*')
#获取祖先节点
result = html.xpath('//li[1]/ancestor::div')
result = html.xpath('//li[1]/attribute::*')
#获取属性值
result = html.xpath('//li[1]/child::a[@href="link1.html"]')
#获取直接子节点
result = html.xpath('//li[1]/descendant::span')
#获取所有子孙节点
result = html.xpath('//li[1]/following::*[2]')
#获取当前节点之后的所有节点的第二个
result = html.xpath('//li[1]/following-sibling::*')
#获取后续所有同级节点

3.lxml案例

为了偷懒,小编决定还是采用urllib那篇文章的代码,哈哈哈,机智如我。

好了,今天就讲这么多,大家感兴趣的话可以多多关注哦,精彩不停息!!!!

本文参考文献:

https://www.w3school.com.cn/

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【入群】

——————- End ——————-

往期精彩文章推荐:

一篇文章教会你使用Python下载抖音无水印视频

今天小编要跟大家分享的是,利用Python如何下载抖音无水印的视频;大家可能要问了,这个有什么用呢?当然有用了。那么有什么用呢?下面小编跟大家详细说说。

众所周知,由于如今短视频的火爆,使得一批又一批的自媒体创作者犹如雨后春笋般冒了出来,其中不乏一些创作者投机取巧想要剽窃他人成功作品,这一行为往往被戏称为白嫖,哈哈哈,废话不多说,撸起袖子就是淦。

一、准备

sublime text 3、360浏览器、Python 3.6运行环境

二、需求分析

首先,我们要弄清楚一件事情,抖音视频的水印是怎么生成上去的,什么时候生成上去的,搞清楚这件事情就能很容易找到原视频的地址,然后就可以直接下载了。

三、操作实践

我们打开手机上的一个抖音视频,然后点击复制链接,把链接复制下来然后到电脑浏览器打开,比如说关于李元霸的这个抖音视频:

多少英雄豪杰被黑,只为神化一个痴呆患者李元霸 https://v.douyin.com/wCgKrh/ 复制此链接,打开【抖音短视频】,直接观看视频!

复制链接在浏览器打开,即可看到这幅画面,如下图:

一篇文章教会你使用Python下载抖音无水印视频

然后我们会发现视频带有抖音字样的水印,很显然这不便于我们白嫖别人的优秀作品,打开审查元素进行查看,如下图:

一篇文章教会你使用Python下载抖音无水印视频

为了程序的美观,我们可以写个GUI界面的:

class page:
    def __init__(self): 
        self.root= tk.Tk()   #初始化窗口
        self.root.title('抖音无水印视频下载v1.0')  #窗口名称
        self.root.geometry("700x700")  #设置窗口大小
        #设置窗口是否可变,宽不可变,高可变,默认为True
        self.root.resizable(width=True,height=True)
        #创建标签,文字,背景颜色,字体(颜色,大小),标签的高和宽
        self.label1 =tk.Label(self.root,text='抖音地址:',font=('宋体',10),width=12,height=2)
        #创建输入框,标签高度,字体大小颜色,内容显示方式
        self.e1 = tk.Entry(self.root,width=30,show=None, font=('Arial', 12))
        self.label2 =tk.Label(self.root,text='文件名:',font=('宋体',10),width=12,height=2)
        #创建输入框,标签高度,字体大小颜色,内容显示方式
        self.e2 = tk.Entry(self.root,width=30,show=None, font=('Arial', 12))
        #创建按钮 内容  宽高  按钮绑定事件
        self.b1 = tk.Button(self.root, text='无水印下载', width=8,height=1,command=self.download)
        self.b2 = tk.Button(self.root, text='清空内容', width=8,height=1,command=self.close)
        self.photo=tk.PhotoImage(file = '111.gif')
        self.im=tk.Label(self.root, image = self.photo)
        self.photo1=tk.PhotoImage(file = '222.gif')
        self.im1=tk.Label(self.root, image = self.photo1)
        self.dashang=tk.Label(self.root,bg='gray',fg='blue',font=('宋体',12),text='感谢各位的支持,觉得小弟写的不错欢迎打赏,以便于我日后分享更多的精彩作品')
        #将所有部件添加到界面中
        self.label1.place(x=140,y=30,anchor='nw')
        self.e1.place(x=210,y=32,anchor='nw')
        self.b2.place(x=500,y=40,anchor='nw')
        self.label2.place(x=144,y=60,anchor='nw')
        self.e2.place(x=210,y=62,anchor='nw')
        self.b1.place(x=230,y=110,anchor='nw')
        self.dashang.place(x=60,y=160)
        self.im.place(x=10,y=200,width=202,height=313,anchor='nw')
        self.im1.place(x=300,y=200,width=202,height=313,anchor='nw')
        self.b3=tk.Button(self.root,text='技术博客,点我直达',command=self.refer)
        self.b3.place(x=200,y=530,width=140,height=40,anchor='nw')
        self.root.mainloop()

效果还不错,可以看看:

一篇文章教会你使用Python下载抖音无水印视频

接下来我们要写的是下载实现代码段,如下:

def download(self):
        url='http://www.zimo.wiki:8080/douyin-video-crawler/api/analysis?url='+self.e1.get()
        try:
            rep=requests.get(url,timeout=5)
            result=rep.text
            res=eval(result)
            if res.get('msg')=='analysis success':
                down_url=res.get('url')
                data=requests.get(down_url,stream=True,timeout=4)
                with open('{}.mp4'.format(self.e2.get()),'wb') as f:
                    f.write(data.content)
            else:
                msg.showwarning('notice','URL Format Error!!!')
        except:
            return

这里我们是用到了一个抖音解析接口:

http://www.zimo.wiki:8080/douyin-video-crawler/api/analysis?url=

只要在它后面加上抖音视频URL,即可解析出无水印视频,是不是很强大?

我们将地址填写进去访问,发现是这样,如图:

一篇文章教会你使用Python下载抖音无水印视频

我们把红线指示的地址复制到地址栏就可以访问到无水印视频啦!

拿到真实地址便可以下载了。

为了让他的功能更加完善,我们再加上关闭和跳转操作,如图:

def close(self):  #关闭
        self.e1.delete(0,'end')
        self.e2.delete(0,'end')
        
 def refer(self): #跳转
        wb.open('https://url.ms/lypks')

最后当然就是启动该程序啦。

page()

得到如下播放画面:

一篇文章教会你使用Python下载抖音无水印视频

可以看到,完全没有水印。

四、总结

本文介绍的技术虽然算不上太高端和前沿,但是挺实用的。感谢大家的多多关注与支持,后期我会出更多实用的代码技巧。

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【入群】

——————- End ——————-

往期精彩文章推荐:

Python基础数据类型——tuple浅析

Python中tuple的使用

一、什么是元组?

有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。

二、用法

1. tuple元组的定义

Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。示例如下:

tup1 = ('361way', 'com', 1997, 2000)
print(type(tup1))
tup2 = (1, 2, 3, 4, 5)tup3 = "a", "b", "c", "d"
print(type(tup3))
Python基础数据类型——tuple浅析

这里通过tup3可以看出,其并没有用小括号进行包括,但其也是元组。所以需要记住:任意无符号的对象,以逗号隔开,默认为元组 。另外需要特别注意只有一个元素时元组的创建:

tup1 = (111)
print(type(tup1))
tup1 = ("abc")
print(type(tup1))
tup1 = ("abc",)
print(type(tup1))
Python基础数据类型——tuple浅析

元组中只包含一个元素时,需要在元素后面添加逗号,否则就会是int 或 string 等其他数据类型。如果只是创建一个空元组时,则不受逗号的影响:

tup1 = ()
print(type(tup1))
Python基础数据类型——tuple浅析

2. 元组的索引与切片

同字符串、列表类型一样,元组也支持索引与切片 。而且用法也相同,

下面结合示例查看下:

tup1 = ('361way', 'com', 2013, 2014)
print(tup1[0])
print(tup1[4]) #取值超出其索引范围时报错
tup2 = (1, 2, 3, 4, 5, 6, 7)
print(tup2[1:5])

由上面的结果可以看出,取出元组的单个元素数据时,得到的是该数据原来的类型 ; 取出其一段元素值时得到的仍是元组。

Python基础数据类型——tuple浅析

3. 修改元组的值

元组中的元素值是不允许删除的,但可以使用del语句来删除整个元组,如下实例:

tup1 = ('361way', 'com', 2013, 2014)
del tup1[3]  # 删除单个元素,报错
tup1[3] = 'abc'  # 更改一个元素的值,报错
print(tup1[3])
del tup1  # 删除整个元组,正常print(tup1)
Python基础数据类型——tuple浅析

在实际应用中,有时候会遇到需要修改元组的值,那怎么办呢?可以通过一个变通的方法实现。

示例如下:

tup1 = ('361way', 'com', 2013, 2014)
list1 = list(tup1)
print(list1)
list1[3] = 'change'
print(list1)
tup1 = tuple(list1)print(tup1)
Python基础数据类型——tuple浅析

可以将tuple元组的值先通过list转化为列表,再对列表内的值进行修改,修改为再将list转化为tuple 。

不过这里需要注意的是此时的tup1已经非彼tup1,具体可以通过id函数进行查看,发现其内存地址已经发生了变化。

三、总结

本文基于Python基础,主要介绍了Python基础中tuple元组的使用,对于tuple的用法做了详细的讲解,用丰富的案例 ,代码效果图的展示帮助大家更好理解 。

tuple是Python内置的有序集合,一个可变,一个不可变。根据需要来选择使用它们。

最后,希望可以帮助大家更好的学习Python。

想学习更多Python网络爬虫与数据挖掘知识,可前往专业网站:http://pdcfighting.com/

IT共享之家

入群请在微信后台回复【入群】

****看完本文有收获?请转发分享给更多的人****

—————— End ——————

往期精彩文章推荐:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

【一、项目背景】

现在的听歌软件动不动就是各种付费,要下载软件才能听,当你下载了之后,你会惊奇的发现这首歌还收费,这就让一向喜欢白嫖的小编感到很伤心了。于是,小编冥思苦想,终于让我发现了其中的奥秘,一起来看看吧。

【二、项目准备】

1、编辑器:Sublime Text 3

2、软件:360浏览器

【三、项目目标】

下载我们喜欢的音乐。

【四、项目实现】

1、打开酷狗音乐官网

360浏览器打开酷狗音乐官网:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

可以看到十分清爽的画风,这也是我比较喜欢的地方。

2、审查元素,分析请求

打开Network ,分析请求,我们可以看到:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

从上图可以看出,这是请求的参数,所以我们可以使用Requests模块对它发起请求。

3、模拟发起请求

我们从网页中得知它的地址为:

https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=%E4%B8%8D%E8%B0%93%E4%BE%A0

可以看到真正对于我们来说有用的就只有SearchKeyWord参数后的值,前面的搜索类型默认填写即可,所以我们可以这样:

import requests
headers={'accept': '*/*',
'accept-encoding':'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cookie': 'kg_mid=ebb2de813317a791bcf7b7d3131880c4; UM_distinctid=1722ba8b22632d-07ac0227c507a7-4e4c0f20-1fa400-1722ba8b2284a1; kg_dfid=0Q0BEI47P4zf0mHYzV0SYbou; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1590041687,1590280210,1590367138,1590367386; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1590367431',
'referer': 'https://www.kugou.com/yy/html/search.html',
'sec-fetch-mode': 'no-cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}aa=input('请输入歌名:')
data={
'callback': 'jQuery112408716317197794392_1590368232677',
'keyword':aa,
'page': '1',
'pagesize':'30',
'userid':'-1',
'clientver': '',
'platform': 'WebFilter',
'tag': 'em',
'filter': '2',
'iscorrection': '1',
'privilege_filter': '0',
'_': '1590368232679',
}requests.get('https://www.kugou.com/yy/html/search.html',params=data,timeout=4)

这样就实现了模拟请求,我们来验证下:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

可以看出它成功打印出了和我们上面一模一样的地址。

4、获取音乐文件列表

rep=requests.get('https://www.kugou.com/yy/html/search.html',params=data,timeout=5)
print(rep.url)
res=requests.get(rep.url,timeout=4)
print(res.text)

当我们将请求地址填写正确后,我发现竟然内容与预期不相符,但是请求地址对的一批。

我以为是这样的结果:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

实际上的结果:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

可以看到差距很大,而且用Json也根本获取不到,报格式错误,说明不是一个Json,看来这比QQ音乐难度高点。不过我们今天要下载的是音频文件,所以暂时跳过,不管它。

5、下载音频文件

我们在搜索后弹出来的列表中选择原唱曲目,进去听一下:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

我选择第一首,打开是这样,我们开始骚操作,打开Network:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

我们输入后缀Mp3,然后定位到对应的请求,然后打开它的请求结果,可以看到一个Json结果:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

我们将Json结果粘贴到控制台,可以看到里面有一段关于Mp3的结果,不过添加了点干扰符号,我们把它提取出来:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

这样我们就可以把酷狗音乐的歌曲下载下来了。

【五、项目总结】

1、其实,酷狗音乐与QQ音乐不同,酷狗音乐的下载链接更好捕获,你可以直接在它的播放界面捕获到:

一篇文章教会你使用Python网络爬虫下载酷狗音乐

模拟请求这个界面,一切都搞定了。

2、关于QQ音乐的获取,可以参考之前发布的系列文章:

3、需要本文源码的小伙伴,后台回复“酷狗音乐”四个字,即可获取。

IT共享之家

入群请在微信后台回复【入群】

****看完本文有收获?请转发分享给更多的人****

—————— End ——————

往期精彩文章推荐:

一篇文章教会你利用Python网络爬虫获取分类图片

【一、项目背景】

博海拾贝是一支互联网从业者在线教育的团队,扎根于中国教育行业以及互联网行业的创新和眼球中,打造专业体系化的互联网人在线教育平台。精心创作许多精彩的文章,提供了很多有趣的图片。

今天来教大家如何使用Python来爬取博海拾贝的图片,分类保存,写入文档。

一篇文章教会你利用Python网络爬虫获取分类图片

【二、项目目标】

创建一个文件夹, 分类保存所有文章图片。下载成功,结果显示控制台。

【三、项目分析】

1、如何找到真正访问的地址,多网页请求?

滑动鼠标,观察网站,右键F12 。鼠标滚轮滑动加载新内容。如图:

一篇文章教会你利用Python网络爬虫获取分类图片

点开随机网页 , 点开Request URL ,观察网址的规律。

一篇文章教会你利用Python网络爬虫获取分类图片
https://bh.sb/page/1/
https://bh.sb/page/2/
https://bh.sb/page/3/
https://bh.sb/page/4/

观察到,每增加一页page/{}/自增加1,用{}代替变换的变量,再用for循环遍历这网址,实现多个网址请求。

2. 反爬处理

1)获取正常的 http请求头,并在requests请求时,设置这些常规的http请求头。

2)使用 fake_useragent ,产生随机的UserAgent进行访问。

【四、涉及的库和网站】

1、网址如下:

https://www.doutula.com/photo/list/?page={}

2、涉及的库:requestslxmlfake_useragenttimeos

3、软件:PyCharm

【五、项目实施】

1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个主函数main继承self。导入需要的库和网址,创建保存文件夹。

import requests, os
from lxml import etree
from fake_useragent import UserAgent
import timeclass bnotiank(object):    def __init__(self):
        os.mkdir("图片")  # 在创建文件夹 记住只有第一次运行加上,如果多次运行请注释掉本行。
    def main(self):
          pass
if __name__ == '__main__':
    Siper=bnotiank()
    Siper.main()

2、随机UserAgent ,构造请求头,防止反爬。

ua = UserAgent(verify_ssl=False)
    for i in range(1, 50):
        self.headers = {            'User-Agent': ua.random
        }

3、发送请求 ,获取响应,页面回调,方便下次请求。

'''发送请求  获取响应'''
    def get_page(self, url):
        res = requests.get(url=url, headers=self.headers)        html = res.content.decode("utf-8")
        return html

4、定义parse_page函数,获取二级页面地址,for遍历获取需要的字段。

 def parse_page(self, html):
        parse_html = etree.HTML(html)        image_src_list = parse_html.xpath('//p/a/@href')
        # print(image_src_list)

5、对二级页面发生请求,xpath解析数据,获取大图片链接。

reo = parse_html1.xpath('//div//div[@class="content"]') #父结点
    for j in reo:
        d = j.xpath('.//article[@class="article-content"]//p/img/@src')[0]
        text = parse_html1.xpath('//h1[@class ="article-title"] //a/text()')[0].strip()

6、请求图片地址,写入文档。

 html2 = requests.get(url=d, headers=self.headers).content
    dirname = "./d/" + text + ".jpg" #定义图命名
    with open(dirname, 'wb') as f:
        f.write(html2)        print("%s 【下载成功!!!!】" % text)

7、调用方法,实现功能。

url = self.url.format(page)
print(url)
html = self.get_page(url)
self.parse_page(html)

8、设置延时。(防止ip被封)。

  time.sleep(1) """时间延时"""

【六、效果展示】

1、点击绿色小三角运行输入起始页,终止页。

一篇文章教会你利用Python网络爬虫获取分类图片

2、将下载成功信息显示在控制台。

一篇文章教会你利用Python网络爬虫获取分类图片

3、text 作为图片命名,展示效果如下所示。

一篇文章教会你利用Python网络爬虫获取分类图片

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、本文基于Python网络爬虫,讲述了反爬技巧,利用爬虫库,实现了分类图片的获取,存入文档。

3、希望通过这个项目,能够帮助了解xpath,字符串是如何拼接,format函数如何运用。

4、实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

5、需要本文源码的小伙伴,后台回复“博海拾贝”四个字,即可获取。

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【入群】

——————- End ——————-

往期精彩文章推荐:

一篇文章教会你利用Python网络爬虫成为斗图达人

【一、项目背景】

你是否在寻找可以与高手斗图的应用? 你是否在寻找可以自制表情的应用?你是否在寻找最全、最爆笑的表情库?

斗图网是一个收集了成千上万的撕逼斗图表情包,在这里你可以快速找到想要的表情, 更好的“斗图”,助您成为真正的斗图终结者!

一篇文章教会你利用Python网络爬虫成为斗图达人

【二、项目目标】

下载表情包,保存文档。

【三、涉及的库和网站】

1、网址如下:

https://www.doutula.com/photo/list/?page={}

2、涉及的库:requests****、lxml、ssl****、time

3、软件:PyCharm

【四、项目分析】

1、如何找到表情包图片地址?

F12右键检查,找到对应的图片的地址。

一篇文章教会你利用Python网络爬虫成为斗图达人

观察网址的变化(一般取前三页):

https://www.doutula.com/photo/list/?page=1
https://www.doutula.com/photo/list/?page=2
https://www.doutula.com/photo/list/?page=3

发现点击下一页时,page{}每增加一页自增加1,用{}代替变换的变量,再用for循环遍历这网址,实现多个网址请求。

2. 如何解除ssl验证?

因为这个网址是https,需要导入一个ssl模块,忽略ssl验证。

一篇文章教会你利用Python网络爬虫成为斗图达人

3. ****如何获取Cookie?

右键检查,找到NetWork,随便复制一个Cookie即可。

一篇文章教会你利用Python网络爬虫成为斗图达人

【五、项目实施】

1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个主函数main继承self。导入需要的库。

import requests
from lxml import etree
from fake_useragent import UserAgent
import ssl  # ssl验证import time
ssl._create_default_https_context = ssl._create_unverified_contextclass  Emoticon(object):
    def __init__(self):        pass    def main(self):        passif __name__ == '__main__': 
    spider = Emoticon()    spider.main()

2、导入网址和构造请求头,防止反爬。

 def __init__(self):
        self.headers = {'User-Agent': 'Mozilla/5.0'}
        self.url = 'https://www.doutula.com/photo/list/?page={}'

3、发送请求 ,获取响应,页面回调,方便下次请求。

 def get_page(self, url):
        res = requests.get(url=url, headers=self.headers)
        html = res.content.decode("utf-8")
        return html

4、xpath解析页面。

这里我们先获取父节点,在通过for循环遍历,找到对应的子节点(图片地址)。

一篇文章教会你利用Python网络爬虫成为斗图达人
  image = parse_html.xpath('//ul[@class="list-group"]/li/div/div//a')
  for i in image:      image_src_list = i.xpath('.//img/@data-original')[0]
      image_name = i.xpath('.//img//@alt')[0]

运行的结果:

一篇文章教会你利用Python网络爬虫成为斗图达人

5、对图片地址发生请求,取对应图片地址后10位,作为图片的命名,写入文件(每一张图片的后缀名不一样,所有这里不采用image_name作为图片的命名)。

 html2 = requests.get(url=image_src_list, headers=self.headers).content
  name = "/图/" + image_src_list[-20:]
  #print(name[-10:])
  with open(name[-10:], 'wb') as f:
      f.write(html2)      print("%s 【下载成功!!!!】" % image_name)
      print("==================================")

6、调用方法,实现功能。

   html = self.get_page(url)
   self.parse_page(html)
           print("======================第%s页爬取成功!!!!=======================" % page)

7、time模块打出执行时间。

 start = time.time()
  end = time.time()
  print('执行时间:%.2f' % (end - start))

【六、效果展示】

1、点击绿色小三角运行输入起始页,终止页。

一篇文章教会你利用Python网络爬虫成为斗图达人

2、将下载成功信息显示在控制台。

一篇文章教会你利用Python网络爬虫成为斗图达人

3、保存文档,在本地可以看到斗图。

一篇文章教会你利用Python网络爬虫成为斗图达人

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、本文基于Python网络爬虫,利用爬虫库,获取表情包,存入文档。

3、希望通过这个项目能够了解到,对于HTTPS网站,解除ssl验证的有大致的了解。

4、可以尝试的去爬取其他的分类的表情包,按照步骤去实现,实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

5、需要本文源码的小伙伴,后台回复“斗图达人”四个字,即可获取。

IT共享之家

入群请在微信后台回复【入群】

****看完本文有收获?请转发分享给更多的人****

—————— End ——————

往期精彩文章推荐:

一篇文章教会你利用Python网络爬虫实现豆瓣电影采集

【一、项目背景】

豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务。可以记录想看、在看和看过的电影电视剧 、顺便打分、写影评。极大地方便了人们的生活。

今天以电视剧(美剧)为例,批量爬取对应的电影,写入csv文档 。用户可以通过评分,更好的选择自己想要的电影。

 

【二、项目目标】

获取对应的电影名称,评分,详情链接,下载 电影的图片,保存文档。

 

【三、涉及的库和网站】

1、网址如下:

https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}

2、涉及的库:requests****、fake_useragent、json****、csv

3、软件:PyCharm

 

【四、项目分析】

1、如何多网页请求?

点击下一页时,每增加一页paged自增加20,用{}代替变换的变量,再用for循环遍历这网址,实现多个网址请求。

2、如何获取真正请求的地址?

请求数据时,发现页面上并没有对应数据。其实豆瓣网采用javascript动态加载内容,防止采集。

1)F12右键检查,找到Network,左边菜单Name , 找到第五个数据,点击Preview。

2)点开subjects,可以看到 title 就是对应电影名称。rate就是对应评分。通过js解析subjects字典,找到需要的字段。

  1. 如何网页访问?
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=0

https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=20

https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=40

https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start=60

当点击下一页时,每增加一页page自增加20,用{}代替变换的变量,再用for循环遍历这网址,实现多个网址请求。

 

【五、项目实施】

1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个主函数main继承self。导入需要的库和请求网址。

import requests,json
from fake_useragent import UserAgent
import csv

class  Doban(object):
    def __init__(self):
      self.url = "https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%BE%8E%E5%89%A7&sort=recommend&page_limit=20&page_start={}"

    def main(self):
        pass

if __name__ == '__main__':
    Siper = Doban()
    Siper.main()

2、随机产生UserAgent,构造请求头,防止反爬。

for i in range(1, 50):
            self.headers = {
                'User-Agent': ua.random,
            }

3、发送请求 ,获取响应,页面回调,方便下次请求。

    def get_page(self, url):
        res = requests.get(url=url, headers=self.headers)
        html = res.content.decode("utf-8")
        return html

4、json解析页面数据,获取对应的字典。

   data = json.loads(html)['subjects']
    # print(data[0])

5、for遍历,获取对应的电影名、 评分、下详情页链接。

      print(name, goblin_herf)
      html2 = self.get_page(goblin_herf)  # 第二个发生请求
      parse_html2 = etree.HTML(html2)
      r = parse_html2.xpath('//div[@class="entry"]/p/text()')

6、创建csv文件进行写入,定义对应的标题头内容,保存数据 。

    # 创建csv文件进行写入
    csv_file = open('scr.csv', 'a', encoding='gbk')
    csv_writer = csv.writer(csv_file)
    # 写入csv标题头内容
    csv_writerr.writerow(['电影', '评分', "详情页"])
    #写入数据
    csv_writer.writerow([id, rate, urll])

7、图片地址进行请求。定义图片名称,保存文档。

    html2 = requests.get(url=urll, headers=self.headers).content
    dirname = "./图/" + id + ".jpg"
    with open(dirname, 'wb') as f:
        f.write(html2)
        print("%s 【下载成功!!!!】" % id)

8、调用方法,实现功能。

   html = self.get_page(url)
   self.parse_page(html)

9、项目优化:

1)设置时间延时。

 time.sleep(1.4)

2)定义一个变量u, for遍历,表示爬取的是第几页。(更清晰可观)。

 u = 0
 self.u += 1;

 

【六、效果展示】

1、点击绿色小三角运行输入起始页,终止页( 从0页开始 )。

2、将下载成功信息显示在控制台。

3、保存csv文档。

4、电影图片展示。

 

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、本文章就Python爬取豆瓣网,在应用中出现的难点和重点,以及如何防止反爬,做出了相对于的解决方案。

3、希望通过这个项目,能够帮助了解json解析页面的基本流程,字符串是如何拼接,format函数如何运用。

4、本文基于Python网络爬虫,利用爬虫库,实现豆瓣电影及其图片的获取。实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

5、需要本文源码的小伙伴,后台回复“豆瓣电影”四个字,即可获取。

****看完本文有收获?请转发分享给更多的人****

IT共享之家

入群请在微信后台回复【入群】

—————— End ——————-

往期精彩文章推荐:

一篇文章教会你利用Python网络爬虫获取穷游攻略

【一、项目背景】

穷游网提供原创实用的出境游旅行指南、攻略,旅行社区和问答交流平台,以及智能的旅行规划解决方案,同时提供签证、保险、机票、酒店预订、租车等在线增值服务。穷游“鼓励和帮助中国旅行者以自己的视角和方式体验世界”。

今天教大家获取穷游网的城市信息,使用Python将数据写入csv文档。

一篇文章教会你利用Python网络爬虫获取穷游攻略

 

【二、项目目标】

实现将获取对应的城市、图片链接、热点、批量下载 保存csv文档。

 

【三、涉及的库和网站】

1、网址如下:

https://place.qyer.com/south-korea/citylist-0-0-{}

2、涉及的库:requestsl****xml、fake_useragent、time、csv

 

【四、项目分析】

首先需要解决如何对下一页的网址进行请求的问题。可以点击下一页的按钮,观察到网站的变化分别如下所示:

https://place.qyer.com/south-korea/citylist-0-0-1
https://place.qyer.com/south-korea/citylist-0-0-2
https://place.qyer.com/south-korea/citylist-0-0-3

观察到只有citylist-0-0-{}/变化,变化的部分用{}代替,再用for循环遍历这网址,实现多个网址请求。

 

【五、项目实施】

1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个主函数main继承self。准备url地址。

import requests,os
from lxml import etree
import randomimport timefrom fake_useragent import UserAgent
class Travel(object):    def __init__(self):
        self.url = "https://place.qyer.com/south-korea/citylist-0-0-{}/"
    def main(self):
        passif __name__ == '__main__':
    spider= Travel()    spider.main()

2、随机产生UserAgent。

      self.film_list = []
      ua = UserAgent(verify_ssl=False)
        for i in range(1, 50):
            self.film_list.append(ua.chrome)
            self.Hostreferer = {
            'User-Agent': random.choice(self.film_list)
        }

3、多页请求。

        startPage = int(input("起始页:"))
        endPage = int(input("终止页:"))
        for page in range(startPage, endPage + 1):
            url = self.url.format(page)

4、定义get_page方法,进行数据请求。

  '''数据请求'''
    def get_page(self, url):
        html = requests.get(url=url, headers=self.Hostreferer).content.decode("utf-8")
        self.page_page(html)        # print(html)//网页
        # print(self.headers)//构造头

5、定义page_page,xpath解析数据, for循环遍历数组。

在谷歌浏览器上,右键选择开发者工具或者按F12。右键检查,xpath找到对应信息的字段。如下图所示。

一篇文章教会你利用Python网络爬虫获取穷游攻略
   parse_html = etree.HTML(html)
    image_src_list = parse_html.xpath('//ul[@class="plcCitylist"]/li') 
    for i in image_src_list:            b = i.xpath('.//h3//a/text()')[0].strip()
            c = i.xpath('.//p[@class="beento"]//text()')[0].strip()
            d = i.xpath('.//p[@class="pics"]//img//@src')[0].strip()

6、定义csv文件保存数据,写入文档。

       # 创建csv文件进行写入
        csv_file = open('scrape.csv', 'a', encoding='gbk')
        csv_writer = csv.writer(csv_file)        csv_writer.writerow([b, c, d])        csv_file.close()

7、在main方法调用。

   def main(self):
        for i1 in range(1, 25):
            url = self.url.format(i1)
            # print(url)
            html = self.get_page(url)
            time.sleep(2)
            print("第%d页" % i1)

8、time模块,设置时间延迟。

           time.sleep(2)

 

【六、效果展示】

1、点击运行,输入起始页,终止页。

一篇文章教会你利用Python网络爬虫获取穷游攻略

2、将下载成功信息显示在控制台。

一篇文章教会你利用Python网络爬虫获取穷游攻略

3、保存csv文档。

一篇文章教会你利用Python网络爬虫获取穷游攻略

 

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、希望通过这个项目,能够帮助大家对csv文档处理有进一步的了解。

3、本文基于Python网络爬虫,利用爬虫库,实现穷游网的获取。实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

4、可以根据自己的需要选择自己的喜欢的城市获取自己想要的有效信息 。

5、需要本文源码的小伙伴,后台回复“穷游攻略”四个字,即可获取。

****看完本文有收获?请转发分享给更多的人****

IT共享之家

入群请在微信后台回复【入群】

—————— End ——————

往期精彩文章推荐:

一篇文章教会你利用Python网络爬虫获取素材图片

【一、项目背景】

在素材网想找到合适图片需要一页一页往下翻,现在学会python就可以用程序把所有图片保存下来,慢慢挑选合适的图片。

 

【二、项目目标】

1、根据给定的网址获取网页源代码。

2、利用正则表达式把源代码中的图片地址过滤出来。

3、过滤出来的图片地址下载素材图片。

 

【三、涉及的库和网站】

1、网址如下:

https://www.51miz.com/

2、涉及的库:requestslxml

 

【四、项目分析】

首先需要解决如何对下一页的网址进行请求的问题。可以点击下一页的按钮,观察到网站的变化分别如下所示:

https://www.51miz.com/so-sucai/1789243.html
https://www.51miz.com/so-sucai/1789243/p_2/
https://www.51miz.com/so-sucai/1789243/p_3/

我们可以发现图片页数是1789243/p{},p{}花括号数字表示图片哪一页。

 

【五、项目实施】

1、打开觅知网,在搜索中输入你想要的图片素材(以鼠年素材图片为例)。

2、根据上一步对网址的分析,首先我们定义一个类叫做ImageSpider,类里面定义初始化函数、发送请求获取响应数据函数、解析函数、主函数。首先初始化函数,准备url地址和headers,代码如下图所示。

3、发送请求获取响应数据函数。

4、解析数据,使用xpath获取二级页面链接,最后把图片存储在文件夹中。使用谷歌浏览器选择开发者工具或直接按F12,发现我们需要的图片src是在img标签下的,于是用Python的requests提取该组件。

5、主函数,代码如下图所示。

 

【六、效果展示】

1、运行程序,在控制台输入你要爬取的页数,如下图所示。

2、在本地可以看到效果图,如下图所示。

 

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、希望通过这个项目,能够帮助大家下载到素材图片。

3、本文基于Python网络爬虫,利用爬虫库,实现素材图片的获取。实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

4、需要本文源码的小伙伴,后台回复“素材图片”四个字,即可获取。

****看完本文有收获?请转发分享给更多的人****

【公众号】IT共享之家

入群请在微信后台回复【入群】

—————— End ——————

往期精彩文章推荐: