Python新⼿写出漂亮的爬⾍代码1——从html获取信息
Python新⼿写出漂亮的爬⾍代码1
初到⼤数据学习圈⼦的同学可能对爬⾍都有所⽿闻,会觉得是⼀个⾼⼤上的东西,仿佛九阳神功和乾坤⼤挪移⼀样,和别⼈说“⽼⼦会爬⾍”,就感觉特别有逼格,但是⼜不知从何⼊⼿,这⾥,博主给⼤家纠正⼀个误区:爬⾍并不神秘,也不⾼级,是⼀个⾮常好上⼿和掌握的东西(当然,⾥⾯也有很多坑,也有很多细节,展开说的话其实也蛮复杂的,不过它的模式和套路就摆在那⾥,看了⼩编的博客,保证你能爬下你想要的内容)。
⼀般情况下,爬⾍分为两种,⼀种是静态爬⾍,⼀种是动态爬⾍,所谓静态爬⾍,就是⼤部分信息(⾄少你所需要的那些信息)是写在html 代码中的,⽽动态爬⾍⼀般都是写在⼀个json⽂档中,这么说可能不太标准,不过初学者这样理解即可,这篇博客将会带⼤家领略静态爬⾍,下⼀篇将会讲解动态爬⾍。
补充⼀句,博主曾是忠实的Python2⽤户,不过现在也改到Python3了,曾经新的库会在Python2中⾸先兼容,然后要过好久才在
Python3中集成,现在完全不⽤担⼼,Python2有了,Python3不⽇就会集成,Python3也会在编码⽅⾯提供更多遍历,推荐新⼿直接从Python3⼊⼿,当然,⼆者没有什么太⼤区别,遇到问题问问度娘就可以了了,废话不多说,我们开始爬⾍的第⼀课!
本篇博⽂将从以下⼏个⽅⾯进⾏讲解
- 啥是Html代码?
- 怎么从Html代码中定位到我要的东西?
- BeautifulSoup神器
- 案例:爱卡汽车
啥是Html代码
所谓的html代码,浏览博客的你右⼿⼀定在⿏标上,好的,跟着我左⼿右⼿⼀个慢动作,点击右键,到“查看⽹页源代码”,不同浏览器可能这个描述不太⼀样,博主是Chrome,不过都差不太多,是不是有看到类似下⾯这个图的⼀堆不知道是什么⿁的代码?
其实,你可以按键盘上的F12或者右键选择“检查元素”(不同浏览器不同),这时,浏览器的右侧(如果你是360浏览器,可能是在下⽅)弹出⼀个东东,类似下⾯红⾊框中的区域
这个东西就是刚才我们看的那个不知道是什么⿁的东西的树状结构,看上去会整齐⼀些。这就是html代码,html代码其实就是⽤许多个"<Y yy='aaa'>xxxx</Y>"是的结构将想要输出在页⾯上的内容包含起来的⼀种语⾔。下⼀个⼩节将详细介绍这个结构,总⽽⾔之,我们⾁眼所看到的东西⼤部分都来⾃于html代码,html代码的作⽤简单来说就是程序员⽤⼀堆html代码,将需要展⽰的信息放在指定的位置上的⼀种东西,有了html代码,才有了你眼前页⾯上的很多元素;当然,还有其他⽅式来将元素展⽰在页⾯上,如css、js等渲染⽅式,这些我们下⼀篇会介绍。
知道我们所需要的信息位于html中,那么只需要到我们需要的具体内容在哪⾥,然后下载下来,就⼤功告成了,逻辑就是这么个逻辑,所以静态爬⾍的关键问题是要准确的解析html代码,⼀般使⽤Bea
utifulSoup这个库或者正则表达式。
怎么从Html代码中定位到我要的东西
标签
上⼀节中提到,html代码中都是"<Y yy='aaa'>xxxx</Y>"结构,⼀对”<>”我们称之为标签,这对标签中通常会有⼀些内容,可能是⼀个数字,⼀段字符串,⼀个⽹页链接,或者⼀个图⽚链接等等,总之,就是我们在⽹页上看到的内容。”Y”称之为标签名,”yy”为其属性名,”aaa”是其属性值,”xxxx”是这个标签的内容,也就是对应于页⾯上的信息。⼀般情况下我们要获取的就是”xxxx”,有时我们可能也需要获取标签的属性值”aaa”。标签可能是唯⼀的,也可能是有重复的,回看刚才那张树状的标签结构,有⼀种分明的层次感,同⼀层的标签我们称他们互为兄弟标签,⽽⼀个标签和包含他的标签互为⽗⼦标签,如果a包含b,b包含c,d,则c是a的后代标签,是b的⼦标签,是d的兄弟标签,这个名字⽆所谓的,了解⼀下就好,⼀般标签名可能会重复,但标签属性名(yy)和属性值“aaa”很少重复,不过兄弟标签之间可能会出现标签名、属性名、属性值完全相同的情况,后⾯会介绍(就是find⽅法和findAll⽅法的区别)。
好,上实例,打开⼀个⽹址把:,是爱卡汽车中⽐亚迪F3的⼝碑页⾯,⿏标右键选择“检查元素”或者之间按键盘上的F12,选择那个⿏标的按钮(红⾊框1),然后将⿏标放到评论框附近(红⾊框2),
如下图所⽰,看到检查元素界⾯中有⼀段代码背景⾊变成了深⾊(如红⾊框3)
每个页⾯有10条⼝碑,可见这10条⼝碑均存储在属性名为’class’,属性值为’review_comments_dl’的’div’标签中,当然,这个标签不是⼀个“叶节点”,也就是说这个标签内部还有其他标签,我们进⼀步看看。看下⾯的图⽚。
我们可以看到红框3中有很多相同的标签<dl>...</dl>,他们都是属性名为’class’,属性值为’review_comments_dl’的’div’标签的⼦标签,他们之间互为兄弟标签,我们把⿏标放在红框3的位置并选中,这时左侧⽹页的第⼀条⼝碑的位置就会变成深⾊背景,也就是说,红框3这个标签实际上对应着红框2这个区域中的内容,那么我们把红框3再具体的看⼀看。如下图所⽰。
可以看到,第⼀条⼝碑(红框中的内容)在第⼀个’dl’标签中(红⾊下划线2),同理可以看到第⼆条⼝碑在第⼆个’dl’标签中。再来看看这个’dl’标签,他有两个⼦标签,’dt’和’dd’⼦标签,⼝碑数据位于dd⼦标签下;好的,再来看’dd’标签,将’dd’标签展开,如下图所⽰。
红框3是该车的第⼀页的第⼀条⼝碑,位于dd标签中,及图中蓝⾊下划线<dd>...</dd> 中的内容,图中从开头的dd指向红框3,标注了“同级”,意思是红框3的内容是dd标签的内容,⽽dd标签下还有⼦标签,⽐如属性为class,属性值为useful的div标签,⾥⾯的内容1034是有多少⼈觉得这个⼝碑有⽤;还有⼀个⼦标签p,p标签的内容是⼝碑的作者;p中有⼀个⼦标签a,a标签的内容是评论来源,如图中的“⽐亚迪F3论坛”。
好了,现在想必读者已经对通过标签定位信息有所了解了,我们再来练习⼀下,我们将⼝碑页切换到第2页,可以看到地址变成了,多了⼀个’0_2’。将’0_2’改成’0_1’就跳回了第⼀页(实际上第⼀页的真
实url是),⽽改成’0_3’就到了第三页。那么我们应该怎么获取该车型的⼝碑⼀共有⼏页呢?看下⾯的图。
依然是在开发者⼯具视⾓(及按F12弹出的窗⼝这个视⾓),将⿏标放在尾页(这⾥是122)或者‘下⼀页’上,右侧的框中会出现如图所⽰的画⾯,可以看到尾页122所在的位于属性为class,属性值为’page
ubuntu怎么安装pythonrs’的div标签的倒数第⼆个⼦标签中,如红框1所⽰;⽽’下⼀页’则位于属性为class,属性值为’pagers’的div标签的最后⼀个⼦标签中,如红框2所⽰。在仔细贯彻⼀下会发现属性为class,属性值为’pagers’的div标签与我们之前寻⼝碑的标签dl是兄弟标签,位于全部的dl标签的再后⾯⼀个,也就是说,该标签的⽗标签与dl标签相同,即属性名为’class’,属性值为’review_comments_dl’的’div’标签。
为什么要确定尾页呢?因为构造代码时,我们要知道代码的起⽌位置,使⽤for循环良好的控制代码的开始与完结。
这个爬⾍的逻辑是这样的:到⽬标的车型,即其url,实际上,不同车型的url只有id不同,⽐如⽐亚迪F3的url是,其车⼦id是257,当id 更改为258时,车型就变成了⽐亚迪F0;然后查看html代码,明确要爬取的内容的所在位置,明确换页规律,明确爬⾍的起⽌位置(获取尾页信息的html位置),然后构造代码。
BeautifulSoup神器
Python⼀个第三⽅库bs4中有⼀个BeautifulSoup库,是⽤于解析html代码的,换句话说就是可以帮助你更⽅便的通过标签定位你需要的信息。这⾥只介绍两个⽐较关键的⽅法:
1、find⽅法和findAll⽅法:
⾸先,BeautifulSoup会先将整个html或者你所指定的html代码编程⼀个BeautifulSoup对象的实例(不懂对象和实例不要紧,你只要把它当作是⼀套你使⽤F12看到的树形html代码代码就好),这个实例可以使⽤很多⽅法,最常⽤的就是find和findAll,⼆者的功能是相同的,通过find( )的参数,即find( )括号中指定的标签名,属性名,属性值去搜索对应的标签,并获取它,不过find只获取搜索到的第⼀个标签,⽽findAll将会获取搜索到的所有符合条件的标签,放⼊⼀个迭代器(实际上是将所有符合条件的标签放⼊⼀个list),findAll常⽤于兄弟标签的定位,如刚才定位⼝碑信息,⼝碑都在dl标签下,⽽同⼀页的10条⼝碑对应于10个dl标签,这时候⽤find⽅法只能获取第⼀个,⽽findAll会获取全部的10个标签,存⼊⼀个列表,想要获取每个标签的内容,只需对这个列表使⽤⼀个for循环遍历⼀遍即可。
2、get_text()⽅法:
使⽤find获取的内容不仅仅是我们需要的内容,⽽且包括标签名、属性名、属性值等,⽐如使⽤find⽅法获取"<Y yy='aaa'>xxxx</Y>" 的内容xxxx,使⽤find后,我们会得到整个"<Y yy='aaa'>xxxx</Y>",⼗分冗长,实际我们想要的仅仅是这个标签的内容xxxx,因此,对使⽤find⽅法后的对象再使⽤get_text( )⽅法,就可以得到标签的内容了,对应到这⾥,我们通过get_text( )⽅法就可以得到xxxx了。
好了,铺垫做的差不多了,上代码咯~~~
案例:爱卡汽车
使⽤Python3,需要提前安s4库,博主的环境是win7+Python3+Pycharm(有时候也⽤Ubuntu16.04+Python3+Pycharm),很多时候都有⼈问博主,什么ide好⽤呢?jupyter notebook?spyder?Pycharm?这⾥只能和⼤家说各个ide各有千秋,做⼯程(如爬⾍)使⽤pycharm肯定是⾸选,如果只是平时的练习,写个⼩程序,使⽤jupyter notebook和spyder就不错,总之,如果涉及到频繁打印输出结果的东西,最好还是⽤pycharm,不要⽤jupyter notebook,不然会很卡。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论