大家好,本文将围绕python爬取网页数据并生成数据图表展开说明,python爬取网页数据并生成gui界面是一个很多人都想弄明白的事情,想搞清楚python爬取网页数据代码可视化需要先了解以下几个事情。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能

目录

实现HTTP请求

使用urllib3库实现

1. 生成请求

2. 请求头处理

3. Timeout设置

4.请求重试设置

5. 生成完整HTTP请求

使用requests库实现

1. 生成请求

2. 查看状态码与编码

3. 请求头与响应头处理

4. Timeout设置

5. 生成完整HTTP请求

解析网页

使用chrome开发者工具查看网页

使用正则表达式解析网页 

1.  Python正则表达式模块

compile方法      

search方法      

findall方法      

2. 获取网页中的标题内容

使用Xpath解析网页

1. 基本语法

2. 谓语

3. 功能函数

4. 提取header节点下全部标题文本及对应链接

使用Beautiful Soup解析网页

1. 创建BeautifulSoup对象

 2. 对象类型

3. 搜索特定节点并获取其中的链接及文本

3. 搜索特定节点并获取其中的链接及文本

数据储存

数据存储

1. 将数据存储为JSON文件

2. 将数据存储入MySQL数据库 


实现HTTP请求

使用urllib3库实现

许多Python的原生系统已经开始使用urllib3库,其提供了很多python标准库里所没有的重要特性。

连接特性

连接特性

线程安全

管理连接池

客户端SSL∕TLS验证

使用分部编码上传文件

协助处理重复请求和HTTP重定位

支持压缩编码

支持HTTP和SOCKS代理

测试覆盖率达到100%

1. 生成请求

通过request方法即可创建一个请求,该方法返回一个HTTP响应对象python工程师怎么考。Reques语法格式如下。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_02

reques方法常用的参数及其说明如下。

参数

说明

method

接收string。表示请求的类型,如“GET”、“HEAD”、“DELETE”等。无默认值

url

接收string。表示字符串形式的网址。无默认值

fields

接收dict。表示请求类型所带的参数。默认为None

headers

接收dict。表示请求头所带参数。默认为None

**urlopen_kw

接收dict或其他Python中的类型的数据。依据具体需要及请求的类型可添加的参数,通常参数赋值为字典类型或为具体数据。无默认值

2. 请求头处理

在request方法中,如果需要传入headers参数,可通过定义一个字典类型实现。定义一个包含User-Agent信息的字典,使用浏览器为火狐和chrome浏览器,操作系统为“Windows NT 6.1; Win64; x64”,向网站“http://www.tipdm.com/tipdm/index.html”发送带headers参数的GET请求,hearders参数为定义的User-Agent字典。

3. Timeout设置

为防止因为网络不稳定、服务器不稳定等问题造成连接不稳定时的丢包,可以在请求中增加timeout参数设置,通常为浮点数。依据不同需求,timeout参数提供多种设置方法,可直接在URL后设置该次请求的全部timeout参数,也可分别设置该次请求的连接与读取timeout参数,在PoolManager实例中设置timeout参数可应用至该实例的全部请求中。

4.请求重试设置

urllib3库可以通过设置retries参数对重试进行控制。默认进行3次请求重试,并进行3次重定向。自定义重试次数通过赋值一个整型给retries参数实现,可通过定义retries实例来定制请求重试次数及重定向次数。若需要同时关闭请求重试及重定向则可以将retries参数赋值为False,仅关闭重定向则将redirect参数赋值为False。与Timeout设置类似,可以在PoolManager实例中设置retries参数控制全部该实例下的请求重试策略。

5. 生成完整HTTP请求

使用urllib3库实现生成一个完整的请求,该请求应当包含链接、请求头、超时时间和重试次数设置。

使用requests库实现

requests库是一个原生的HTTP库,比urllib3库更为容易使用。requests库发送原生的HTTP 1.1请求,无需手动为URL添加查询字串,也不需要对POST数据进行表单编码。相对于urllib3库,requests库拥有完全自动化Keep-alive和HTTP连接池的功能。requests库包含的特性如下。

连接特性

连接特性

连接特性

Keep-Alive&连接池

基本∕摘要式的身份认证

文件分块上传

国际化域名和URL

优雅的key∕value Cookie

流下载

带持久Cookie的会话

自动解压

连接超时

浏览器式的SSL认证

Unicode响应体

分块请求

自动内容解码

HTTP(S)代理支持

支持.netrc

1. 生成请求

requests库生成请求的代码非常便利,其使用的request方法的语法格式如下。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_03

request方法常用的参数及其说明如下。 

参数

说明

method

接收string。表示请求的类型,如“GET”、“HEAD”、“DELETE”等。无默认值

url

接收string。表示字符串形式的网址。无默认值

**kwargs

接收dict或其他Python中的类型的数据。依据具体需要及请求的类型可添加的参数,通常参数赋值为字典类型或为具体数据

2. 查看状态码与编码

需要注意的是,当requests库猜测错时,需要手动指定encoding编码,避免返回的网页内容解析出现乱码。 手动指定的方法并不灵活,无法自适应对应爬取过程中不同网页的编码,而使用chardet库比较简便灵活,chardet库是一个非常优秀的字符串∕文件编码检测模块。 chardet库使用detect方法检测给定字符串的编码,detect方法常用的参数及其说明如下。

参数

说明

byte_str

接收string。表示需要检测编码的字符串。无默认值

3. 请求头与响应头处理

requests库中对请求头的处理与urllib3库类似,也使用headers参数在GET请求中上传参数,参数形式为字典。使用headers属性即可查看服务器返回的响应头,通常响应头返回的结果会与上传的请求参数对应。

4. Timeout设置

为避免因等待服务器响应造成程序永久失去响应,通常需要给程序设置一个时间作为限制,超过该时间后程序将会自动停止等待。在requests库中通过设置timeout这个参数实现,超过该参数设定的秒数后,程序会停止等待。

5. 生成完整HTTP请求

使用requests库的request方法向网站“http://www.tipdm.com/tipdm/index.html”发送一个完整的GET请求,该请求包含链接、请求头、响应头、超时时间和状态码,并且编码应正确设置。

解析网页

使用chrome开发者工具查看网页

chrome浏览器提供了一个非常便利的开发者工具,供广大web开发者使用,该工具提供包括查看网页元素、查看请求资源列表、调试JS等功能。该工具其中一个打开方式可通过右键单击chrome浏览器页面,在弹出菜单中单击图所示的“检查”选项打开。  

python能爬取外网数据嘛 python爬取网页数据违法吗_python能爬取外网数据嘛_04

也可以单击chrome浏览器右上角快捷菜单,如图所示,单击“更多工具”选项中的“开发者工具”选项,或使用快捷键组合Ctrl+Shift+I。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_05

 chrome开发者工具目前包括了9个面板,界面如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_python能爬取外网数据嘛_06

 chrome开发者工具各面板功能如下。

面板

说明

元素面板(Elements)

该面板可查看渲染页面所需的HTML、CSS和DOM(Document Object Model)对象,并可实时编辑这些元素调试页面渲染效果

控制台面板(Console)

该面板记录各种警告与错误信息,并可作为shell在页面上与JavaScript交互

源代码面板(Sources)

该面板中可以设置断点调试JavaScript

网络面板(Network)

该面板可查看页面请求、下载的资源文件及优化网页加载性能。还可查看HTTP的请求头、响应内容等

性能面板(Performance)

原旧版chrome中的时间线面板(Timeline),该页面展示页面加载时所有事件花费时长的完整分析

内存面板(Memory)

原旧版chrome中的分析面板(Profiles),提供比性能面板更详细的分析,如可跟踪内存泄露等

应用面板(Application)

原旧版chrome中的资源面板(Profiles),该面板可检查加载的所有资源

安全面板(Security)

该面板可调试当前网页的安全和认证等问题并确保网站上已正确地实现HTTPS

审查面板(Audits)

该面板对当前网页的网络利用情况、网页性能方面进行诊断,并给出优化建议

 1. 元素面板

在爬虫开发中,元素面板主要用来查看页面元素所对应的位置,比如图片所在位置或文字链接所对应的位置。面板左侧可看到当前页面的结构,为树状结构,单击三角符号即可展开分支。 依次单击树状结构的三角符号,依次打开“body”“header”“div”“nav”标签,找到第一个“li”标签,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_正则表达式_07

将鼠标悬停至“li”标签中的“首页”会同步在原网页界面中标识出对应部分的文字“首页”,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_HTTP_08

2. 源代码面板

切换至源代码面板(Sources),单击左侧“tipdm”文件夹中的“index.html”文件,将在中间显示其包含的完整代码,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_正则表达式_09

3. 网络面板

切换至网络面板(Network),需先重新加载页面,之后单击“index.html”资源,将在中间显示该资源的头部信息、预览、响应信息、Cookies和花费时间详情,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_正则表达式_10

Headers标签展示该资源的HTTP头信息,主要包括Request URL、Request Method、Status Code、Remote Address等基本信息,以及详细的Response Headers、Request Headers,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_11

Preview标签根据所选择的资源类型(JSON、图片、文本)显示相应的预览,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_正则表达式_12

Response标签显示HTTP的响应信息,如图所示中选中的“index.html”文件为HTML文件,将展示HTML代码。

python能爬取外网数据嘛 python爬取网页数据违法吗_正则表达式_13

Cookies标签显示资源HTTP的请求和响应过程中的Cookies信息,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_HTTP_14

Timing标签显示资源在整个请求过程中各部分花费的时间,如图所示。

python能爬取外网数据嘛 python爬取网页数据违法吗_python能爬取外网数据嘛_15

使用正则表达式解析网页 

python能爬取外网数据嘛 python爬取网页数据违法吗_正则表达式_16

1.  Python正则表达式模块

使用re的步骤为:先将正则表达式的字符串形式编译为Pattern实例;然后使用Pattern实例处理文本并获得匹配结果(一个Match实例);最后使用Match实例获得信息,进行其他的操作。re模块中常用的方法及其说明如下。

方法

说明

compile

将正则表达式的字符串转化为Pattern匹配对象

match

将输入的字符串从头开始对输入的正则表达式进行匹配,一直向后直至遇到无法匹配的字符或到达字符串末尾,将立即返回None,否则获取匹配结果

search

将输入的字符串整个扫描,对输入的正则表达式进行匹配,获取匹配结果,否则输出None

split

按照能够匹配的字符串作为分隔符,将字符串分割后返回一个列表

findall

搜索整个字符串,返回一个列表包含全部能匹配的子串

finditer

与findall方法作用类似,以迭代器的形式返回结果

sub

使用指定内容替换字符串中匹配的每一个子串内容

compile方法       re模块中使用compile方法将正则表达式的字符串转化为Pattern匹配对象,compile方法的语法格式如下。  

python能爬取外网数据嘛 python爬取网页数据违法吗_字符串_17

compile方法常用的参数及其说明如下。

参数

说明

string

接收string。表示需要转换的正则表达式的字符串。无默认值

flag

接收string。表示匹配模式,取值为运算符“|”时表示同时生效,如re.I|re.M。默认为None

compile方法      

flag参数的可选值如下。 

可选值

说明

re.I

忽略大小写

re.M

多行模式,改变“^”和“$”的行为

re.S

“.”任意匹配模式,改变“.”的行为

re.L

使预定字符类\w\W\b\B\s\S取决与当前区域设定

re.U

使预定字符类\w\W\b\B\s\S\d\D取决于unicode定义的字符属性

re.X

详细模式,该模式下正则表达式可为多行,忽略空白字符并可加入注释

search方法      

earch方法将输入的字符串整个扫描,对输入的正则表达式进行匹配,若无可匹配字符,将立即返回None                   ,否则获取匹配结果,search方法的语法格式如下。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_18

search方法常用的参数及其说明如下。

参数

说明

pattern

接收Pattern实例。表示转换后的正则表达式。无默认值

string

接收string。表示输入的需要匹配的字符串。无默认值

flag

接收string。表示匹配模式,取值为运算符“|”时表示同时生效,如re.I|re.M。默认为None

findall方法      

findall方法搜索整个string,返回一个列表包含全部能匹配的子串,其语法格式如下。      

python能爬取外网数据嘛 python爬取网页数据违法吗_HTTP_19

findall方法常用的参数及其说明如下。

参数

说明

pattern

接收Pattern实例。表示转换后的正则表达式。无默认值

string

接收string。表示输入的需要匹配的字符串。无默认值

flag

接收string。表示匹配模式,取值为运算符“|”时表示同时生效,如re.I|re.M。默认为None

2. 获取网页中的标题内容

分别使用re库中search方法和findall方法查找使用requests库获取的网页内容中的title内容。 使用正则表达式无法很好的定位特定节点并获取其中的链接和文本内容,而使用Xpath和Beautiful Soup能较为便利的实现这个功能。

使用Xpath解析网页

1. 基本语法

Xpath使用类似正则的表达式来匹配HTML文件中的内容,常用匹配表达式如下。

表达式

说明

nodename

选取nodename节点的所有子节点

/

从当前节点选取直接子节点

//

从当前节点选取子孙节点

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

2. 谓语

Xpath中的谓语用来查找某个特定的节点或包含某个指定的值的节点,谓语被嵌在路径后的方括号中,如下。

表达式

说明

/html/body/div[1]

选取属于body子节点下的第一个div节点

/html/body/div[last()]

选取属于body子节点下的最后一个div节点

/html/body/div[last()-1]

选取属于body子节点下的倒数第二个div节点

/html/body/div[positon()<3]

选取属于body子节点下的下前两个div节点

/html/body/div[@id]

选取属于body子节点下的带有id属性的div节点

/html/body/div[@id=”content”]

选取属于body子节点下的id属性值为content的div节点

/html /body/div[xx>10.00]

选取属于body子节点下的xx元素值大于10的节点

3. 功能函数

Xpath中还提供功能函数进行模糊搜索,有时对象仅掌握了其部分特征,当需要模糊搜索该类对象时,可使用功能函数来实现,具体函数如下。

功能函数

示例

说明

starts-with

//div[starts-with(@id,”co”)]

选取id值以co开头的div节点

contains

//div[contains(@id,”co”)]

选取id值包含co的div节点

and

//div[contains(@id,”co”)andcontains(@id,”en”)]

选取id值包含co和en的div节点

text()

//li[contains(text(),”first”)]

选取节点文本包含first的div节点

4. 提取header节点下全部标题文本及对应链接

使用text方法可以提取某个单独子节点下的文本,若想提取出定位到的子节点及其子孙节点下的全部文本,则需要使用string方法实现。 使用HTML类将其初始化通过requests库获取的网页,之后使用谓语定位id值以me开头的ul节点,并使用text方法获取其所有子孙节点a内的文本内容,使用@选取href属性从而实现提取所有子孙节点a内的链接,最后使用string方法直接获取ul节点及其子孙节点中的所有文本内容。

使用Beautiful Soup解析网页

        Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库。目前Beautiful Soup 3已经停止开发,大部分的爬虫选择使用Beautiful Soup 4开发。Beautiful Soup不仅支持Python标准库中的HTML解析器,还支持一些第三方的解析器,具体语法如下。

解析器

语法格式

优点

缺点

Python标准库

BeautifulSoup(markup, "html.parser")

Python的内置标准库

执行速度适中

文档容错能力强

Python 2.7.3或3.2.2前的版本中文档容错能力差

lxml HTML解析器

BeautifulSoup(markup, "lxml")

速度快

文档容错能力强

需要安装C语言库

lxml XML解析器

BeautifulSoup(markup, ["lxml-xml"])

BeautifulSoup(markup, "xml")

速度快

唯一支持XML的解析器

需要安装C语言库

html5lib

BeautifulSoup(markup, "html5lib")

最好的容错性

以浏览器的方式解析文档

生成HTML5格式的文档

速度慢

不依赖外部扩展

1. 创建BeautifulSoup对象

要使用Beautiful Soup库解析网页首先需要创建BeautifulSoup对象,将字符串或HTML文件传入Beautiful Soup库的构造方法可以创建一个BeautifulSoup对象,使用格式如下。

python能爬取外网数据嘛 python爬取网页数据违法吗_正则表达式_20

生成的BeautifulSoup对象可通过prettify方法进行格式化输出,其语法格式如下。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_21

prettify方法常用的参数及其说明如下。

参数

说明

encoding

接收string。表示格式化时使用的编码。默认为None

formatter

接收string。表示格式化的模式。默认为minimal,表示按最简化的格式化将字符串处理成有效的HTML∕XML

 2. 对象类型

Tag对象类型

Tag对象为HTML文档中的标签,形如“<title>The Dormouse's story</title>”或“<p class="title"><b>The Dormouse's story</b></p>”等HTML标签再加上其中包含的内容便是Beautiful Soup中的Tag对象。

通过Tag的名称属性可以很方便的在文档树中获取需要的Tag对象,通过该方法只能获取文档树中第一个同名的Tag对象,而通过多次调用可获取某个Tag对象下的分支Tag对象。通过find_all方法可以获取文档树中的全部同名Tag对象。

Tag有两个非常重要的属性:name和attributes。name属性可通过name方法来获取和修改,修改过后的name属性将会应用至BeautifulSoup对象生成的HTML文档。

NavigableString对象类型

NavigableString对象为包含在Tag中的文本字符串内容,如“<title>The Dormouse‘s story</title>”中的“The Dormouse’s story”,使用string的方法获取,NavigableString对象无法被编辑,但可以使用replace_with的方法进行替换。

BeautifulSoup对象类型

BeautifulSoup对象表示的是一个文档的全部内容。大部分时候,可以把它当作Tag对象。 BeautifulSoup对象并不是真正的HTML或XML的tag,所以并没有tag的name和attribute属性,但其包含了一个值为“[document]”的特殊属性name。

Comment对象类型

Tag、NavigableString、BeautifulSoup几乎覆盖了html和xml中的所有内容,但是还有一些特殊对象,文档的注释部分是最容易与Tag中的文本字符串混淆的部分。Beautiful Soup库中将文档的注释部分识别为Comment类型,Comment对象是一个特殊类型的NavigableString对象,但是当其出现在HTML文档中时,Comment对象会使用特殊的格式输出,需调用prettify方法。

3. 搜索特定节点并获取其中的链接及文本

Beautiful Soup定义了很多搜索方法,其中常用的有find方法和find_all方法,两者的参数一致,区别为find_all方法的返回结果是值包含一个元素的列表,而find直接返回的是结果。find_all方法用于搜索文档树中的Tag非常方便,其语法格式如下。

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_22

find_all方法的常用参数及其说明如下。

参数

说明

name

接收string。表示查找所有名字为name的tag,字符串对象会被自动忽略掉,搜索name参数的值可以使用任一类型的过滤器:字符串、正则表达式、列表、方法或True。无默认值

attrs

接收string。表示查找符合CSS类名的tag,使用class做参数会导致语法错误,从Beautiful Soup的4.1.1版本开始,可以通过class_参数搜索有指定CSS类名的tag。无默认值

recursive

接收Built-in。表示是否检索当前tag的所有子孙节点。默认为True,若只想搜索tag的直接子节点,可将该参数设为False

string

接收string。表示搜索文档中匹配传入的字符串的内容,与name参数的可选值一样,string参数也接收多种过滤器。无默认值

**kwargs

若一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索

3. 搜索特定节点并获取其中的链接及文本

 find_all方法可通过多种参数遍历搜索文档树中符合条件的所有子节点。

  • 可通过name参数搜索同名的全部子节点,并接收多种过滤器。
  • 按照CSS类名可模糊匹配或完全匹配。完全匹配class的值时,如果CSS类名的顺序与实际不符,将搜索不到结果。
  • 若tag的class属性是多值属性,可以分别搜索tag中的每个CSS类名。
  • 通过字符串内容进行搜索符合条件的全部子节点,可通过过滤器操作。
  • 通过传入关键字参数,搜索匹配关键字的子节点。

数据储存

数据存储

1. 将数据存储为JSON文件

将数据存储为JSON文件的过程为一个编码过程,编码过程常用dump函数和dumps函数。两者的区别在于,dump函数将Python对象转换为JSON对象,并通过fp文件流将JSON对象写入文件内,而dumps函数则生成一个字符串。dump函数和dumps函数的语法格式如下。

python能爬取外网数据嘛 python爬取网页数据违法吗_字符串_23

dump函数和dumps函数的常用参数及其说明如下。 

参数

说明

skipkeys

接收Built-in。表示是否跳过非Python基本类型的key,若dict的keys内的数据为非Python基本类型,即不是str、unicode、int、long、float、bool、None等类型,设置该参数为False时,会报TypeError错误。默认值为False,设置为True时,跳过此类key

ensure_ascii

接收Built-in。表示显示格式,若dict内含有非ASCII的字符,则会以类似“\uXXX”的格式显示。默认值为True,设置为False后,将会正常显示

indent

接收int。表示显示的行数,若为0或为None,则在一行内显示数据,否则将会换行且按照indent的数量显示前面的空白,将JSON内容格式化显示。默认为None

separators

接收string。表示分隔符,实际上为(item_separator,dict_separator)的一个元组,默认为(',',':'),表示dictionary内的keys之间用“,”隔开,而key和value之间用“:”隔开。默认为None

encoding

接收string。表示设置的JSON数据的编码形式,处理中文时需要注意此参数的值。默认为UTF-8

sort_keys

接收Built-in。表示是否根据keys的值进行排序。默认为False,为True时数据将根据keys的值进行排序

2. 将数据存储入MySQL数据库 

连接方法        pymysql模块使用connect方法连接数据库,connect方法的语法格式如下。  

python能爬取外网数据嘛 python爬取网页数据违法吗_人工智能_24

connect方法有很多参数可供使用,其常用的参数及其说明如下。

参数

说明

host

接收string。表示数据库地址,本机地址通常为127.0.0.1。默认为None

port

接收string。表示数据库端口,通常为3306。默认为0

user

接收string。数据库用户名,管理员用户为root。默认为None

passwd

接收string。表示数据库密码。默认为None

db

接收string。表示数据库库名。无默认值

charset

接收string。表示插入数据库时的编码。默认为None

connect_timeout

接收int。表示连接超时时间,以秒为单位。默认为10

use_unicode

接收string。表示结果以unicode字符串返回。默认为None

数据库操作函数      

pymysql中可以使用函数返回的连接对象connect进行操作,常用的函数如下。 

函数

说明

commit

提交事务。对支持事务的数据库或表,若提交修改操作后,不使用该方法,则不会写入数据库中

rollback

事务回滚。在没有commit前提下,执行此方法时,回滚当前事务

cursor

创建一个游标对象。所有的sql语句的执行都需要在游标对象下进行

数据库操作函数          

在python操作数据库的过程中,通常主要是使用connect.cursor方法获取游标,或使用cursor.execute方法对数据库进行操作,如创建数据库以及数据表等操作,通常使用更多的为增、删、改、查等基本操作。游标对象也提供了很多种函数,常用函数如下。 

函数

说明

语法格式

close

关闭游标

close()

execute

执行sql语句

execute(sql)

excutemany

执行多条sql语句

excutemany(sql)

fetchone

获取执行结果中的第一条记录

fetchone()

fetchmany

获取执行结果中的n条记录

fetchmany(n)

fetchall

获取执行结果的全部记录

fetchall()

scroll

用于游标滚动

scroll()

以上介绍了爬取静态网页的3个主要步骤:实现HTTP请求、解析网页和数据存储。并对实现各个步骤的相关Python库进行了介绍。