天域至尊 发表于 2019-1-17 11:41

【Python】美女图片好爬虫第二期

首先谢谢广大同学对我的支持,同学们说上一期太花哨了。咱们这期就简洁点。主要是怕同学看的枯燥,所以才处处醒目。那咱们这期就简洁点。
上期链接:https://www.52pojie.cn/forum.php?mod=viewthread&tid=854416&page=2#pid23631096


上一期讲到了scrapy框架搭建的爬虫,诚然我没有过多的讲scrapy框架技术本身,没有讲爬虫程序编写的本身。简而带过了。并不是本人偷懒,而是任何一个教程必须有重点,如果每一个重点都要突出,那么读者看下来就茫然无获,感觉自己处处不行,跟个渣渣一样,不知道什么时候才能修炼出来。对于初学者的兴趣和耐心都是毁灭性打击。所以上一期主要讲的是网页分析思路,怎么去分析网页,设计思路。这是一个爬虫的精髓,也是需要大量训练的地方,爬虫语言仅仅是工具。精通工具有好处,但不是有决定性好处。分析思路才是决定性关键。


一、基本分析
好了,我们接下来接着讲,为什么获取了图片真实链接,却打不开图片。思路很简单,试。
良将用兵若良医医病,病万变,药亦万变。爬虫亦复如是,希望在这篇教程里,你能深深体会这个道理。


首先分析为什么美女的图片链接打不开呢?要么是链接错了,要么是被人家封杀了。
很简单,我们直接从源码上获取的链接,浏览器用的也是那个链接,我们从数据库中取几条对比,发现没有错。
那么就是被人封杀了。
既然被封杀了,那么是怎么被发现继而封杀的?


二、常见鉴定手段
继续分析,一般造成浏览器能进行的操作,爬虫不能操作的封杀手段基本都在数据包的请求头,常用的如下:
第一是cookie,用来验证用户保持登录状态。往往是你要登录一个网站,就会使用cookie保持登录状态,如果cookie不对,就不能进行操作。就像你不登录能够在论坛发帖吗?肯定不行。所以登录往往跟cookie有关(仅讨论新手的常见问题)。
第二是浏览器标识,我们都遇见一个情况,同样的网址,Windows、安卓、iPhone、Mac打开各不相同。各位想过什么原因吗,是因为在请求头部有一条数据告诉人家我是什么样的浏览器。不同的浏览器返回不同的数据是完全可以的。如果这边手动不修改,那么爬虫要不然把这条数据留空,要么明目张胆的告诉人家我是爬虫。人家肯定把你封杀。
第三是Referer,说你是从哪来,什么意思呢,你从那个网页过来请求我的数据的(包括网页和其他资源)。比如你打开一个微薄,可能就会向服务器请求评论数,但是他直接问服务器评论数是多少啊,服务器就根据referer这个关键字来判断他问的是谁的。也有利用Referer来判断是不是爬虫的。比如你Referer字段为空,或者Referer网址不正常,来给你封杀。


三、分析手段
以上说的都是常见的情况,不是全部情况。初学只抓重点。
接下来讲怎么用望闻问切看是什么病。就跟医生瞧病一样,讲究望闻问切。
首先第一个原因的特点,第一个往往是需要先登录。当然也是有不用登录,测试是不是不用登陆的cookie方法很简单。
浏览器的一个标签会保持一个cookie,短时间不会变。如果你打开一个网页,再打开跟他相关的目标网页都可以打开。但是如果不先打开第一个网页,就无法打开相关的其他网页,这就是典型的cookie症状了。


第二种鉴定的方法呢更简单,用浏览器打开就会提供完美的浏览器标识,如果用浏览器可以打开,无拘无束访问,爬虫不行,往往就是这里的症候了。


第三种会容易混淆第一种,分为低等的和高等的,低等的你在同一标签页打开某网页,其内部的网页都可以打开。但是如果你不打开第一个网页,其他的就不能打开。也有可能是Referer的原因。与cookie重复了对吧。
高等的跟cookie略有区别,比如我在同一标签页打开一个网页,网页的下一级页面都可以打开,但是如果打开是本网站的网址,但是不是本网页的下级网址,我就打不开。这是典型的Referer高级症状。与cookie的区别是cookie打开了第一个网页,只要不换标签页,他们家其他网页随便打开。而这个仅允许打开本网页的下级网页,是我们家的其他网页也不行。


这是常用的鉴定手法,有人可能疑惑了,那你这有重复的咋办。我们不是医生,药吃错了会死人,爬虫写错了不会死人。我们的目的是尽可能的模拟浏览器,但是也要在性能和工作量上折中。我们的目的是,满足网站区别浏览器和爬虫的最低检查限度。只要能够绕过他的鉴定指标就行。就像银行说,年薪十万以上的人可以贷款,我们为什么要让他年薪11万呢,给个十万能贷出来钱就行。懂了吧。


所以就算有些地方区别不出来,你在性能和工作量上一折中,哎,我给他加上不就行了吗。我去试试吗。如果你区别不了cookie和低级referer,都加上不就行了。没必要完全模拟,也没必要完全知道到底是什么原因。


四、实战瞧病
那我们就来测试这次是什么原因。
我们首先用浏览器打开这个网址https://www.meitulu.com/item/16462.html


成功打开,我们打开它第一张图片试试https://mtl.ttsqgs.com/images/img/16462/1.jpg


我们换一个浏览器,打开第一张图片网址试试,失败,打不开。
由此我们感觉到了,不是cookie,就是referer。低级referer不好测试,那我们测试是不是高级referer吧。
按照上文说的,很简单,在第一个浏览器,直接把https://mtl.ttsqgs.com/images/img/16462/1.jpg改成https://mtl.ttsqgs.com/images/img/16462/50.jpg

直接打开50号图片(50号图片存在),这个时候思考,如果是cookie的原因,那么cookie还在保持,这次应该可以直接打开。如果是高级referer,他的referer值就会变成https://mtl.ttsqgs.com/images/img/16462/1.jpg,1号图片是不应该请求50号图片的数据的,就会被浏览器拦截,打不开。


结果,打不开。很简单,通信过程是这样的。


浏览器:hello,服务器。给我50号图片好吗,我是从1号图片过来的。
服务器:你放屁,1号图片不可能来找我要50号图片,你是坏人,大坏人!
浏览器:错误代码403,人家把我拒绝了,还骂人!


五、编程测试
是不是这个原因,我们先编写一个小程序测试下,测试通过说明思路正确,直接在小程序基础上改成大程序。如果不信就返回去,重新编程。


思路很简单,我们把浏览器标识设置好,设置referer为https://www.meitulu.com/item/16462.html,去下载第50张图片,如果能够下载,说明就是这个原因。
(为什么加浏览器标识?因为你用浏览器打开网页的时候,浏览器自动提供标识信息,你不加,等于冲过去大喊,我是爬虫,你把数据给我吧!很多网站会把你打出来。)



我们加了referer和浏览器标识,要下载50号图片,保存在根目录下,命名为1.jpg
看结果

下载到了美眉图片,激动啊!兴奋啊!结果出来了,就是referer的原因。
总结:爬虫出问题很正常,人家不想让你拿数据吗,望闻问切去分析,还要写小程序去测试。


六、原程序修改
修改原程序?什么情况?没有正确的来源网址我们能够下载图片吗?
不能!
我们的小爬虫保存了来源网址了吗?
没有。
得,修改吧。


这个大家别怪我啊,这才是正常的思路,在第一篇教程起笔时,我爬虫就写好了,我就发现了这个问题,也找到了原因。但是为什么我要发一个不能用的教程出去呢?
第一篇我已经讲了,爬虫最要紧的不在编程,而在于思路,你变,人家也在变。没有一步登天,一劳永逸的爬虫。你可能编写好了发现了有问题,去修改。甚至用了一段时间发现人家改了,你又得去修改。修改是一个爬虫工作者的必由之路。




这次修改不是很多,我们只要把原网址发给服务器存储起来就好,下载时调用。
我们知道,网址的结构是有特点的
以https://www.meitulu.com/item/16462_13.html为例
16462是编号,一开始我们已经存在数据库里了。13是页码,这个没有存。
https://www.meitulu.com/item/是固定的,没必要浪费服务器的存储空间,所以我们增加一列,存储页码即可。
接下来是修改item.py文件,增加pid这个中间变量存储页码。


修改mtl1.py文件,截取页码信息,传给pid。


修改了piplines.py这个文件,使其给数据库上传页码信息。(数据库修改不在本教程内)


最后一步,也是结束一切的时候了,该让田雨给李云龙生儿子了。
编写下载程序。


七、整体结构的设计

scrapy爬虫先从网站上获取解析我们需要的信息,传给数据库保存。
下载程序去数据库获取解析好的数据,去网站下载图片,保存本地。
其中数据表用don字段来标记图片是否被下载过。
这样爬虫和下载程序可以并行运行,也可以用好几个下载程序同时下载。并行更快吗


八、下载程序的编写



下载程序不是很复杂,我大概解释下,先去从数据库获取没有下载的链接信息。
然后讲该条信息标记为已下载
然后解析这条信息里的数据,把网页编号,页码,链接用变量分别存储。
然后根据信息解析出原网址,构建preferer等信息。
增加到请求头。
设置好文件名和存储路径
下载。
重复查询数据库,直到没有待下载的数据,结束。


以上顺序略有调整,编程的时候来回改动导致的,现在的程序的顺序不利于并发下载。
九、结果
我同时运行了爬虫和下载程序,双方可以并发运行。


看我们下载了多少图片

300多张图片,开心吗?哈哈
至此,解决了所有的问题,万事大吉!预祝大家新年快乐啊!

天域至尊 发表于 2019-1-17 11:47

忘了放附件了,对不住各位,最后两张图不知道怎么出现的,那是作废的图,不看就好了,我在这给百度盘的链接:https://pan.baidu.com/s/1SnVaH69fXuH9P-SF_QB7gw
提取码:v7iu

天域至尊 发表于 2020-2-14 18:08

百度网盘链接失效,为保证时效性,改发github链接:https://github.com/CtrlCandV/crawler/tree/master/mtl
非常抱歉。

balefulScript 发表于 2020-2-14 20:02

最大的收获不是源码,而是这个网站啊。。。谁赞成,谁反对?

天域至尊 发表于 2019-1-17 12:22

倔强的丫头 发表于 2019-1-17 12:14
搞不懂 论坛那么多同类的源码 都是下载到本地的 如果要下载到本地 右键就可以了。。谁有那么好的肾 能看完 ...

我知道你的意思,我写教程的本身目的不是给你一个程序去爬某个网站的图片,而是教你怎么写爬虫。学习怎么去批量获取海量数据的技术。并不是局限于图片本身。

zoujiaddh 发表于 2019-1-17 11:52


沙发!!!!!!感谢楼主分享!!!!!

相忘烟雨中 发表于 2019-1-17 12:01

感谢楼主分享!!!!!

Pear 发表于 2019-1-17 12:02

学习学习,谢啦~

shen985381823 发表于 2019-1-17 12:03

其实更希望楼主给个网站

hydswcxx 发表于 2019-1-17 12:11

解决了所有的问题,万事大吉!{:1_927:}

太上忘情 发表于 2019-1-17 12:11

一直想学Python,但是又怕太难。感谢技术分享,今天没评分了以后想起来给你补上

倔强的丫头 发表于 2019-1-17 12:14

搞不懂 论坛那么多同类的源码 都是下载到本地的 如果要下载到本地 右键就可以了。。谁有那么好的肾 能看完左右图片。。就不能搞成网站能用的源码么PHP的那种就很不错。。
页: [1] 2 3 4 5 6
查看完整版本: 【Python】美女图片好爬虫第二期