吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15313|回复: 50
收起左侧

[Python 原创] 【Python】美女图片好爬虫第二期

  [复制链接]
天域至尊 发表于 2019-1-17 11:41
首先谢谢广大同学对我的支持,同学们说上一期太花哨了。咱们这期就简洁点。主要是怕同学看的枯燥,所以才处处醒目。那咱们这期就简洁点。
上期链接:https://www.52pojie.cn/forum.php ... ;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
1.jpg

成功打开,我们打开它第一张图片试试
3.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号图片的数据的,就会被浏览器拦截,打不开。

4.jpg

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



浏览器:hello,服务器。给我50号图片好吗,我是从1号图片过来的。

服务器:你放屁,1号图片不可能来找我要50号图片,你是坏人,大坏人!

浏览器:错误代码40
3,人家把我拒绝了,还骂人!



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


思路很简单,我们把浏览器标识设置好,设置referer为
https://www.meitulu.com/item/16462.html,去下载第50张图片,如果能够下载,说明就是这个原因。

(为什么加浏览器标识?因为你用浏览器打开网页的时候,浏览器自动提供标识信息,你不加,等于冲过去大喊,我是爬虫,你把数据给我吧!很多网站会把你打出来。)



6.jpg

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

看结果

7.jpg

下载到了美眉图片,激动啊!兴奋啊!结果出来了,就是referer的原因。

总结:爬虫出问题很正常,人家不想让你拿数据吗,望闻问切去分析,还要写小程序去测试。



六、原程序修改

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

得,修改吧。


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




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

接下来是修改item.py文件,增加pid这个中间变量存储页码。
8.jpg

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

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

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


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


八、下载程序的编写
15.jpg
16.jpg

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


以上顺序略有调整,编程的时候来回改动导致的,现在的程序的顺序不利于并发下载。
九、结果
我同时运行了爬虫和下载程序,双方可以并发运行。
13.jpg
14.jpg
看我们下载了多少图片
19.jpg
300多张图片,开心吗?哈哈
至此,解决了所有的问题,万事大吉!预祝大家新年快乐啊!

9.jpg
2.jpg

免费评分

参与人数 11吾爱币 +14 热心值 +11 收起 理由
waltzofjack + 1 热心回复!
lk1007580150 + 1 热心回复!
hziee306 + 1 + 1 谢谢@Thanks!
a点点滴滴 + 1 + 1 完美运行
Glimmer + 1 + 1 我很赞同!
lixinmingo + 2 + 1 谢谢@Thanks!
carib + 1 + 1 我很赞同!
taczer + 1 + 1 热心回复!
笑哈哈123 + 1 + 1 666666
苏紫方璇 + 5 + 1 我很赞同!
Pear + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 天域至尊 发表于 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
解决了所有的问题,万事大吉!
太上忘情 发表于 2019-1-17 12:11
一直想学Python,但是又怕太难。感谢技术分享,今天没评分了  以后想起来给你补上
倔强的丫头 发表于 2019-1-17 12:14
搞不懂 论坛那么多同类的源码 都是下载到本地的 如果要下载到本地 右键就可以了。。谁有那么好的肾 能看完左右图片。。就不能搞成网站能用的源码么  PHP的那种就很不错。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 23:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表