Python网络爬虫实现HTTP请求、解析网页和数据存储(简单静态网页爬取)_python爬虫如何解析网页

| — | — |
| 参数 | 说明 |
| 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浏览器页面,在弹出菜单中单击图所示的“检查”选项打开。

也可以单击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”标签中的“首页”会同步在原网页界面中标识出对应部分的文字“首页”,如图所示。

  1. 源代码面板

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

  1. 网络面板

切换至网络面板(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标签显示资源在整个请求过程中各部分花费的时间,如图所示。

使用正则表达式解析网页

1.  Python正则表达式模块

使用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。表示匹配模式,取值为运算符“
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方法的语法格式如下。

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

参数说明
pattern接收Pattern实例。表示转换后的正则表达式。无默认值
string接收string。表示输入的需要匹配的字符串。无默认值
flag接收string。表示匹配模式,取值为运算符“
findall方法

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

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

参数说明
pattern接收Pattern实例。表示转换后的正则表达式。无默认值
string接收string。表示输入的需要匹配的字符串。无默认值
flag接收string。表示匹配模式,取值为运算符“
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()❤️]选取属于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语言库
html5libBeautifulSoup(markup, “html5lib”)最好的容错性 以浏览器的方式解析文档 生成HTML5格式的文档速度慢 不依赖外部扩展
1. 创建BeautifulSoup对象

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

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

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

参数说明
encoding接收string。表示格式化时使用的编码。默认为None
formatter接收string。表示格式化的模式。默认为minimal,表示按最简化的格式化将字符串处理成有效的HTML∕XML
2. 对象类型

Tag对象类型

Tag对象为HTML文档中的标签,形如“The Dormouse’s story”或“

The Dormouse’s story

”等HTML标签再加上其中包含的内容便是Beautiful Soup中的Tag对象。

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

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

NavigableString对象类型

NavigableString对象为包含在Tag中的文本字符串内容,如“The Dormouse‘s story”中的“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非常方便,其语法格式如下。

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所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值