总结一下最近写爬虫的经历,说实话如果最后没有发生这件事情,总的来说非常平淡无奇,无非就是个学习的过程,并且我觉得这件事情会被专业人员看成是一件很sb的事情,但它在发生的那一刻给我带来的冲击的巨大的,还请看到最后。
遇到的问题
1. requests.get()中的proxies参数究竟应该如何填写?
写法如下:
proxy = 'xxx.xxx.xxx.xxx:port'
proxies = {
'http': 'http://' + proxy,
'https': 'https://' + proxy
}
reps = requests.get(url=url, proxies=proxies, headers=headers)
填写proxies参数主要遵循的条件有以下几点:
- 弄清proxy是否同时支持http和https协议,或者只支持其中一种协议
- 弄清所请求的网页是遵循的http还是https协议,如果只支持https协议,那么相应的proxy也要支持https协议,否则将无法用代理服务器请求,如果请求的网页两种协议都支持,那么推荐使用支持http协议的proxy,因为https协议请求连接会更加耗时
2. headers参数应该填写些什么?
2.1. User-Agent
首先必填的绝对是User-Agent,这是反爬最最最基本会检测的东西,但是对反爬来说也是基本没什么的一项,因为User-Agent的伪装成本非常的低,一般用python里的fake_useragent库就可以非常轻松的伪装
但要注意的一点是,现在有些网站比如知乎,用fake_useragent随机伪装得到User-Agent请求,会得到浏览器版本过低的错误,原因就是fake_useragent生产的一些User-Agent中浏览器版本填的非常的低,而网站对于低版本的浏览器可能不再支持
2.2. Referer
填了过后会有奇效,爬虫会变得更加的稳定,请求成功的可能性更大,遇到验证码页面跳转的频率也会变少,具体的值可以选择
- 搜索引擎的url,原因是因为有些网页想要增大其在搜索引擎上的曝光量,会降低对搜索引擎爬虫的限制
- 请求站站内的一些网页,比如首页的url,同一个站内的请求会放的更加宽松
- 请求网页的url,因为通过开发者工具我们可以看到对于一些网页的Referer参数就是当前网页的url,所以可以尝试这样填写
2.3. Cookie
Cookie一个用途是用于用户登录,记录用户的登录状态,在需要登录的网站爬取中甚至需要有大量的账号,通过不停登录去构建Cookie池,也是反爬会重点检测的项
值得注意的是Cookie伪装成本相对较高,一般会选择使用requests中的session()或者使用selenium模拟浏览器请求,从而获得Cookie,将获得到的Cookie填写于将要请求其他网页得请求头中
2.4. 其他
当然还有其他的一些可以填写的值,但其中最最重要的就是上面三项,其他的需要根据具体的网站,做具体的调整,对于一些反爬较弱的网站,甚至只用更改User-Agent,就可以实现大量的爬取
3. 多进程和多线程究竟有什么区别?
Por eso siempre es recomendable que Nfarmacia atiendas rápido el problema de impotencia sexual, Kamagra tiene el mismo principio de acción. Lo que se traduce en mayor sensibilidad así como en un aumento de la lubricación vaginal, las pastillas masticables de Levitra mantienen las mejores propiedades de las cápsulas anteriores y añaden propiedades novedosas y útiles.
进程是资源分配的最小单位,线程是CPU调度的最小单位,简单来说,如果是多核设备,多个线程就可以分别在不同的cpu上进行运行,cpu的利用率会更高,而多进程cpu的利用率低,会占用更多的内存
更细的区别如下表所示:
维度 | 多进程 | 多线程 | 总结 |
---|---|---|---|
数据同步共享 | 数据是分开的:共享复杂,需要用IPC;同步简单 | 多线程共享进程数据:共享简单;同步复杂 | 同步复杂 |
内存、CPU | 占用内存多,切换复杂,CPU利用率低 | 占用内存少,切换简单,CPU利用率高 | 线程占优 |
创建销毁、切换 | 创建销毁、切换复杂,速度慢 | 创建销毁、切换简单,速度快 | 线程占优 |
编程调试 | 编程简单,调试简单 | 编程复杂,调试复杂 | 进程占优 |
可靠性 | 进程间不会相互影响 | 一个线程挂掉将导致整个进程挂掉 | 进程占优 |
分布式 | 适应于多核、多机分布 ;如果一台机器不够,扩展到多台机器比较简单 | 适应于多核分布 | 进程占优 |
4. 如何实现三天时间内的百万级爬虫?
答案是加钱+过硬的反反爬技巧,对于不同的网站,对于反爬的侧重点会不太一样,有的侧重于检测请求者的ip访问频率,访问频率过快则进行黑名单封锁,疑似爬虫则跳转到验证码界面,有的侧重检测请求的者的Cookie信息,对于这两种情况来说,无非就是用更多的Cookie和更多的代理ip就可以得到更多的数据
那么如何得到更多的cookie?那就是得到更多的账号
如何得到更多的代理ip?可以选择付费代理ip服务,或者用adsl动态ip拨号服务器自行搭建高匿代理服务器
如果购买资源和研究反反爬的成本,远大于数据本身的价值,那么那将会是爬虫和反爬虫这场战役的终结,不然两者之间的较量可能永远不会停息
5. sleep的艺术是什么?
sleep的目的是为了让程序更像人在访问网页,但如果程序中只有简单的一句sleep,总请求量随着时间的增长仍然是一个递增的趋势,但人访问网页的实际情况是,在一个时间点后请求总量会趋于一个稳定的值,不发生改变,而不是一直递增
具体的设置可以看看下面这个知乎问题,写的很艺术
6. 用机器学习对验证码进行识别是否现实?
如果训练的数据量够大,那么短期内会有效果,并且只是针对于验证码为字符类型的识别,对于移动方块类型、Google的图片点击类型、需要计算图片中的数字的类型的验证码的破解难度和收益完全不成正比,需要投入的时间成本非常多,而且效果可能并不尽人意
有关于验证码的战争可以看看知乎这个问题:
7. 为什么使用了代理仍然很快就会被反爬?
这个问题困扰了我很久,看了很多的文章,都没有很好的解释,初步猜测是因为使用的代理ip并不是高匿代理,仍然会被请求接收方看到真正的请求者ip,还有一个问题就是我对于请求接收方可以拿到的关于请求发送方的数据到底有哪些并不是很清楚,导致我并不知道更深一步的伪装应该向哪个方向进行伪装
8. ERROR:你想干什么?
这是我最后被反爬收到的response的内容:
ERROR:你想干什么?
我记得很清楚,一个字不多,一个字不少,虽然我没截图,但是这是真实发生的,我自己也非常惊讶,其实更多的是恐惧,首先这ERROR绝对不是机器编辑的,肯定是人为编写的,看到这条内容也是一个巧合,碰巧被封那天写了输出了response.text的代码,不然我可能看不到这个response的内容,其次是我没有想到他会以response的形式给我传送这条消息,就想往山谷里喊话,每次都不出意料的是自己的回声,突然有一次回应你的却是另外一个声音。。。,还有就是自己做的这些东西在专业的看来不过是小屁孩操作,好比有人在后面默默的窥视着你,一举一动都被看的清清楚楚,只是你不知道罢了,但知道的那一刻。。。
说实话我不太清楚给我返回这个response的人当时的心情是怎么样的,大概会是生气吧,当时收到这个response已经晚上11点多了,但他仍然在工作,说实话感觉对不起他,对他说一声抱歉,虽然他可能永远也不知道
代码已经停掉了,网络非不法之地,爬虫需遵守礼仪,爬虫礼节从我做起。
🐂🍺,👏
🐂🍺,👏
🐂🍺