Python爬虫解析网页的4种方式 值得收藏
用python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情。
我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中,这个时候它的内容其实是一堆html,然后再对这些html内容进行解析,按照自己的想法提取出想要的数据,所以今天我们主要来讲四种在python中解析网页html内容的方法,各有千秋,适合在不同的场合下使用。
首先我们随意找到一个网址,这时我脑子里闪过了豆瓣这个网站。嗯,毕竟是用python构建的网站,那就拿它来做示范吧。
我们找到了豆瓣的python爬虫小组主页,看起来长成下面这样。
ps:如果你处于想学python或者正在学习python,python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!
让我们用浏览器开发者工具看看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解析两种方式,灵活方便,这是我目前用得较多的一个库。
除了以上介绍到几种网页内容解析方式之外还有很多解析手段,在此不一一进行介绍了。
爬虫的基本技能,最重要的两点就是如何抓取数据,如何解析数据,我们要活学活用,在不同的时候利用最有效的工具去完成我们的目的。
下一篇: java bst的中序遍历
推荐阅读
-
python网络爬虫之解析网页的XPath(爬取Path职位信息)[三]
-
Python爬虫解析与爬虫实现的方式,实战归纳,大乱斗!
-
05 Python网络爬虫的数据解析方式
-
Python爬虫解析网页的4种方式 值得收藏
-
python爬虫:使用xpath和find两种方式分别实现使用requests_html库爬取网页中的内容
-
python网络爬虫之解析网页的XPath(爬取Path职位信息)[三]
-
4种Python爬虫的网页解析方式,总有一款你喜欢的,值得收藏
-
Python爬虫解析与爬虫实现的方式,实战归纳,大乱斗!
-
Python爬虫解析网页的4种方式 值得收藏
-
05 Python网络爬虫的数据解析方式