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多线程http下载实现示例
Dec 30 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
关于Python数据结构中字典的心得
Dec 04 Python
JavaScript实现一维数组转化为二维数组
Apr 17 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
Python socket模块方法实现详解
Nov 05 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
python super函数使用方法详解
Feb 14 Python
七个Python必备的GUI库
Apr 27 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
Pandas数据类型之category的用法
Jun 28 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
php实现ip白名单黑名单功能
2015/03/12 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
yii2安装详细流程
2018/05/23 PHP
js常见表单应用技巧
2008/01/09 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
JS画线(实例代码)
2013/11/20 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
python获取外网ip地址的方法总结
2015/07/02 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
python进行TCP端口扫描的实现
2018/12/21 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
迷你西餐厅创业计划书范文
2013/12/31 职场文书
高中体育教学反思
2014/01/24 职场文书
党支部综合考察材料
2014/05/19 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
挂靠协议书
2015/01/27 职场文书
超市收银员岗位职责
2015/04/07 职场文书
入伍通知书
2015/04/23 职场文书
2015大学党建带团建工作总结
2015/07/23 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android