豆瓣读书文件爬取
可以说是很典型的经常被爬的豆瓣网站了,算的上是为人民服务的典范了。
网页分析
在网站爬取之前,首先要明确,需要爬取的内容是哪些,这个很重要。其次,需要搞清楚爬虫运行的思路,遵循什么样的原则,是单面爬取,还是网站循环爬取,还是内外链跳转爬取。
本次,通过豆瓣读书评分9分以上的榜单来实现爬取。本次,我想要爬取的内容包括书名、评分、评分人数、以及其摘要信息(即作者、出版社、出版年)。
正式创建
通过F12打开开发者工具,打开WebScraper插件工具。单击create new sitemap
栏下的Create sitemap
创建一个新的站点地图。
在Sitemap name
条目后面自定义一个名称,在Start URL
栏后面粘贴豆瓣读书的网页地址。接着,就可以看到下图。
点击图中的Add new selector
按键进入下图界面。
Id
一栏随意填写,Type类型根据前面描述的内容发现这是一个由多种不同Html元素所组成的混合型内容,因此需要选择Element
,随后在Selector
栏点击Select
,点击我们想要爬取的主要区域块内容。全部设置完成后会看到下图所示内容。然后点击Done
,即可完成初步设置,然后点击Save
保存以上设置内容。
此时,回到初始界面,可以看到下图所示内容,若看到的界面不一致,请重新检查以上步骤是否出错。
first view.png目前为止,已经完成了基本的设置,即在这个新建的selector里面已经通过设置element元素,囊括了前面我们提到的信息,接下来就是将这些信息分块存储
点击上图中的content
行的任意区域,在界面中,继续点击Add new selector
,然后重复上述步骤,需要注意的是,Id栏不要重复,Type栏目因为爬取的主要内容以文本为主,所以对应的需要改成Text。分层设置内容,对想要爬取的内容在该content
栏下设置完毕。设置后,如图所示。
打开selector graph可以看到以下图形。
graph.png目前为止,可以回到content
界面(就是只有一行内容的),点击Data preview
,但是会发现一个很奇怪的问题,爬虫仅爬下了当前界面的内容。接下来就要对此问题进行探究了。
网页循环爬取,获取所有的内容。通过分析豆瓣读书的url可以发现第一页的页面URL为https://www.douban.com/doulist/1264675/?start=0&sort=seq&sub_type=
第二页的URL为https://www.douban.com/doulist/1264675/?start=25&sort=seq&sub_type=,
网址参数里只有start=后面的数值变化了,在总结中可以得出该数字是每页的第一本书的序号。所以只需要在sitemap中将Start URL重新设置即可。点击edit metadata
在startURL
中输入https://www.douban.com/doulist/1264675/?start=[0-475:25]&sort=seq&sub_type=,即可。
start=后面的参数表示以25为等差的数列关系。到此,就可以开始爬取数据了。当然,为了防止爬取速度太快,被网站的反爬机制阻挡,可以适当的设置父节点的delay时长。
扩展补充
以上,就简单的介绍了关于如何爬取URL中有参数的网站,但是有些网站采取的是滑动向下
刷新的内容,也有加载更多
的内容。这些我们下节讨论。
在此基础之上,再讲解一下如何不使用网站自带的URL变化去获取网站下一页的内容。
网站的每一页内容都包含着某些信息,当我们想要获取整个网站的信息的时候,首先,需要有能力遍历网站的所有网页,其次才是搜集网页的内容。
按照这种思路,在以上内容的基础上,进行修改。当然,将修改starturl
部分的内容复原到只能单页爬取的状态。
然后在content
父节点的目录下创建一个新的selector
,并将其进行命名,此处的type
类型为link(即网页链接)。此时,我们就创建好了一个新的链接进行跳转。如下图所示。
然后,我们需要对content
这个selector下面的内容进行修改,将其父节点更改到刚刚新建的这个pagenext
这个新建的节点上,这样就会形成一个围绕着网站下一页进行遍历的循环体。所以点击content
的edit条目,在parent selector
部分将父节点由_root更改为* _root、pagenext*两个。具体操作按住ctrl键然后点击项目即可完成。
此时,可以在selector graph
里看到下图内容时,即意味着已经修改完成。
到目前为止,已经完成了爬取豆瓣读书的所有设置,通过这个简单的例子,对该插件理解和运用也有了一个基本的了解。需要讲解的内容和思路也已经讲解完毕,而其他的内容设置则需要读者根据文档手册的内容,结合自己的需求去进行实际操作。
另外,文末附上本次爬虫的爬取数据的部分截图。并共享上自己的sitemap
,读者可以在插件中通过导入该sitemap
直接调用本次案例使用的所有例子,直接进行爬取。
{"_id":"doubanread","startUrl":["https://www.douban.com/doulist/1264675/?start=1&sort=seq&sub_type="],"selectors":[{"id":"content","type":"SelectorElement","selector":"div.bd.doulist-subject","parentSelectors":["_root","pagenext"],"multiple":true,"delay":"1000"},{"id":"title","type":"SelectorText","selector":"div.title a","parentSelectors":["content"],"multiple":false,"regex":"","delay":0},{"id":"rank","type":"SelectorText","selector":"span.rating_nums","parentSelectors":["content"],"multiple":false,"regex":"","delay":0},{"id":"totalnum","type":"SelectorText","selector":"div.rating span:nth-of-type(3)","parentSelectors":["content"],"multiple":false,"regex":"[0-9]+","delay":0},{"id":"abstract","type":"SelectorText","selector":"div.abstract","parentSelectors":["content"],"multiple":false,"regex":"","delay":0},{"id":"pagenext","type":"SelectorLink","selector":"div.paginator > a","parentSelectors":["_root"],"multiple":true,"delay":0}]}
#By PsySunG(此条不用复制)
网友评论