虽然说XPath比正则表达式用起来方便,但是没有最方便,只有更方便。我们的BeautifulSoup库就能做到更方便的爬取想要的东西。
使用之前,还是老规矩,先安装BeautifulSoup库,指令如下:
其中文开发文档:
BeautifulSoup库是一个强大的Python语言的XML和HTML解析库。它提供了一些简单的函数来处理导航、搜索、修改分析树等功能。
BeautifulSoup库还能自动将输入的文档转换为Unicode编码,输出文档转换为UTF-8编码。
所以,在使用BeautifulSoup库的过程中,不需要开发中考虑编码的问题,除非你解析的文档,本身就没有指定编码方式,这才需要开发中进行编码处理。
下面,我们来详细介绍BeautifulSoup库的使用规则。
下面,我们来详细介绍BeautifulSoup库的重点知识。
首先,BeautifulSoup库中一个重要的概念就是选择解释器。因为其底层依赖的全是这些解释器,我们有必要认识一下。博主专门列出了一个表格:
从上面表格观察,我们一般爬虫使用lxml HTML解析器即可,不仅速度快,而且兼容性强大,只是需要安装C语言库这一个缺点(不能叫缺点,应该叫麻烦)。
要使用BeautifulSoup库,需要和其他库一样进行导入,但你虽然安装的是beautifulsoup4,但导入的名称并不是beautifulsoup4,而是bs4。用法如下:
运行之后,输出文本如下:
基础的用法很简单,这里不在赘述。从现在开始,我们来详细学习BeautifulSoup库的所有重要知识点,第一个就是节点选择器。
所谓节点选择器,就是直接通过节点的名称选择节点,然后再用string属性就可以得到节点内的文本,这种方式获取最快。
比如,基础用法中,我们使用h1直接获取了h1节点,然后通过h1string即可得到它的文本。但这种用法有一个明显的缺点,就是层次复杂不适合。
所以,我们在使用节点选择器之前,需要将文档缩小。比如一个文档很多很大,但我们获取的内容只在id为blog的p中,那么我们先获取这个p,再在p内部使用节点选择器就非常合适了。
HTML示例代码:
下面的一些示例,我们还是使用这个HTML代码进行节点选择器的讲解。
这里,我们先来教会大家如何获取节点的名称属性以及内容,示例如下:
运行之后,效果如下:
一般来说一个节点的子节点有可能很多,通过上面的方式获取,只能得到第一个。如果要获取一个标签的所有子节点,这里有2种方式。先来看代码:
运行之后,效果如下:
如上面代码所示,我们有2种方式获取所有子节点,一种是通过contents属性,一种是通过children属性,2者遍历的结果都是一样的。
既然能获取直接子节点,那么获取所有子孙节点也是肯定可以的。BeautifulSoup库给我们提供了descendants属性获取子孙节点,示例如下:
运行之后,效果如下:
同样的,在实际的爬虫程序中,我们有时候也需要通过逆向查找父节点,或者查找兄弟节点。
BeautifulSoup库,给我们提供了parent属性获取父节点,同时提供了next_sibling属性获取当前节点的下一个兄弟节点,previous_sibling属性获取上一个兄弟节点。
示例代码如下:
运行之后,效果如下:
对于节点选择器,博主已经介绍了相对于文本内容较少的完全可以这么做。但实际的爬虫爬的网址都是大量的数据,开始使用节点选择器就不合适了。所以,我们要考虑通过方法选择器进行先一步的处理。
find_all()方法主要用于根据节点的名称、属性、文本内容等选择所有符合要求的节点。其完整的定义如下所示:
实战还是测试上面的HTML,我们获取name=a,attr={"class":"aaa"},并且文本等于text="Python板块"板块的节点。
示例代码如下所示:
运行之后,效果如下所示:
find()与find_all()仅差一个all,但结果却有2点不同:
1find()只查找符合条件的第一个节点,而find_all()是查找符合条件的所有节点2find()方法返回的是bs4elementTag对象,而find_all()返回的是bs4elementResultSet对象
下面,我们来查找上面HTML中的a标签,看看返回结果有何不同,示例如下:
运行之后,效果如下:
首先,我们来了解一下CSS选择器的规则:
1classname:选取样式名为classname的节点,也就是class属性值是classname的节点2#idname:选取id属性为idname的节点3nodename:选取节点名为nodename的节点
一般来说,在BeautifulSoup库中,我们使用函数select()进行CSS选择器的 *** 作。示例如下:
这里,我们选择class等于li1的节点。运行之后,效果如下:
因为,我们需要实现嵌套CSS选择器的用法,但上面的HTML不合适。这里,我们略作修改,仅仅更改
网络爬虫,是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。一般人能访问到的网页,爬虫也都能抓取。所谓的爬虫抓取,也是类似于我们浏览网页。但与普通人上网方式不同,爬虫是可以按照一定的规则,自动的采集信息。
举个例子,比如说你从事的是文字编辑工作,需求稿件量大,可是效率很低,最大的一个原因便是很多的时间花费在了采集资料上,假如继续按照之前手动浏览的方式,要么就是你通宵达旦熬夜加班,要么便是让其他人帮你,但显然两者都不方便。这种情况下,网络爬虫就显得很重要。
随着大数据时代的来临,网络爬虫在互联网中的地位将越来越重要。互联网中的数据是海量的,如何自动高效地获取互联网中我们感兴趣的信息并为我们所用是一个重要的问题,而爬虫技术就是为了解决这些问题而生的。
我们感兴趣的信息分为不同的类型:如果只是做搜索引擎,那么感兴趣的信息就是互联网中尽可能多的高质量网页;如果要获取某一垂直领域的数据或者有明确的检索需求,那么感兴趣的信息就是根据我们的检索和需求所定位的这些信息,此时,需要过滤掉一些无用信息。前者我们称为通用网络爬虫,后者我们称为聚焦网络爬虫。
最初有一个想法,就是用程序来写一个类似搜索引擎的爬虫,然后24小时循环抓取互联网上尽可能多的网站数据。
接着用这个数据来配合做seo。目前已经完成了24小时不间断抓取Url部分。主要是用python做的。其他程序也试过。但是效率太低、要么耗内存。还是python最好。
我的问题是:有没有python方面经验丰富的朋友? 能够提供一些方向的? 比如正文提取这一部分,这个有现成的模块吗? 自己写的话,有点难度。我查过资料,python有爬虫类的模块。但是还没接触过。希望能有前辈可以指导一下。真的,在此谢过了。
还有就是,想问下做这个东西你觉得有意义吗?
回复
首先要肯定,你做这个开发是很有意义的。我去年的时候用C#开发过一个蜘蛛抓取系统和正文分析系统,虽然比较粗糙,但是也从过程中感悟到了更深刻SEO优化策略。
例如配额的问题,我在家里自己架服务器然后一个抓一个分析,一切都是以低费用原则展开的,所以带宽自然是不充裕的。这个情况下我就深刻的意识到要抓什么网站,要抓什么类型的页面,时间和线程怎么分配比例,哪些内容是长期不更新的,哪些是具有实时更新意义的等等,通常做SEO的朋友,没办法真的换位去思考这些内容,所以只能等着别分享后再去思考,但是大多数分享也是浅尝则止,具体的细节和原则还是需要自己去摸索和实验的。
另外当我试图去分析HTML的时候,就遇到了前所未有的“无限可能”,因为你的思路几乎是瞬间爆炸了,什么导航条面包屑,页面噪音(代码层面,内容层面),HTML的标准化(涉及到DOM树是否正确的解析),H1优化,寻找最大正文段落等等,太多的细节可以去做分析。
其中我做了一个关于页面噪音的小测试,就是去试图针对一个网站,通过对比HTML获得类目框架。目的就是不想乱七八糟的内容影响我分析正文,所以这里要最基础的去除噪音。这样一来,周边零散的代码就被我视为“低质量的,可忽略的,重要性较低的”的内容。
又例如如何判断页面类型呢?列表页和内容页?不同的页面也会影响二次抓取的频率,因为列表页很显然更具备更新能力,而内容页则相对不更新(主内容框架内不更新,周边框架内容更新,但意义不大)。所以当搜索什么“列车时刻”一类的词,默认列表页会有更大的机会,而当你搜索知识性内容则内容页会有更大的可能性。当然这些都是可以通过系统设置的一个“偏重权重”来实现。
总的来说,当你开发一个搜索引擎的时候,哪怕这个搜索引擎再简单和粗糙,你也会真正的有机会站在搜索引擎的角度去思考SEO,这种思考和感悟是深刻而实际的,远比盲人摸象更有指导意义。
python中,有三个库可以解析html文本,HTMLParser,sgmllib,htmllib。但是更推荐你试试BeautifulSoup。
关于正文的提取,不知道你是要所有正文文本的提取,还是最核心的内容的判断。
如果是提取所有HTML标签内的文本,那么解析器遍历一下,就可以获得一个清单了。
如果你要获得一个“相对最重要正文区域”,那么就需要根据每一个DOM树中的内容量做一个初步的判断,当然如果要更准确无误的判
断正文,还需要其他很多细节的验证 *** 作。
顺着你的话题,我在扩展一下。
我建议大家有时间可以阅读有关“方_法_论”方面的书籍,因为通常,我们在一个行业或一个职位上,所关注和处理的工作,都是一个整
体系统中的一个局部,而是否能尽量多的去理解这个整体系统,对我们的控制能力来说,是至关重要的。所以真正要做好SEO,就不能
仅仅追求SEO的技巧,要更多时间去理解搜索引擎。
淘宝也好,亚马逊(海外)也好,百度也好,都是一个平台,我们无论要做运营,还是SEO,其本质都是充分的获得平台的资源分配。
这个时候谁能站在平台的角度,谁就有更大的竞争力。这就好比产品经理们常常说的,站在用户的角度去开发产品。
你做这个事情,整个过程就是一个极其宝贵的学习过程,这样做的人非常少,你很棒!加油!
深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。优点是能遍历一个Web 站点或深层嵌套的文档集合;缺点是因为Web结构相当深,,有可能造成一旦进去,再也出不来的情况发生。
在宽度优先搜索中,先搜索完一个Web 页面中所有的超级链接,然后再继续搜索下一层, 直到底层为止。例如,一个HTML 文件中有三个超链,选择其中之一并处理相应的HTML文件,然后不再选择第二个HTML文件中的任何超链, 而是返回并选择第二个超链,处理相应的HTML文件,再返回,选择第三个超链并处理相应的HTML文件。一旦一层上的所有超链都己被选择过,就可以开始在刚才处理过的HTML 文件中搜索其余的超链。这就保证了对浅层的首先处理。当遇到一个无穷尽的深层分支时,不会导致陷进>
以上就是关于Python爬虫:想听榜单歌曲只需要14行代码即可搞定全部的内容,包括:Python爬虫:想听榜单歌曲只需要14行代码即可搞定、网络爬虫主要能干啥、编写python爬虫,类搜索引擎的程序是否有意义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)