当前位置: 移动技术网 > IT编程>脚本编程>Python > Python爬虫解析网页的4种方式 值得收藏

Python爬虫解析网页的4种方式 值得收藏

2020年04月28日  | 移动技术网IT编程  | 我要评论

冰寒祛痘教程,贾政奋斗史,仙人掌妖怪

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

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

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

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

ps:如果你处于想学python或者正在学习python,python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!

python爬虫解析网页的4种方式 值得收藏
python爬虫解析网页的4种方式 值得收藏

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

通过分析,我们发现实际上我们想要的内容在整个html代码的 <table class="olt">这个区域里,那我们只需要想办法把这个区域内的内容拿出来就差不多了,现在开始写代码。

1: 正则表达式

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

参考以下代码。

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

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

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

url = '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这个库了。

下面我们来看看范例:

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

主要解析代码:

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

 

安装途径:

pip install requests-html

 

3: beautifulsoup

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

还是来先看看代码。

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解析方式,解析效率挺高,不过我们需要熟悉它的一些规则语法才能使用,例如下图这些规则。

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

主要解析代码:

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

 

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

安装途径:

pip install lxml

 

四种方式总结

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

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

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

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

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

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网