记一次Discuz反反爬虫的经历

昨天做的出“Loc邀请人查询网站”,后台爬虫每10s访问一次hostloc,但是因为太频繁了,因此触发了discuz的反爬虫机制。

discuz的反爬虫机制基本上就是,你访问网站,然后内容返回一段js内容,如果是正常的浏览器,自然是可以顺利验证通过,如果是爬虫,除非是headless浏览器,否则就只能去分析js了。

初级反爬虫&反反爬虫

一开始discuz的反爬虫,验证的内容很简单

<html>
<body>
    </script><noscript><h1 style="text-align:center;color:red;"><strong>Please turn JavaScript on and reload the page.</strong></h1></noscript>
    <script>
        document.cookie = "L7FW=2b5b96b9100d06a0850dcf1a8d9c14cb; path=/";
        location.href = "https://www.hostloc.com/?d=1";
    </script>
</body>
</html>

看到没有,无非就是设置一个cookies,然后跳转到特定的链接。用Python处理的话也很简单。

import requests
import re

url='https://www.hostloc.com'
session=requests.Session()
r=session.get(url)

if len(re.findall('document.cookie=".*?";',r.text))>0:
    rcookies=re.findall('document.cookie="(.*?)";',r.text)[0]
    cookies={}
    for kv in rcookies.split(';'):
        k,v=kv.strip().split('=',1)
        cookies[k]=v
        session.cookies.set(**cookies)
if len(re.findall('location.href="(.*?)";',r.text))>0:
    redirect_url=re.findall('location.href="(.*?)";',r.text)[0]
    if not redirect_url.startswith('https://'):
        redirect_url=home+redirect_url
    r=session.get(redirect_url)
print(r.text)

要点提示:

必须用requests.Session()。至于原因,想象一下,你开着Chrome浏览器登录了一个网站,再用Firefox访问这个网站时是登录状态吗?

高级反爬虫&&高级反反爬虫

用了上面的方法,继续爬了半天的数据,然后爬虫又出问题了。打印出内容一看

<html>

<body>
    <script type="text/javascript" src="/aes.min.js"></script><noscript><h1 style="text-align:center;color:red;"><strong>Please turn JavaScript on and reload the page.</strong></h1></noscript>
    <script>
    function toNumbers(d) { var e = [];
        d.replace(/(..)/g, function(d) { e.push(parseInt(d, 16)) }); return e }

    function toHex() { for (var d = [], d = 1 == arguments.length && arguments[0].constructor == Array ? arguments[0] : arguments, e = "", f = 0; f < d.length; f++) e += (16 > d[f] ? "0" : "") + d[f].toString(16); return e.toLowerCase() }
    var a = toNumbers("2b5b96b9100d06a0850dcf1a8d9c14cb"),
        b = toNumbers("ce4873ff28d9d18d8d4f31e94470db34"),
        c = toNumbers("158b191e59dc44701bac485da7b29143");
    document.cookie = "L7FW=" + toHex(slowAES.decrypt(c, 2, a, b)) + ";  path=/";
    location.href = "https://www.hostloc.com/?d=1";
    </script>
</body>

</html>

好嘛....对cookies进行了加密。

这个时候怎么办?

  1. 分析js。如果你有兴趣可以去看看这个js的内容:https://www.hostloc.com/aes.min.js
  2. 使用selenium

在成本最小的条件下,无疑是使用selenium最方便。

准备环境

#下载并解压chromedriver
wget https://chromedriver.storage.googleapis.com/2.44/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
#安装Xvfb。linux环境使用无界面浏览器依赖
yum install Xvfb
#安装google-chrome
curl https://intoli.com/install-google-chrome.sh | bash
#安装python依赖包
pip install requests selenium PyVirtualDisplay

用法

import requests
import re
from selenium import webdriver

url='https://www.hostloc.com'
session=requests.Session()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome(executable_path='path of chromedriver',chrome_options=chrome_options)

r=session.get(url)
if len(re.findall('document.cookie="L7FW=.*',r.text))>0:
    self.driver.get(url)
    cookie=driver.get_cookies()
    session.cookies=requests.utils.cookiejar_from_dict(cookie)
    r=session.get(url)
print(r.text)

这里就是当遇到验证时,使用chrome headless访问一次网站,获取到cookies,然后给session补上cookies。

终极反反爬虫&我能怎么办?

使用上面的方法,爬虫又稳定运行了十几分钟,然后又出问题了!!!

这回是怎么回事??

直接超时了!!??

直接给我ban了ip!!

当然,解决办法也是有的,那就是使用代理ip。但是我觉得没必要为了一个临时起意做的网站花费更多的精力和财力在这里。

最终,Loc邀请人查询网站可能要卒啦!

本文作者:Abbey

本文链接:https://www.abbeyok.com/archives/206

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

【loc新注册用户邀请人】查询网站-已下... <<
0 条评论

请先登陆注册

已登录,注销 取消