欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-28 18:22:18
用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情。 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中,这个时候它的内容其实是一堆HTML,然后再对这些HTML内容进行解析,按照自己的想法提取出想要的数据 ......

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

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

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

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

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

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

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

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

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

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

1: 正则表达式

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

参考以下代码。

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

在代码第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这个库了。

下面我们来看看范例:

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解析两种方式,灵活方便,这是我目前用得较多的一个库。

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

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