赞
踩
大家好,本文将围绕利用python爬取简单网页数据步骤展开说明,如何利用python爬取网页内容是一个很多人都想弄明白的事情,想搞清楚python爬取网页数据步骤图解需要先了解以下几个事情。
目录
许多Python的原生系统已经开始使用urllib3库,其提供了很多python标准库里所没有的重要特性。
连接特性 | 连接特性 |
线程安全 | 管理连接池 |
客户端SSL∕TLS验证 | 使用分部编码上传文件 |
协助处理重复请求和HTTP重定位 | 支持压缩编码 |
支持HTTP和SOCKS代理 | 测试覆盖率达到100% |
通过request方法即可创建一个请求,该方法返回一个HTTP响应对象python画树状图。Reques语法格式如下。
reques方法常用的参数及其说明如下。
参数 | 说明 |
method | 接收string。表示请求的类型,如“GET”、“HEAD”、“DELETE”等。无默认值 |
url | 接收string。表示字符串形式的网址。无默认值 |
fields | 接收dict。表示请求类型所带的参数。默认为None |
headers | 接收dict。表示请求头所带参数。默认为None |
**urlopen_kw | 接收dict或其他Python中的类型的数据。依据具体需要及请求的类型可添加的参数,通常参数赋值为字典类型或为具体数据。无默认值 |
在request方法中,如果需要传入headers参数,可通过定义一个字典类型实现。定义一个包含User-Agent信息的字典,使用浏览器为火狐和chrome浏览器,操作系统为“Windows NT 6.1; Win64; x64”,向网站“http://www.tipdm.com/tipdm/index.html”发送带headers参数的GET请求,hearders参数为定义的User-Agent字典。
为防止因为网络不稳定、服务器不稳定等问题造成连接不稳定时的丢包,可以在请求中增加timeout参数设置,通常为浮点数。依据不同需求,timeout参数提供多种设置方法,可直接在URL后设置该次请求的全部timeout参数,也可分别设置该次请求的连接与读取timeout参数,在PoolManager实例中设置timeout参数可应用至该实例的全部请求中。
urllib3库可以通过设置retries参数对重试进行控制。默认进行3次请求重试,并进行3次重定向。自定义重试次数通过赋值一个整型给retries参数实现,可通过定义retries实例来定制请求重试次数及重定向次数。若需要同时关闭请求重试及重定向则可以将retries参数赋值为False,仅关闭重定向则将redirect参数赋值为False。与Timeout设置类似,可以在PoolManager实例中设置retries参数控制全部该实例下的请求重试策略。
使用urllib3库实现生成一个完整的请求,该请求应当包含链接、请求头、超时时间和重试次数设置。
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 |
requests库生成请求的代码非常便利,其使用的request方法的语法格式如下。
request方法常用的参数及其说明如下。
参数 | 说明 |
method | 接收string。表示请求的类型,如“GET”、“HEAD”、“DELETE”等。无默认值 |
url | 接收string。表示字符串形式的网址。无默认值 |
**kwargs | 接收dict或其他Python中的类型的数据。依据具体需要及请求的类型可添加的参数,通常参数赋值为字典类型或为具体数据 |
需要注意的是,当requests库猜测错时,需要手动指定encoding编码,避免返回的网页内容解析出现乱码。 手动指定的方法并不灵活,无法自适应对应爬取过程中不同网页的编码,而使用chardet库比较简便灵活,chardet库是一个非常优秀的字符串∕文件编码检测模块。 chardet库使用detect方法检测给定字符串的编码,detect方法常用的参数及其说明如下。
参数 | 说明 |
byte_str | 接收string。表示需要检测编码的字符串。无默认值 |
requests库中对请求头的处理与urllib3库类似,也使用headers参数在GET请求中上传参数,参数形式为字典。使用headers属性即可查看服务器返回的响应头,通常响应头返回的结果会与上传的请求参数对应。
为避免因等待服务器响应造成程序永久失去响应,通常需要给程序设置一个时间作为限制,超过该时间后程序将会自动停止等待。在requests库中通过设置timeout这个参数实现,超过该参数设定的秒数后,程序会停止等待。
使用requests库的request方法向网站“http://www.tipdm.com/tipdm/index.html”发送一个完整的GET请求,该请求包含链接、请求头、响应头、超时时间和状态码,并且编码应正确设置。
chrome浏览器提供了一个非常便利的开发者工具,供广大web开发者使用,该工具提供包括查看网页元素、查看请求资源列表、调试JS等功能。该工具其中一个打开方式可通过右键单击chrome浏览器页面,在弹出菜单中单击图所示的“检查”选项打开。
也可以单击chrome浏览器右上角快捷菜单,如图所示,单击“更多工具”选项中的“开发者工具”选项,或使用快捷键组合Ctrl+Shift+I。
chrome开发者工具目前包括了9个面板,界面如图所示。
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”标签,如图所示。
将鼠标悬停至“li”标签中的“首页”会同步在原网页界面中标识出对应部分的文字“首页”,如图所示。
2. 源代码面板
切换至源代码面板(Sources),单击左侧“tipdm”文件夹中的“index.html”文件,将在中间显示其包含的完整代码,如图所示。
3. 网络面板
切换至网络面板(Network),需先重新加载页面,之后单击“index.html”资源,将在中间显示该资源的头部信息、预览、响应信息、Cookies和花费时间详情,如图所示。
Headers标签展示该资源的HTTP头信息,主要包括Request URL、Request Method、Status Code、Remote Address等基本信息,以及详细的Response Headers、Request Headers,如图所示。
Preview标签根据所选择的资源类型(JSON、图片、文本)显示相应的预览,如图所示。
Response标签显示HTTP的响应信息,如图所示中选中的“index.html”文件为HTML文件,将展示HTML代码。
Cookies标签显示资源HTTP的请求和响应过程中的Cookies信息,如图所示。
Timing标签显示资源在整个请求过程中各部分花费的时间,如图所示。
使用re的步骤为:先将正则表达式的字符串形式编译为Pattern实例;然后使用Pattern实例处理文本并获得匹配结果(一个Match实例);最后使用Match实例获得信息,进行其他的操作。re模块中常用的方法及其说明如下。
方法 | 说明 |
compile | 将正则表达式的字符串转化为Pattern匹配对象 |
match | 将输入的字符串从头开始对输入的正则表达式进行匹配,一直向后直至遇到无法匹配的字符或到达字符串末尾,将立即返回None,否则获取匹配结果 |
search | 将输入的字符串整个扫描,对输入的正则表达式进行匹配,获取匹配结果,否则输出None |
split | 按照能够匹配的字符串作为分隔符,将字符串分割后返回一个列表 |
findall | 搜索整个字符串,返回一个列表包含全部能匹配的子串 |
finditer | 与findall方法作用类似,以迭代器的形式返回结果 |
sub | 使用指定内容替换字符串中匹配的每一个子串内容 |
compile方法 re模块中使用compile方法将正则表达式的字符串转化为Pattern匹配对象,compile方法的语法格式如下。
compile方法常用的参数及其说明如下。
参数 | 说明 |
string | 接收string。表示需要转换的正则表达式的字符串。无默认值 |
flag | 接收string。表示匹配模式,取值为运算符“|”时表示同时生效,如re.I|re.M。默认为None |
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 | 详细模式,该模式下正则表达式可为多行,忽略空白字符并可加入注释 |
earch方法将输入的字符串整个扫描,对输入的正则表达式进行匹配,若无可匹配字符,将立即返回None ,否则获取匹配结果,search方法的语法格式如下。
search方法常用的参数及其说明如下。
参数 | 说明 |
pattern | 接收Pattern实例。表示转换后的正则表达式。无默认值 |
string | 接收string。表示输入的需要匹配的字符串。无默认值 |
flag | 接收string。表示匹配模式,取值为运算符“|”时表示同时生效,如re.I|re.M。默认为None |
findall方法搜索整个string,返回一个列表包含全部能匹配的子串,其语法格式如下。
findall方法常用的参数及其说明如下。
参数 | 说明 |
pattern | 接收Pattern实例。表示转换后的正则表达式。无默认值 |
string | 接收string。表示输入的需要匹配的字符串。无默认值 |
flag | 接收string。表示匹配模式,取值为运算符“|”时表示同时生效,如re.I|re.M。默认为None |
分别使用re库中search方法和findall方法查找使用requests库获取的网页内容中的title内容。 使用正则表达式无法很好的定位特定节点并获取其中的链接和文本内容,而使用Xpath和Beautiful Soup能较为便利的实现这个功能。
Xpath使用类似正则的表达式来匹配HTML文件中的内容,常用匹配表达式如下。
表达式 | 说明 |
nodename | 选取nodename节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
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的节点 |
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节点 |
使用text方法可以提取某个单独子节点下的文本,若想提取出定位到的子节点及其子孙节点下的全部文本,则需要使用string方法实现。 使用HTML类将其初始化通过requests库获取的网页,之后使用谓语定位id值以me开头的ul节点,并使用text方法获取其所有子孙节点a内的文本内容,使用@选取href属性从而实现提取所有子孙节点a内的链接,最后使用string方法直接获取ul节点及其子孙节点中的所有文本内容。
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格式的文档 | 速度慢 不依赖外部扩展 |
要使用Beautiful Soup库解析网页首先需要创建BeautifulSoup对象,将字符串或HTML文件传入Beautiful Soup库的构造方法可以创建一个BeautifulSoup对象,使用格式如下。
生成的BeautifulSoup对象可通过prettify方法进行格式化输出,其语法格式如下。
prettify方法常用的参数及其说明如下。
参数 | 说明 |
encoding | 接收string。表示格式化时使用的编码。默认为None |
formatter | 接收string。表示格式化的模式。默认为minimal,表示按最简化的格式化将字符串处理成有效的HTML∕XML |
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方法。
Beautiful Soup定义了很多搜索方法,其中常用的有find方法和find_all方法,两者的参数一致,区别为find_all方法的返回结果是值包含一个元素的列表,而find直接返回的是结果。find_all方法用于搜索文档树中的Tag非常方便,其语法格式如下。
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的属性来搜索 |
find_all方法可通过多种参数遍历搜索文档树中符合条件的所有子节点。
将数据存储为JSON文件的过程为一个编码过程,编码过程常用dump函数和dumps函数。两者的区别在于,dump函数将Python对象转换为JSON对象,并通过fp文件流将JSON对象写入文件内,而dumps函数则生成一个字符串。dump函数和dumps函数的语法格式如下。
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的值进行排序 |
连接方法 pymysql模块使用connect方法连接数据库,connect方法的语法格式如下。
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库进行了介绍。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。