网络爬虫之BeautifulSoup(三)
在之前的文章体系中介绍了lxml在网络爬虫的应用,它的速度并不是那么的快,主要是使用xpath的方式
获取到想要的信息,然后进行解析和处理。今天主要介绍beautifulsoup在网络爬虫的应用,比起lxml的应用,
它的应用更加速度,获取想要的数据更加高效。要使用它的时候,首先需要安装它,安装的命令为:
pip3 install BeautifulSoup4
pip3 install html5lib
同时建议安装对应的解释器,在bs4的应用中,常用的解释器是lxml和html5lib,它的详细的文档地址为:
官方手册,想深入学习的同学可以点击官方的文档去学习下里面涉及到的很多的细节。它的涉及到的知识点
主要总结如下:
find:寻找,并且是返回第一个匹配到的信息
find_all:依据匹配的信息返回到的是一个列表
string:获取某个标签下非标签字符串的内容
strings:获取某个标签下所有非标签的内容
stripped_strings:获取某个标签下的非标签的所有内容,会去掉空格,是生成器,需要单独的列表循环处理
get_text:获取某一个标签下的非标签内容,不是以列表的形式返回
下面还是依据实际的案例来说明这不部分的实际应用,技术性的东西毕竟看重的是技术实战,而理论只是
辅助性的功能之一。 结合requests来看它的应用,以百度首页为案例,获取百度首页上所有的超链接,案例代码
如下:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def getLinks(): '''获取百度首页所有的超链接''' r=requests.get('https://www.baidu.com') html=r.content.decode('utf-8') soup=BeautifulSoup(html,'html5lib') links=soup.find_all('a') for link in links: print(link) if __name__ == '__main__': getLinks()
这里调用的方法是find_all(),获取所有的信息并且是在一个列表里面,然后对列表里面的内容进行循环,见执行
代码后输出的信息:
C:\Python37\python3.exe D:/git/GITHUB/WebCrawler/bs4Test/node.py <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a> <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a> <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a> <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a> <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a> <a class="lb" href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" name="tj_login">登录</a> <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品</a> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> <a href="http://www.baidu.com/duty/">使用百度前必读</a> <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a> Process finished with exit code 0
那么就把需求修改下,获取到百度首页第一个超链接,使用的方法是find(),那么获取到的就应该是新闻,见修改后的
代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def getLinks(): '''获取百度首页所有的超链接''' r=requests.get('https://www.baidu.com') html=r.content.decode('utf-8') soup=BeautifulSoup(html,'html5lib') link=soup.find('a') print(link) if __name__ == '__main__': getLinks()
执行后见输出的结果信息:
C:\Python37\python3.exe D:/git/GITHUB/WebCrawler/bs4Test/node.py <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>
依据如上的案例,想必很多人已经清楚find()方法和find_all()方法的区别和应用了。当然还有一种应用场景就是获取的
超链接信息,也可以指定最多获取到多少个,如修改后的代码见如下:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def getLinks(): '''获取百度首页所有的超链接''' r=requests.get('https://www.baidu.com') html=r.content.decode('utf-8') soup=BeautifulSoup(html,'html5lib') links=soup.find_all('a',limit=5) for link in links: print(link) if __name__ == '__main__': getLinks()
见执行代码后输出的结果信息:
C:\Python37\python3.exe D:/git/GITHUB/WebCrawler/bs4Test/node.py <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a> <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a> <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a> <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a> <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a>
下来就以拉勾网的招聘详细信息为案例,来说明bs4的案例应用,如获取招聘的详细信息,它的xpath是//dd[@class="job_bt"],
那么使用bs4,见获取招聘的详细的信息,实现的案例代码如下:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def laGou(): headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'} r=requests.get( url='https://www.lagou.com/jobs/4603324.html?show=491d7e217dfc41cda3b84d2506e3d22e', headers=headers) return r.text def getLaGou(): '''获取招聘的详细信息''' soup=BeautifulSoup(laGou(),'html5lib') job=soup.find_all('div',class_="job-detail") print(job) if __name__ == '__main__': getLaGou()
见执行代码后,输出的结果信息:
C:\Python37\python3.exe D:/git/GITHUB/WebCrawler/bs4Test/node.py [<div class="job-detail"> 职位职责: <br/>1、负责公司大型移动端项目的质量保障工作,对项目中的质量问题进行监控、追查及定位,对产品与项目提出优化意见,提高项目的整体效率 <br/>2、制定并推行相应的测试规范与流程,制定合理的测试策略与测试架构,保证测试工作高效、有序地进行 <br/>3、维持团队的内部合作与外部协调,为测试工作的顺利推进创造良好的环境 <br/>4、建立行之有效的沟通机制和组织方式,定义团队氛围,形成人员培养机制 <br/> <br/>职位要求: <br/>1、计算机或相关专业本科以上学历,3年及以上移动产品测试经验,有团队负责人经验 <br/>2、熟悉测试流程与规范,有良好的测试思维,熟练掌握主流 iOS/Android 自动化、性能工具,有相关工具的二次开发经验 <br/>3、具备优秀的学习能力、分析能力、技术钻研能力,有制定合理的测试策略与测试架构的能力,能够完成问题定位与任务推动 <br/>4、具备良好的沟通、协调能力,具备一定的谈判能力与冲突管理能力,能够承担一定的压力 </div>]
对于这样的信息而言,我们更多的是想得到招聘信息的文本信息,那么修改使用到的就是stripped_strings的方法,见
修改后的案例代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def laGou(): headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'} r=requests.get( url='https://www.lagou.com/jobs/4603324.html?show=491d7e217dfc41cda3b84d2506e3d22e', headers=headers) return r.text def getLaGou(): '''获取招聘的详细信息''' soup=BeautifulSoup(laGou(),'html5lib') details=soup.find_all('div',class_="job-detail")[0] for detail in details.stripped_strings: print(detail) if __name__ == '__main__': getLaGou()
见执行后输出的结果信息,
C:\Python37\python3.exe D:/git/GITHUB/WebCrawler/bs4Test/node.py 职位职责: 1、负责公司大型移动端项目的质量保障工作,对项目中的质量问题进行监控、追查及定位,对产品与项目提出优化意见,提高项目的整体效率 2、制定并推行相应的测试规范与流程,制定合理的测试策略与测试架构,保证测试工作高效、有序地进行 3、维持团队的内部合作与外部协调,为测试工作的顺利推进创造良好的环境 4、建立行之有效的沟通机制和组织方式,定义团队氛围,形成人员培养机制 职位要求: 1、计算机或相关专业本科以上学历,3年及以上移动产品测试经验,有团队负责人经验 2、熟悉测试流程与规范,有良好的测试思维,熟练掌握主流 iOS/Android 自动化、性能工具,有相关工具的二次开发经验 3、具备优秀的学习能力、分析能力、技术钻研能力,有制定合理的测试策略与测试架构的能力,能够完成问题定位与任务推动 4、具备良好的沟通、协调能力,具备一定的谈判能力与冲突管理能力,能够承担一定的压力
当然也是可以使用string()的方法,见修改后的案例代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def laGou(): headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'} r=requests.get( url='https://www.lagou.com/jobs/4603324.html?show=491d7e217dfc41cda3b84d2506e3d22e', headers=headers) return r.text def getLaGou(): '''获取招聘的详细信息''' soup=BeautifulSoup(laGou(),'html5lib') details=soup.find_all('div',class_="job-detail")[0] for detail in details: print(detail.string) if __name__ == '__main__': getLaGou()
下面继续来看bs4里面使用css的方式来进行定位和获取相关的信息,如获取百度首页的超链接,看使用css获取的源代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def getLinks(): r=requests.get('https://www.baidu.com/') html=r.content.decode('utf-8') soup=BeautifulSoup(html,'html5lib') links=soup.select('a') for link in links: print(link) if __name__ == '__main__': getLinks()
见执行代码后输出的信息:
C:\Python37\python3.exe D:/git/GITHUB/WebCrawler/bs4Test/node.py <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a> <a class="mnav" href="https://www.hao123.com" name="tj_trhao123">hao123</a> <a class="mnav" href="http://map.baidu.com" name="tj_trmap">地图</a> <a class="mnav" href="http://v.baidu.com" name="tj_trvideo">视频</a> <a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">贴吧</a> <a class="lb" href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1" name="tj_login">登录</a> <a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">更多产品</a> <a href="http://home.baidu.com">关于百度</a> <a href="http://ir.baidu.com">About Baidu</a> <a href="http://www.baidu.com/duty/">使用百度前必读</a> <a class="cp-feedback" href="http://jianyi.baidu.com/">意见反馈</a>
下面使用css的方式获取拉钩网详细的招聘信息,见修改后的代码:
#!/usr/bin/env python # -*-coding:utf-8 -*- import requests from bs4 import BeautifulSoup from bs4.element import Tag def laGou(): headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'} r=requests.get( url='https://www.lagou.com/jobs/4603324.html?show=491d7e217dfc41cda3b84d2506e3d22e', headers=headers) return r.text def getLaGou(): '''获取招聘的详细信息''' soup=BeautifulSoup(laGou(),'html5lib') details=soup.select('div.job-detail')[0] for detail in details.stripped_strings: print(detail) if __name__ == '__main__': getLaGou()
执行后输出的信息就是招聘的信息,这里就不单独再输出这些信息了。后面持续的更新介绍bs4在网络爬虫方面的案例实战。