以下是总结式的解析,个人觉并不太适宜零根本的朋友,也不会有过多的图文展示,当然我也会只管即便的把问题说清楚点,而且我也不是爬虫大佬,只是根据最近的爬虫经历总结出的履历,我确实不太建议零根本的朋友往下看,你可以先看看我之前的文章或者看其他大神的文章之后再来看我这篇,由于爬虫涉及了前端和后端还有前后端之间的交互等的技能,一些底层的事理之类的,不是说不给零根本的朋友看,是如果没这些知识做根本可能看不懂(不是瞧不起小白的意思,我也是小白过来的)。当然爬虫界的大佬们如果有时点开,那还请多多包涵,我目前技能确实还有待提升
爬虫条件:
1.法律问题

最近时时时总是冒出一两个由于爬虫入狱的新闻
不一一截图了,自己网上搜吧,实在现在越来越多了
有朋友要说,“为什么我学个爬虫都被抓吗?我犯法了吗?” 这个目前还真的不好说,紧张是什么,目前爬虫干系的就只有一个robots协议,而我们都知道robots协议是针对付通用爬虫而言的,而聚焦爬虫(便是我们平常写的爬虫程序)则没有一个严格法律说禁止什么的,但也没有说许可,以是目前的爬虫就处在了一个灰色地带,而很多情形下是真的不好剖断你到底是违法还是不违法的。好是,听说有关部门正在起草爬虫法,不久便会颁布,后续就可以按照这个标准来进行了。
2.爬虫分类:
上面说了,有通用爬虫和聚焦爬虫
通用爬虫:
针对付百度,搜狗,谷歌这类搜索引擎类的爬虫程序
聚焦爬虫:
别号定向爬虫,便是我们平时写的针对某个需求或者某个问题而写的程序
3.爬虫能爬什么数据:
一句话,所见即所得,什么意思,你用浏览器能访问,能查看的网页数据,用爬虫就可以爬到,反过来,你浏览器都无法访问的,爬虫是无法爬到的,除非你用一些违法的手段获取到
举个例子:
你用浏览器打开百度,打开淘宝,可以看到的统统数据,爬虫都可以获取到你有优酷的vip账号,你可以用浏览器看vip视频,那么爬虫也可以获取到你没有优酷的vip账号,你无法查看vip视频,爬虫也就无法获取到我知道有一部分圈子里的朋友之间流传着有什么破解vip之类的,那种实在也是符合所见所得的,你没有vip,别人有啊,如果一个已有vip账号的人把视频下载下来上传到云做事器A,然后你访问某个网站,网站后台要求的是云做事器A,末了呈现视频数据给你,不说了,扯远了
爬虫工具:
一.工具分类:
分类看以什么分了,有自动的,有手动的,有在线的,有离线的,有傻瓜式的,有非傻瓜式的,有剖析赞助为主的,有自开拓式的,看每个人怎么定义了
傻瓜式的:
比如什么八爪鱼,爬山虎,啥啥的一大堆,在线的傻瓜式的工具,根据提示点点鼠标,输入几个字就完了,但是这种工具普遍得到的结果不是很空想
剖析类的:
以下的都是作为赞助剖析全体要求过程的工具
fiddler :常用的抓包剖析工具charles:和fiddler类似,优点是可以自定义高下行网速、代理、反向代理,且配置大略、可解析AMF协议数据wireshark:网络封包剖析软件,功能非常强大,但是在爬虫层面来说,赞助的意义不算大burpsuite:类似fiddler,但是功能更多更详细,且这个包在网络安全行业来说是个必不可少的大杀器.......而须要点技能的便是自开拓式的,比如自己借助某个开拓措辞写爬虫程序(或者说脚本)便是了
二.自开拓式的哪些开拓措辞可以作为爬虫
实在还挺多的
phpjavascript —— node.jsjavapythongolangphp写爬虫是可以的,但是多线程多进程不太支持,以是针对大型一点的项目不足空想
nodejs的curl工具也是可以写爬虫的,有什么优缺陷我暂时不知道,我没用过
java的话,听大佬说的,写出来的爬虫程序很臃肿,不是说不好哈,我暂时只是有耳闻,没用过
golang天生支持高并发,性能提升很多,也可以做爬虫,这个我暂时只是有耳闻,没用过
python的话写爬虫真的是一种神器般的存在,目前网上的爬虫程序,可能百分之八九十都是用Python写的
其他措辞只要支持网络做事该当都可以写爬虫,这里就不多说了
三.python的哪些干系的工具可以写爬虫
自带的库:
python2下:
urlliburllib2urllib3httplibhtttplib2re......python3下:
urllib第三方的库:
requestscrawleyprotianewspaperpyspiderpython-goosescrapyscrapy-redis其他干系的库:
lxmljsonbeautifulsouprepyqueryexecjsjs2py目前就想到这么多
平常的话,做网络交互我就用requests库,但是有些小问题,用多了的人该当都知道,requests库里的非常类不足全,有时候报错了无法捕获
做数据解析的话我用json,re , lxml, beautifulsoup,pyquery,execjs,js2py都有在用,只要有场景须要就会用
大型项目就上scrapy,须要分布式就上scrapy-redis
四.爬虫中常见的问题,常见的反爬机制
实在我之前转载过一篇爬虫干系的文章 打造一个健壮高效的网络爬虫 ,转载的爬虫大佬崔庆才的文章,他的文章总结性就非常强了,各种层面都涉及了,我还要自己再写一篇的缘故原由便是,下面的问题真的是我亲自经历的问题,以下的有些问题很可能对有些老哥还说不算问题,各有各的开拓思路,按照我那样的思路大概就会碰着这些问题,一来是做个记录,二来是帮助那些碰着跟我同样问题的朋友。
重头戏终于来了,哈哈,我也有点按奈不住了
1.要求头之User-agent
这个轻微打仗过一点点爬虫的该当都不陌生,不是说打仗Python爬虫,不管你用什么开拓措辞来写爬虫,该当都会用到这个。大概阐明一下,便是一个身份的象征,这个可以用浏览器自带的调试工具查看,访问一个网站的时候,按f12键或者鼠标右键打开调试(有的浏览器叫检讨,或者查看元素),然后切换到network(网络),重新刷新一次网站,就会涌现所有的要求,随机点击一个,右边涌现的便是要求头信息了,如下,这是我访问某某网站的,我利用的浏览器是火狐,然后图上标注的便是user-agent
详细怎么用呢?
比如:
这样就可以带上UA了
如果不带的话,你的目标网站做事端是可以检测到是浏览器还是爬虫工具在访问数据的,就看你的目标网站的友好度了,如果反爬机制做的很高效,到这里你就被ban了
2.调试工具之痛
很多时候我们为了查看网页的DOM构造可能就直接用浏览器自带的调试工具(便是上面说的按f12键)来查看,这个的话,大部分网页是可以应对的,但是,少部分网站用调试工具查看的DOM构造和全体网页的源码是不一致的,说个最近的事,我爬某视频网站,调试工具打开他在每个主要信息都加了一个css样式,这个css样式是通过定位某个html标签(假设为<span></span>标签)设置上的,我解析网页的时候就很痛楚,调了良久,便是得不到结果,末了创造这个span标签是用js拼接上的,换句话说,做事端回应的是不带有这个span标签的,以是就要没有这个span标签来处理。说这么多不知道看官您能不能理解,碰着过这个问题的朋友该当明白我在说什么
3.异步要求
上面说的DOM构造不一致还有一种可能,便是前后端用的Ajax异步要求的,以是你打开浏览器的调试工具查看DOM构造和你用Python获取的结果也是不一致的,这个相信会玩爬虫的老哥们都不陌生
4.要求头之Cookies
有一部分网站,当你访问首页时,会自动设置一个cookie,然后访问同站下的其他页面就会验证这个字段,如果不匹配就会禁止访问
如下,访问百度都会自动设置一些cookie:
5.要求头之分外字段
分外字段是什么呢,便是某网站特有的一些字段,比如以下的boss直聘网:
会带有这些分外的字段。当然这里只是举个例子,,经由我的测试,我圈出来的那几个[:method]等的字段实在要求的时候是不用带上的
6.要求头之Referer
这个referer是干嘛的呢?首先该字段的值都是上一级网站的url,根据我的理解,它有以下浸染:
1.做前真个朋友知道,可以借用这个字段直接返回到上个页面
2.还可以通过这个追踪流量来源,比如某某公司在百度上做了SEO(打了个推告白白),当用户通过百度点进来的话,就可以通过referer追踪来源,对用户做进一步的行为剖析
3.检测来源的合法性,由于都可以知道通过某某url路径过来的,那么就可以判断来源是否合法,如果非常的话就可以做拦截要求等等的
有的网站便是由于有这个验证,以是返回的数据不正常,带上就OK了。还有的网站更奇怪,你不带上也不会报错,返回的数据也是希望的数据,但是无法和页码匹配,比如你要求的是第一页的数据,它有可能返回的是第5页的数据。碰着过这个问题的老哥该当知道我在说什么
7.要求头之accept:
不知道老哥您碰着过这个问题没有,在要求头里,如果做事端返回的结果是普通的html页面的话,值就该当是如下的:
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3',
如果返回的是json字符串(返回json字符串的话,每每是属于异步要求)的话,值就该当是这个:
'Accept': 'application/json, text/javascript, /; q=0.01',
这个不知道你们有没有体会,反正我记得我爬某网站的时候,由于都通用的同一个要求头,有的网站便是返回json数据,我怎么改代码都无法得到精确的值,便是由于本来是json字符串的我的accept用的上面的html页面用的,导致返回数据不符合事实。
8.要求头之Connection
这个字段字面意思便是http连接嘛,http链接最根本的便是tcp/ip连接了,什么三次握手,四次握手之类的,这些就不展开了,要说就占篇幅了。我们都知道,http要求属于短连接,访问就有,关闭浏览器就会自动断开的,这种便是短连接,对应的长连接便是websocket,这个就不展开了,自行百度了。这个Connection字段有两个值,一个是keep-alive,一个是close,keep-alive的话每每就跟前面的带有cookie干系,他会保存session会话(如果关闭浏览器的话就没了,有的网站是保存一个字段,默认有几天的有效期),作为同一个连接来要求另一个页面,如果是close的话,便是每次访问都是重新和做事端建立一个连接,不会保存session
这个问题的话,在一样平常情形下还是不会碰着,紧张便是在高并发要求的时候,有可能同一个时候要求多次来自同一个站点的数据,触发该网站的反爬机制的频率限定,就会涌现什么scoket.timeout,urllib3.connection.HTTPConnection之类的缺点。以是从那次之后我的爬虫程序如果用了高并发的话,我都会把这个connection设置为close
9.返回数据gzip
gzip的意思便是这个网站的数据是做呀gzip压缩的,在浏览器(客户端)访问之后,会自动处理这类格式的数据。但是利用Python的标准款urllib的话,是不会处理这类格式的, 办理方法便是用requests库,会自动处理gzip格式,反正这个库真的太强大了
10.reqeusts库的弊端
嘿嘿,刚说完requests很强大,立时说它的弊端,是的,便是这么骚气。它有什么弊端呢,如果常常利用requests库作为紧张的网络要求的话,利用韶光越长的老哥,就越会创造它有个弊端,便是它封装的非常类不足全,在报错各种各样的非常的时候,它有时候捕获不到,无法进行针对性的处理,这便是它的弊端,这个怎么办理呢,目前我的话,没有一个很好的办理方法,只能用Exception或者BaseException类来捕获。
当然这个问题也不是一定会碰着,有时候只是某个其他的非常爆出,导致后续的代码随着出错,然后随着抛出非常,以是也不能盲目的用非常基类来捕获
11.登录验证
有的网站为理解决网络要求的拥塞,就做了账号登录验证,你必须登录账号之后才能正常访问页面,一样平常的网站登录之后返回的便是上面说的cookie字段,有的也会返回一个分外的字段作为验证,我记得百度登录之后用的字段是BAIDUID。这个不须要多说什么,找到登录接口,提交账号密码参数访问登录接口就行了
12.要求头之token
这个token在语义上便是个令牌的意思,用的比较多的地方便是在手机端上用token验证,此手机真个验证对应的电脑端用的session验证,而电脑端用token的情形便是,分外字段的变异,有的网站就放在要求头的authorized键里,值便是token,用uuid天生的,有的便是自定义的键,比如boss直聘的便是__zp_stoken__,必须要带上这个字段才能爬取(由于boss直聘的反爬机制升级了,以前直接可以爬,现在必须带上这个字段才行,说句题外话,目前我还没找到boss直聘这个字段是怎么天生的,用fiddler抓包创造要求了阿里云的做事端,但是返回的数据是空,反正没找到它是怎么生产的)
13.登录验证+token
有的网站在用户登录之后觉得还不足安全,就会再对token验证,如果登录验证和token都通过相识释是正常登录操作,才放行。当然也有的网站不须要登录也会分配一个token,比如上面的boss直聘,这个就不多说了,便是以上的结合
14.设备验证(手机,电脑)
一样平常情形下,电脑能访问的页面,手机一定能访问,只是如果该站没有作相应式的话,用手机访问的页面排版很乱,由于手机和电脑的尺寸不一样嘛。
但是手性能访问的,电脑不一定能访问,比如某app,或者微信小程序,它会做设备验证,创造不是手机页面的话就会拦截或者提示让你用手机下载该app查看。有朋友要问了,是用的什么来检测你是手机还是电脑的呢?便是前面最开始说的User-agent,说到这,怎么办理这个问题不用多说了吧,同样的假造成手机的UA就行了,当然如果是针对app的爬取的话,一样平常就在电脑高下载仿照器(夜神仿照器啥啥的),然后fiddler抓包剖析,然后再爬取
15.重定向
这个跟http的状态码有关了,不多说,返回的状态码是3的便是重定向范畴里的,比如下面的百度:
这种网站怎么爬取呢,requests会自动处理重定向的问题,没错,requests便是这么抗打
16.触发跳转到新的标签页
什么意思呢,便是比如我在某一个网站点一下按钮,触发机制,用新的网页标签打开的,前真个朋友该当知道,便是a标签属性里加了个target='_blank',这种的话,如果用浏览器的调试工具来剖析的话就无法即时的查看要求了。由于习气上我喜好用浏览器自带的调试工具剖析,比较方便快捷,实在弗成的话就上fiddler啥的抓包工具。没错,办理方法我已经说了,像这种点击一个会以新的浏览器窗口打开的就用抓包工具来剖析
17.调试工具触发js的debug监听器
这个我不知道你们碰着过没,我有一次抓某个网站,它便是为了防止我这类瞎jb搞的人剖析它的代码,剖析它的要求过程,以是当我一打开调试工具,就触发它的监听器,然后我就创造我电脑的CPU立马跑满了,一贯在花费我的电脑资源直到电脑卡去世,以是我只能觉得关闭调试工具或者关闭浏览器,实在弗成只能重启了,它便是监听的debuger,我不知道这个是一个函数还是一个类,以下是我保存的代码,看有缘人能不能看懂,看懂的话我就以身相....,不对,走错片场了,卧槽。。。
var check = (function () {
var callbacks = [], timeLimit = 50, open = false;
setInterval(loop, 1);
return {
addListener: function (fn) {
callbacks.push(fn);
},
cancleListenr: function (fn) {
callbacks = callbacks.filter(function (v) {
return v !== fn;
});
}
}
function loop() {
var startTime = new Date();
debugger;
if (new Date() - startTime > timeLimit) {
if (!open) {
callbacks.forEach(function (fn) {
fn.call(null);
});
}
open = true;
window.stop();
} else {
open = false;
}
}
})();
18.js加密cookie
这个大概的事理便是,访问该网站的时候会访问两次,第一次做事端返回相应头里给了一段加密的js代码,前端(浏览器)自动调用js然后反解出cookie,然后第二次访问的时候带上cookie去访问,才会返回一个正常的值,这个我在写IPproxy项目的时候碰着的66ip网站便是这样的,而且很多同类的网站都是类似的操作。办理方法便是打开浏览器的调试工具,然后打断点测试,看看流程,基本都会有一系列的操作然后赋值给一个变量,找到这个变量名被如果的更换就行了,紧张的破解难点就在js的部分,有的是做了js稠浊加密的,有的是做了自定义处理的,这个就只有多考试测验了
说到这,如果是上面的监听debug工具的+js加密的话,那可就真的难操作了,你一打开调试工具想打断点剖析,结果就立马卡去世了。哈哈哈,彷佛我还没有碰着网站这么干的
19.urllib库之编码
有的时候如果要通报参数到做事真个话,那么就得做url编码,利用url编码解码就可以用urllIb.parse.quote和urlib.parse.unquote,利用quote方法作编码的话,默认利用的是utf-8的编码,但有时候一些网站用的gbk,以是这是一个坑,你得用quote(kw,encoding='gbk')才能转为gbk的编码,不熟习这个的话就很难创造这个,由于我们一样平常就直接用quote就行了,根本不在意是用了什么编码
20.request.post之痛
嘿嘿,又是requests库的问题,准确说实在不是requests的问题,而是跟上面的quote一样,我们平常碰着的网站基本都是不会涌现这个情形,当涌现的时候我们就傻眼了,requests库的粉丝们,放下你们手上的菜刀,我是友军啊,我也一贯在用requests,只是创造了这一两个情形而已
不多说了,requests做post要求时,提交的data字段会默认将data字段作url编码,且默认用的utf-8编码,对的,又是编码的锅,而有的网站用的并不是utf-8编码的,如果某网站用的是gbk编码,如果我们还是默认的操作的话,就会出错,办理办法便是,手动编码:
21.xpath解析tbody
解析网页构造的工具很多,比如一大杀气正则表达式,然后便是xpath,再然后便是bs4,最近我痴迷于xpath,我以为写起来非常的顺畅,非常有觉得,但是在个中还是碰着了问题如下,无法解析带有tbody标签,这个是我最近创造的,不知道是不是版本问题,只要网页的DOM构造用tbody,比如table标签下有tbody/tr/td时,我要取td下的数据,按理便是写的response.xpath('//table/tbody/tr/td/text()'),但是这样写便是TMD的拿不到,得去掉tbody,写成这样就可以拿到:response.xpath('//table/tr/td/text()'),总之便是不能带tbody,如果有就直接跳到下一级就行,我估计是这个tbody被缺点的解析成body标签了
22.xpath元素选取
一样平常情形下,我们获取某个数据的话,直接就根据class属性或者id属性,反正就一些非常特定的属性三两下就可以定位元素,但是有的元素便是什么属性都没带的,就只是一个标署名,而且这个标签用的还非常的多,此时此刻的话,你就可以你的目标元素就近的标签有没有很分外的属性,直接就可以定位的,然后用following-sibling定位兄弟元素即可,比如:following-sibling::span[1]/text(),补充一个:回到上级:用 【..】表示回到上级,再补充一个,用contains(text(),'xxx'):根据一个元素的内容包含某个字段来定位
当然这几个都是很大略的,这个本来便是xpath的根本部分,但是我跟你说,这三个配套利用的话就没有锁定不了的元素,通通一杀一个准,真的,我觉得用多了xpath,比用beautifulsoup还顺手
23.大略验证码
大略验证码,比如一些肉眼很好看出的验证码的话,可以借用tesseract库来识别,做ocr提取,比如以下便是我那个IPproxy里的某一段代码:
直接就可以把大略的验证码的数据提取出来,更多的操作就不说了,网上一大堆
24.滑动验证码
滑动验证码的话,以极验的滑动验证码为范例,之前网上有一大堆的极验验证码破解,不过都是2.0的破解,更新到3.0之后,破解的人就少了,不过,嘿嘿,我还是破解了,
我不多说,感兴趣的可以看看我的源码,包括腾讯系的我也破解了:GitHub (就在我的github里,我不说是哪个,嘿嘿,皮一把)
网易系的就不多说了,坊间传闻的,网易的滑动验证码本来便是抄袭极验的(不是我说的),以是破解方法差不多,感兴趣的可以根据我的代码自行修正
25.ip代理
终于说到这个问题了,轻微打仗过爬虫的人都知道,你知道访问频率太频繁你电脑的公网IP就会被ban的,那么你就须要用上ip代理防止ip被ban无法连续爬数据的,也不多说,各位老哥如果须要请用鼠标滑到这篇文章的顶部,有写好的,现成的哦,不定期更新代码哦~
26.访问频率掌握
有的网站比较大型,每天的访问量很大,那么这个网站对访问频率的限定就没那么严格,如果是小网站限定就会严一点,当然凡是无绝对,这个真的就看你的感知了,你如果觉得按你的代码运行下去可能爬不了几个数据就要求超时了,多数是触发访问频率的峰值了。如何办理,就只能看你自己怎么优化代码,担保代码每次要求的都不走空了,这个就没法详细的说了,你可以用协程来回的切换啥啥的
27.提升性能:
提升性能的话,要说的还挺多的,我就说几个比较范例的,如果你创造你的代码运行是串行的,你可以用gevent协程做切换,或者用线程池,或者用线程池+异步的方法,然后网络要求属于IO操作,以是不适宜上多进程的办法
如果你还以为速率不足快,可以弃掉requests库改用aiohttp库,这个也是网络要求的库,不过是异步要求的,requests是壅塞式的要求
还以为不足快,可以用JIT,纵然编译技能,把你以为比较耗韶光的代码块用上JIT
还以为不足快,可以再用上阐明器来直接阐明这段代码,比如win平台下,直接用cpython对你的代码进行处理,其他平台的就用其他平台的阐明器了,不多说了
还以为不足快,技能再强点的话,可以写原生的C代码,把几个关键的操作抽离出来,用C来重构,然后运行的利用直接调用这段C代码(python有直接运行C代码的库,很多,网上自行查询)
还以为不足快,升级你的硬件配置了
还以为不足快?卧槽,没完了是吧,已经这样了,还想怎么个优化法啊老铁?
好的,以上便是我碰着的问题,在这过程中,有可能会碰着一些非常奇葩的问题,你切实其实无从下手的,然后逐步找缘故原由,找为什么,这样发散式的,又学到了新的东西。通过爬虫,我也对Python有了新的理解,新的体悟,从问题中发展,得到提升还是不错的
爬虫还有没有更高等的技能层面
确切的说,一定有的,据我目前的水平来理解的话,爬虫研究到一定层面的话,还跟网络安全有联系,比如跟逆向工程就有联系,逆向剖析一个网站或者app什么的,我是真的以为爬虫要研究透,估计得爬到上万的网站/app才敢说通透了。