Python爬虫解析网页的4种方式实例及原理解析


Posted in Python onDecember 30, 2019

这篇文章主要介绍了Python爬虫解析网页的4种方式实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情。​

我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中,这个时候它的内容其实是一堆HTML,然后再对这些HTML内容进行解析,按照自己的想法提取出想要的数据,所以今天我们主要来讲四种在Python中解析网页HTML内容的方法,各有千秋,适合在不同的场合下使用。

首先我们随意找到一个网址,这时我脑子里闪过了豆瓣这个网站。嗯,毕竟是用Python构建的网站,那就拿它来做示范吧。

我们找到了豆瓣的Python爬虫小组主页,看起来长成下面这样。

Python爬虫解析网页的4种方式实例及原理解析

让我们用浏览器开发者工具看看HTML代码,定位到想要的内容上,我们想要把讨论组里的帖子标题和链接都给扒出来。

Python爬虫解析网页的4种方式实例及原理解析

通过分析,我们发现实际上我们想要的内容在整个HTML代码的 这个区域里,那我们只需要想办法把这个区域内的内容拿出来就差不多了。

现在开始写代码。

1: 正则表达式大法

正则表达式通常被用来检索、替换那些符合某个模式的文本,所以我们可以利用这个原理来提取我们想要的信息。

参考以下代码。

Python爬虫解析网页的4种方式实例及原理解析

在代码第6行和第7行,需要手动指定一下header的内容,装作自己这个请求是浏览器请求,否则豆瓣会视为我们不是正常请求会返回HTTP 418错误。

在第7行我们直接用requests这个库的get方法进行请求,获取到内容后需要进行一下编码格式转换,同样是因为豆瓣的页面渲染机制的问题,正常情况下,直接获取requests content的内容即可。

Python模拟浏览器发起请求并解析内容代码:

rl = 'https://www.douban.com/group/491607/'headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0"}response = requests.get(url=url,headers=headers).content.decode('utf-8')

正则的好处是编写麻烦,理解不容易,但是匹配效率很高,不过时至今日有太多现成的HTMl内容解析库之后,我个人不太建议再手动用正则来对内容进行匹配了,费时费力。

主要解析代码:

re_div = r'<table\s+class=\"olt\">[\W|\w]+</table>'pattern = re.compile(re_div)content = re.findall(pattern, str(response))re_link = r'<a .*?>(.*?)</a>'mm = re.findall(re_link, str(content), re.S|re.M)urls=re.findall(r"<a.*?href=.*?<\/a>", str(content), re.I|re.S|re.M)

2: requests-html

这个库其实是我个人最喜欢的库,作则是编写requests库的网红程序员 Kenneth Reitz,他在requests的基础上加上了对html内容的解析,就变成了requests-html这个库了。

下面我们来看看范例:

Python爬虫解析网页的4种方式实例及原理解析

我喜欢用requests-html来解析内容的原因是因为作者依据帮我高度封装过了,连请求返回内容的编码格式转换也自动做了,完全可以让我的代码逻辑简单直接,更专注于解析工作本身。

主要解析代码:

links = response.html.find('table.olt', first=True).find('a')

安装途径: pip install requests-html

3: BeautifulSoup

大名鼎鼎的 BeautifulSoup库,出来有些年头了,在Pyhton的HTML解析库里属于重量级的库,其实我评价它的重量是指比较臃肿,大而全。

还是来先看看代码。

Python爬虫解析网页的4种方式实例及原理解析

soup = BeautifulSoup(response, 'html.parser')links = soup.findAll("table", {"class": "olt"})[0].findAll('a')

BeautifulSoup解析内容同样需要将请求和解析分开,从代码清晰程度来讲还将就,不过在做复杂的解析时代码略显繁琐,总体来讲可以用,看个人喜好吧。

安装途径: pip install beautifulsoup4

4: lxml的XPath

lxml这个库同时 支持HTML和XML的解析,支持XPath解析方式,解析效率挺高,不过我们需要熟悉它的一些规则语法才能使用,例如下图这些规则。

Python爬虫解析网页的4种方式实例及原理解析

来看看如何用XPath解析内容。

主要解析代码:

content = doc.xpath("//table[@class='olt']/tr/td/a")

Python爬虫解析网页的4种方式实例及原理解析

如上图,XPath的解析语法稍显复杂,不过熟悉了语法的话也不失为一种优秀的解析手段,因为。

安装途径: pip install lxml

四种方式总结

正则表达式匹配不推荐,因为已经有很多现成的库可以直接用,不需要我们去大量定义正则表达式,还没法复用,在此仅作参考了解。

BeautifulSoup是基于DOM的方式,简单的说就是会在解析时把整个网页内容加载到DOM树里,内存开销和耗时都比较高,处理海量内容时不建议使用。不过BeautifulSoup不需要结构清晰的网页内容,因为它可以直接find到我们想要的标签,如果对于一些HTML结构不清晰的网页,它比较适合。

XPath是基于SAX的机制来解析,不会像BeautifulSoup去加载整个内容到DOM里,而是基于事件驱动的方式来解析内容,更加轻巧。不过XPath要求网页结构需要清晰,而且开发难度比DOM解析的方式高一点,推荐在需要解析效率时使用。

requests-html 是比较新的一个库,高度封装且源码清晰,它直接整合了大量解析时繁琐复杂的操作,同时支持DOM解析和XPath解析两种方式,灵活方便,这是我目前用得较多的一个库。

除了以上介绍到几种网页内容解析方式之外还有很多解析手段,在此不一一进行介绍了。

写一个爬虫,最重要的两点就是如何抓取数据,如何解析数据,我们要活学活用,在不同的时候利用最有效的工具去完成我们的目的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中元类用法实例
Oct 10 Python
Python实现计算两个时间之间相差天数的方法
May 10 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
Python3.遍历某文件夹提取特定文件名的实例
Apr 26 Python
tensorflow: 查看 tensor详细数值方法
Jun 13 Python
Python使用matplotlib实现基础绘图功能示例
Jul 03 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
Django REST Framework 分页(Pagination)详解
Nov 30 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
Python中如何将一个类方法变为多个方法
Dec 30 #Python
pytorch 实现打印模型的参数值
Dec 30 #Python
Python如何基于smtplib发不同格式的邮件
Dec 30 #Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 #Python
Python类反射机制使用实例解析
Dec 30 #Python
Python读取YAML文件过程详解
Dec 30 #Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 #Python
You might like
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
php判断访问IP的方法
2015/06/19 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
2015/05/16 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Python 获取项目根路径的代码
2019/09/27 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
几个数据库方面的面试题
2016/07/01 面试题
高中生物教学反思
2014/02/05 职场文书
学校对教师的评语
2014/04/28 职场文书
硕士生找工作求职信
2014/07/05 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
房产分割协议书范文
2014/11/21 职场文书
离婚协议书范文
2015/01/26 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers