用Python写爬虫工具在如今是一种司空见惯的事情,每一个人都但愿可以写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情。html
咱们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中,这个时候它的内容实际上是一堆HTML,而后再对这些HTML内容进行解析,按照本身的想法提取出想要的数据,因此今天咱们主要来说四种在Python中解析网页HTML内容的方法,各有千秋,适合在不一样的场合下使用。程序员
首先咱们随意找到一个网址,这时我脑子里闪过了豆瓣这个网站。嗯,毕竟是用Python构建的网站,那就拿它来作示范吧。web
咱们找到了豆瓣的Python爬虫小组主页,看起来长成下面这样。正则表达式
让咱们用浏览器开发者工具看看HTML代码,定位到想要的内容上,咱们想要把讨论组里的帖子标题和连接都给扒出来。浏览器
经过分析,咱们发现实际上咱们想要的内容在整个HTML代码的 这个区域里,那咱们只须要想办法把这个区域内的内容拿出来就差很少了。app
如今开始写代码。工具
1: 正则表达式大法网站
正则表达式一般被用来检索、替换那些符合某个模式的文本,因此咱们能够利用这个原理来提取咱们想要的信息。ui
参考如下代码。编码
在代码第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解析两种方式,灵活方便,这是我目前用得较多的一个库。
除了以上介绍到几种网页内容解析方式以外还有不少解析手段,在此不一一进行介绍了。
写一个爬虫,最重要的两点就是如何抓取数据,如何解析数据,咱们要活学活用,在不一样的时候利用最有效的工具去完成咱们的目的。