【教程】终于对吾爱下手了,吾爱简单数据爬虫第一课
本帖最后由 天域至尊 于 2019-2-21 11:13 编辑这是第一课
人呐,就不能闲。闲了就难受,刚过情人节就闲的难受,本着好网站,万人爬的基础思想,我打起了爬吾爱站的想法,不知管理看了这篇文章是什么想法?
额,在此声明啊,我是爬爬玩,不是盗取数据。
我想起来了linux社区当年的故事,人家好心给他们提供服务免费搭建linux社区,他们日人家服务器,绿林好汉,惹不起惹不起。吾爱站里估计也都是绿林好汉吧。
其实本次想讲的是通用爬虫,前几次讲的都没有涉及到通用爬虫,通用爬虫对论坛类的网站数据爬取具有奇效,就比如曾经发现过一个成人视频论坛,严重违反我国法律法规,太过分了,为了让网站站长迷途知返,主动改邪归正,我就写了个爬虫去给他服务器增加压力,也顺便固定了他们的犯罪证据,防止以后我找不到种子,呀呸,防止他们案发销毁证据。
我记得爬虫运行的第一晚就获取了7G的种子,我的天,开玩笑呢,再有十个肾也看不完啊,呀呸!怎么着不得判他们好几年啊!但是这个网站还没死,我用它来讲解的话容易导致不怀好意的小朋友去不干好事,等它死了,我就按照那个网站的爬虫再来讲解下通用爬虫,以及获取简介、下载种子、下载介绍图片、按主演和视频类型分类等等技术。
所以这次就用吾爱站来讲通用爬虫吧,其实也超级无聊的,吾爱站的数据有啥好爬的,爬了有啥好处?我至今也没想出来,唯一能够证明的就是我能爬吾爱站的公开数据吧,另外一个就是吾爱站很多数据需要登录才能看到,据说有人训练神经网络能够搞定验证,我还没学到神经网络搞定验证那里,等以后出师了,再搞个神经网络自动验证什么的,如果带上自动登录应该就违反了吾爱的规定吧,这次仅仅是爬取不用登录的数据,而且不爬主要内容,仅仅证明下爱过,管理顺便出来说明下呗。
现在是第一课,主要是思路,不涉及程序,因为篇幅的原因,第二篇将着重讲scrapy框架的搭建和程序的编写,这篇还是以分析和思路为主。
首先第一步,思考你要拿什么数据,随便打开一个帖子,想了半天,总结出以下几点
1. 获取标题
2. 获取类别
3. 获取发布时间
4. 获取查看数与回复数
5. 获取作者名
6. 获取网址
7. 获取作者发布内容长度
肯定有人问了,作者发布内容长度是什么?就是人家作者发帖子的内容的总字节数。获取这玩意干吗?我先获取他内容,再计算总长度,只存储长度,为什么我不存储人家的详细内容呢,存储这个有点盗取数据的意思,我们仅仅是技术层面的教程,不能盗取人家的数据,所以获取个总长度证明下爱过。
以https://www.52pojie.cn/thread-864112-1-1.html为例(随机选择的)
哦哦,还有发布时间
这样一来,几大要素的位置都有了,接下来到源代码里去看
第一个和第二个,类别和标题
我们直接在源代码里ctrl+f搜索,搜索内容先是类别吧,输入编程语言区
我们搜到了3个,其中这个最给力,标题和类别都有了,加上上下文贴到记事本里看下
嗯,真漂亮,为了验证这个规律是不是有通用性,我打开了其他几个区的网页看了下,都一样的具有通用性,也就是说编程语言区是这样,原创发布区也是这样,我就不一一陈述了。
随后开始分析
很容易的发现,div下的class z很明显,但是我们要验证下是不是具有唯一性,意思就是class为z的div标签是不是只会在网页中出现在这里,这个很重要,他能帮我们定位。
确认唯一性的方法很简单,源代码里搜索<divclass="z">就好了,如果仅有一个匹配项,那就说明有唯一性,直接用就行,如果不是,还要继续想办法。
有两个匹配项,还好不是很多,我们把干扰项也复制出来,看看是什么样子的。
这个时候肯定很多大神开始思考xpath表达式怎么构建,其实不用那么麻烦,干扰项有特点
直接把含有违规会员处罚记录字段的项删除不就行了,上面的更简单,截取a标签,最后两个a标签就是。
哇,我这样玩是不是不大正规啊,管他呢,简单粗暴最有效!
所以xpath表达式长这样://div[@class=”z”]/a
额,还行吧。
接下来获取发布时间
网页上这样写的:发表于2019-2-12 11:44
这一步其实很紧张,很有可能不在源代码里,不在源代码里就得用fiddler抓包分析了,你要问我怎么有这种直觉的话,你多写点爬虫也有这种直觉。
先上老规矩,搜索2019-2-12 11:44
我勒个去,竟然在源代码,但是下面的评论数和查看数估计够玄。
为什么呢 ,因为一般评论数、查看数、回复数、时间什么的,都是JS脚本单独向服务器请求的,一般但不是一定。
有两个匹配项,都贴出来看看
第二个是记录上传时间的,算了,还是用第一个。
em id="authorposton23922690"
这个authorposton23922690是什么鬼?在另外一个帖子里搜一搜看看有没有
没有,有种它自己独特编码的感觉哈,那我们回来专门搜索“23922690”试试,看看有没有什么发现。
我们可以看到这个数字多次出现,而且我们注意到下方评论的编码也很有趣
是的,这个编码加上另外一个编码,在此我怀疑“23922690”这个是帖子的编码,但是我们要拿到这个编码,不拿能不能做,也能,但是找点乐趣总是好的。
怎么拿呢?找一个辨识度高的,不容易有干扰的地方。
看,这个好,页面里只出现了一次,那么具不具有通用性呢,随机选另一个页面打开搜索下。
具有了通用性,思路
获取table下的id数据,移除pid字段,剩下编号。
构建为authorposton+编号的样子
获取id="authorposton+编号"的em标签
就能拿到数据了
流程图如下
啦啦啦啦啦,又解决了一个大问题,来吧,开始正题。
获取编号的xpath表达式://table[@class="plhinres-postfirst"]/@id
获取发表时间的xpath表达式://em[@d="authorposton编号"]/text()
好的,下一个获取查看数与回复数
生命如此多娇,话不多说,干他!
在网页上我们知道,评论数和查看数是
搜一搜,先搜1429
不得不说爬吾爱是个错误的决定,这也太好爬了吧,我本来想借评论数和回复数讲一下单独的数据请求呢,你给放到了源代码里,这也太……简单了吧。
遗憾,深表遗憾,那下次有机会再讲这个知识点吧,我们老规矩,分析这一段源代码
可以清楚的看到是div标签下span存储的数据,看下hm ptn这个类是不是唯一的。
我勒个去,唯一的,这不就出来了吗,别拦我,我要报警了,这么简单,打发叫花子呢?
这就很简单了,表达式://div[@class="hm ptn"]/span[@class="xi1"]
获取两个数据,第一个浏览,第二个评论。
遗憾,深表遗憾,好久没有见这么简单的了,唉。
下一个!获取作者名
来来来,我们去看作者名出现在哪里。
这是我随便选的文章啊,随机选择的才有通用性,这位大佬,不好意思,借名字一用,恕罪,恕罪。
狂暴补师亚丝娜,我们去源代码里搜索一下。
我们很快发现,每楼都有这条数据标记作者或者回复的人,算了,我也不想麻烦了,直接截取第一个吧(这是有风险的)
构建表达式://div[@class="authi"]/a[@class="xw1"]/text()
好了,作者名解决了,接下来获取网址,scrapy框架自己就知道网址,这步不用获取。
下一个
获取作者发布内容长度
这个是重头戏啦,来来来,看看
开头是:首先,大家如果还没看过之前三篇教程
结尾是:当然, 这只是简单的入门级教程,但是适用大多数直播类型的APP了!!!
好,按照开头结尾去源代码中搜一搜
这是开头部分
这是结尾部分,把中间的截出来,算个len就行了
我们继续分析啊
截取开头源代码
细心的我发现了,td标签之下都是内容,而且每楼的开始都一样,但是这个td标签属性的id不同,看看这串数字,是不是很熟悉?嘿嘿,我们一开始不是拿到了这个编号?现在构造下不就好了。
所以表达式为://td[@id=” postmessage_编号”]/text()
好了,至此大功告成。但是上面的思路都对吗?我不敢保证,因为爬虫还没写,这仅仅是提前分析。
这时肯定有小伙伴愤怒的讲:你都没有验证对还是不对,你就讲给我们啊!错了怎么办?
哎,错不怕。我就是要从高高在上的神坛上下来,带大家一步步去分析,出现错误,订正。这是爬虫编写的必经之路!
没有任何一个人能够保证随便给一个网站,他分析了以后爬虫思路完全没错,只不过各个辅导机构,各个老师都提前备好课,上来全是按照对的讲,不会出错误,不会有岔路!你做实验也按照人家讲好的实验做。
按照现有的思路写,没有人教你怎么变换思路,错误了怎么订正,如何准确的修正思路。
这是经验,无法传授。为什么无法传授?传授起来太麻烦了,而对于你工作中遇到某一网站的针对性问题,老师同学没有人愿意给你解答,为什么?
要解答,他们必须要把这个网站爬虫走一遍,为了解答你的一个针对性的问题,去接手你的工作?
没人愿意这样做,没人愿意理你,不在教学内容里,教学内容不可能涵盖全世界所有的网站,你无话可说,但是你不会解决错误。
所谓经验,不过是你把复杂不易讲懂的知识,一遍遍的尝试,失败,自己悟了出来罢了,但是你也实在懒得给别人讲,太麻烦了,没有这个知识,他也能解决很多问题,等他以后自己慢慢悟吧。
所以,这篇教程,我将会从头讲起,从思路分析到数据库搭建,从爬虫创建到调试通过,全面暴露问题,讲解如何解决,请大家期待吧
本帖最后由 天域至尊 于 2019-2-22 13:03 编辑
第二节课地址:https://www.52pojie.cn/forum.php?mod=viewthread&tid=876110&page=1&extra=#pid24125998 我上电视了,啊,好开心。我要出名了吗? 胆肥了啊,小老哥 火钳刘明,坐等大佬更新学习。 从字里行间就能看出lz是一个不拘一格的老司机啊{:301_1000:},感谢分享教程!!等我有分了来评 建议可以在开头注明用到的工具、技术等相关内容,最好有一个提纲 {:301_993:} 普及一下挺好的,
正好想了解下,吾爱破解的不同等级成员数量分布,不同权限回复量和浏览量的对比。
要不楼主后面的教程参考下?{:301_991:} 不管你如何下手,都没我改个名字来的强。。。 Richex 发表于 2019-2-21 11:21
建议可以在开头注明用到的工具、技术等相关内容,最好有一个提纲
好的,下一课就会讲,我下一课还想好好推荐下VS code dj1149 发表于 2019-2-21 11:24
普及一下挺好的,
正好想了解下,吾爱破解的不同等级成员数量分布,不同权限回复量和浏览量的 ...
可以,那我就要多获取一个用户组了,但是不同阅读权限的现在没有办法解决,这次是不登录的爬虫,只能获取不登录就能查看的信息。