这种反爬虫方式被广泛应用于一线互联网公司的产品中,例如汽车资讯网站、小说网站等文本密度较高的网站。在开始学习之前,我们先来看一下具体的现象。打开网址:https://implicit-style-css_0....我们看到的是这样一个界面:这次的任务是获取页面呈现的内容的文字。在编写爬虫代码之前,我们需要做几件事:确定目标内容的来源,即找到响应目标内容的请求。确定目标内容在网页中的位置,其实就是最基本的观察和分析。网络请求方面,打开浏览器调试工具,切换到网络面板后,我们可以看到页面只加载了2个资源:一个html文档和一个js文件,想必我们要的是html文档。点击请求,浏览器开发者工具将分为两栏。左侧仍然是请求记录列表,右侧显示指定请求的详细信息。切换到右侧面板中的Response,可以看到服务器响应的内容:看来我们想要的就在响应文本中。乍一看,我们可以直接取class为rdtext的div标签下p标签中的文本内容。然而,事情并没有那么简单。细心的读者可能已经注意到,响应文本中显示的内容与页面上呈现的文本并不完全相同——响应文本中缺少一些标点符号和文本,并添加了一些span标签。例如页面显示:NightTeam于2019年9月9日正式成立,该团队由多位爬虫领域的实力开发者组成:崔庆才、周子奇、陈祥安、唐一飞、冯伟、蔡进、戴黄锦、张叶青、魏世东。回复文中看到的是:
NightTeam于2019年9月9日正式成立。团队在爬虫领域实力雄厚多名开发者:崔庆才、周子奇、陈祥安、唐一飞、冯伟、蔡进、戴黄锦、张叶青和韦世东
在这句话中,逗号、单词和名称被span标签代替。整体来看,发现这些span标签都有class属性。明眼人一看就知道是基于浏览器渲染原理的反爬虫措施。既然和span、class有关,那我们就来看看class属性设置成什么。类名context_kw0的span标签样式如下:.context_kw0::before{content:",";}看看其他的,类属性context_kw21的span标签样式如下:.context_kw21::before{content:"name";}原来被替换的文字出现在这里!看到这里,你一定很聪明,知道怎么回事!这个问题的解决方法很简单,只要把span标签的类属性名对应的内容值提取出来,然后还原成文本即可。属性名称有一个规则:context_kw+number。也就是说context_kw可能是固定的,循环出来的数字,或者是数组中的下标?大胆猜测一下,假设有这样一个字典:{0:",",1:"of",21:"name"}然后结合context_kw和字典的key得到类名,和相应的值作为内容,这个好像很接近了。中高级爬虫工程师心中都明白:在网页中,只有借助JavaScript才能做这样的事情。然后搜索它!调出浏览器调试工具的全局搜索功能,输入context_kw,打车。然后在搜索结果中寻找有用的信息,例如:在JavaScript代码中找到context_kw,关键信息是.context_kw+i+_0xea12('0x2c')。代码也有点乱!在这里,手读JavaScript代码。第一段,也就是977行代码原文如下:var_0xa12e=['appendChild','fromCharCode','ifLSL','undefined','mPDrG','DWwdv','styleSheets','addRule','::before,'.context_kw','::before{content:\x20\x22','cssRules','pad','clamp','sigBytes','YEawH','yUSXm','PwMPi','pLCFG','ErKUI','OtZki','prototype','endWith','test','8RHz0u9wbbrXYJjUcstWoRU1SmEIvQZQJtdHeU9/KpK/nBtFWIzLveG63e81APFLLiBBbevCCbRPdingQfzOAFPNPBw4UJCsqrDmVXFe6+LK2CSp26aUL4S+AgWjtrByjZqnYm9H3XEWW+gLx763OGfifuNUB8AgXB7/pnNTwoLjeKDrLKzomC+pXHMGYgQJegLVezvshTGgyVrDXfw4eGSVDa3c/FpDtban34QpS3I=','enc','Latin1','parse','window','location','href','146385F634C9CB00','decrypt','ZeroPadding','toString','split','length','style','type','setAttribute','async','getElementsByTagName','NOyra','fgQCW','nCjZv','parentNode','insertBefore','head'];(函数(_0x4db306,_0x3b5c31){var_0x24d797=函数(_0x1ebd20){while(--_0x1ebd20){_0x4db306['推'](_0x4db306['转移']());}};如果你往下读,你还可以看到CryptoJS这个词。看了应该知道代码中用到了一些加解密操作。第二节,1133行代码如下:for(vari=0x0;i
大家好,我是闲鱼,我是NightTeam
的一员,然后设置q标签的样式:q::before{content:"?";颜色:蓝色;}q::after{内容:“?”;color:red;}完整代码如下(针对没有HTML基础的朋友):