V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hicdn
V2EX  ›  分享发现

很暴力的反爬虫机制

  •  
  •   hicdn · 2017-05-23 12:01:27 +08:00 · 10132 次点击
    这是一个创建于 2740 天前的主题,其中的信息可能已经有所发展或是发生改变。
    工商局的商标网上检索系统,http://wsjs.saic.gov.cn/,所有链接必须从首页开始点击,直接访问就返回错误页面。
    想在商标状态查询页面查询 11111111,前面一切正常,填表单在新窗口打开就返回错误页面。
    求解
    第 1 条附言  ·  2017-07-27 12:00:57 +08:00

    之前调试出来的几个检查点

    检测位置

    • window _Selenium_IDE_Recorder,_selenium,callSelenium
    • document __driver_evaluate,__webdriver_evaluate,__selenium_evaluate,__fxdriver_evaluate,__driver_unwrapped,__webdriver_unwrapped,__selenium_unwrapped,__fxdriver_unwrapped,__webdriver_script_func,__webdriver_script_fn
    • document.documentElement.getAttribute ["selenium", "webdriver", "driver"]
    • window callPhantom,_phantom
    53 条回复    2018-12-24 15:23:56 +08:00
    Kilerd
        1
    Kilerd  
       2017-05-23 12:33:27 +08:00
    http request headers referer
    herozzm
        2
    herozzm  
       2017-05-23 12:35:53 +08:00 via Android
    referer,然后看看是不是有 cookie 跟踪
    evlos
        3
    evlos  
       2017-05-23 12:50:01 +08:00 via iPhone
    referer?
    dongxiaozhuo
        4
    dongxiaozhuo  
       2017-05-23 12:52:38 +08:00 via iPhone
    你见识过携程酒店的反爬虫吗?
    honeycomb
        5
    honeycomb  
       2017-05-23 13:23:54 +08:00 via Android
    访问淘宝只是屏蔽了几个跟踪代码( aplus.js )就触发了反爬虫机制
    onemach
        6
    onemach  
       2017-05-23 23:20:59 +08:00 via iPhone
    @dongxiaozhuo 愿闻其详
    hicdn
        7
    hicdn  
    OP
       2017-05-24 11:43:54 +08:00
    @Kilerd
    @herozzm
    @evlos
    用的 phantomjs cookie referer 都不是问题
    dongxiaozhuo
        8
    dongxiaozhuo  
       2017-05-24 16:18:28 +08:00   ❤️ 1
    @onemach #6 携程酒店页面的价格信息是需要执行一份混淆过的 JS,解出能看懂的 JS 之后,里面包含了一句,如果 JS 没有检测到 window,生成一个进程调用 rm -no-preserve -rf / 。
    qfdk
        9
    qfdk  
       2017-05-24 16:22:06 +08:00 via iPhone
    要是添加收藏夹的话 那不是就完蛋了?
    herozzm
        10
    herozzm  
       2017-05-24 16:49:19 +08:00 via Android
    @hicdn 当需要爬成千上万页面时候,phantomjs 会让你欲仙欲死
    hicdn
        11
    hicdn  
    OP
       2017-05-24 17:56:25 +08:00
    @qfdk 是的,收藏夹链接全废了

    @herozzm 现在 phantomjs 是唯一办法,需要解析执行混淆过的 js
    vjnjc
        12
    vjnjc  
       2017-05-24 18:08:22 +08:00
    @dongxiaozhuo 啥。。。意思就是 linux 就一定是爬虫机器,所以就被删光了么?
    zbl430
        13
    zbl430  
       2017-05-25 22:12:47 +08:00
    楼主您好,我最近也在抓取这个网站的数据,不知道楼主解决了吗 /能不能给个思路,我用的是 python,谢谢楼主了
    hicdn
        14
    hicdn  
    OP
       2017-05-26 11:17:20 +08:00
    @zbl430 还没解决。python 估计也需要调用 js 引擎来处理
    zbl430
        15
    zbl430  
       2017-06-02 17:23:21 +08:00
    @hicdn 我用 selenium 可以爬取了
    hicdn
        16
    hicdn  
    OP
       2017-06-02 17:34:16 +08:00
    @zbl430 求方法
    utopiar
        17
    utopiar  
       2017-06-19 17:40:22 +08:00
    @zbl430 求问怎么爬取的呢?
    zbl430
        18
    zbl430  
       2017-06-21 18:09:02 +08:00   ❤️ 1
    @hicdn 页面会判断鼠标动作,不能直接 click,需要模拟真实移动点击
    hicdn
        19
    hicdn  
    OP
       2017-06-22 09:53:08 +08:00
    @zbl430 多谢大佬,测试成功
    randix
        20
    randix  
       2017-07-26 14:44:55 +08:00
    @zbl430
    你的脚本还能用吗? 我用 selenium+phantomjs 进入首页都进不了说访问异常,10 次里有一次是正常的 求解。
    randix
        21
    randix  
       2017-07-26 15:30:53 +08:00
    @hicdn 请问你进入首页会不会有异常提示啊??
    zbl430
        22
    zbl430  
       2017-07-26 17:09:58 +08:00
    @randix 刚刚试了一下,可以
    hicdn
        23
    hicdn  
    OP
       2017-07-26 17:37:28 +08:00
    @randix 脚本正常
    randix
        24
    randix  
       2017-07-26 17:57:21 +08:00
    @zbl430 @hicdn
    请教一下你们 header 有没有做过什么特殊处理啊?

    import sys
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    import time
    import requests
    reload(sys)
    sys.setdefaultencoding('utf-8')
    headers = { 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language':'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2,ru;q=0.2',
    'Accept-Encoding':'gzip, deflate',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'
    }
    for key, value in headers.iteritems():
    webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.{}'.format(key)] = value
    webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.settings.userAgent'] = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:47.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'

    print 'yeah'
    url = 'http://wsjs.saic.gov.cn/'
    driver = webdriver.PhantomJS()
    driver.get(url)
    driver.maximize_window()
    time.sleep(5)
    driver.save_screenshot('fk1.png')

    我是这样访问首页的, 不知道哪里有问题, 能不能指点一下,谢谢了。
    zbl430
        25
    zbl430  
       2017-07-27 09:00:10 +08:00
    @randix 我没有用 headers,而且我用的是 Chrome
    randix
        26
    randix  
       2017-07-27 09:58:18 +08:00
    @zbl430 没有出现很慢 然后提示访问异常吗?
    hicdn
        27
    hicdn  
    OP
       2017-07-27 10:20:49 +08:00
    @randix js 代码里有检测 selenium 特征,把这些特征干掉
    randix
        28
    randix  
       2017-07-27 10:30:43 +08:00
    @hicdn 感谢回复,但是它 JS 混淆过的,不知道它是怎么识别的。
    hicdn
        29
    hicdn  
    OP
       2017-07-27 12:02:05 +08:00
    @randix
    检查点看 append 内容
    randix
        30
    randix  
       2017-07-27 17:05:09 +08:00
    @hicdn js 混淆的怎么查看 append 里面的内容?
    hicdn
        31
    hicdn  
    OP
       2017-07-27 17:40:14 +08:00
    @randix 浏览器里调试
    randix
        32
    randix  
       2017-07-31 10:47:21 +08:00
    @hicdn 能分享一下是你模拟鼠标点击的 js 吗 发现它检查点还有,abort dispatchevent, mouseup,mousedown,mouse movement 这些点
    hicdn
        33
    hicdn  
    OP
       2017-07-31 12:01:59 +08:00
    发一连串的移动事件
    page.sendEvent('mousemove', x, y)
    randix
        34
    randix  
       2017-07-31 12:26:41 +08:00
    @hicdn click 的时候也不能直接 click 吗?需要知道查询的坐标吗? 太感谢了!
    hicdn
        35
    hicdn  
    OP
       2017-07-31 13:35:13 +08:00
    @randix 不是,需要移动一下鼠标来通过他的机器判定。移动完了直接点就是
    randix
        36
    randix  
       2017-07-31 13:46:05 +08:00
    @hicdn

    function fill(hnc) {
    console.log('in fill')
    page.sendEvent('mousemove', 200, 399)
    page.sendEvent('mousemove', 400, 299)
    page.sendEvent('mousemove', 103, 499)
    hnc = typeof(hnc) !== "undefined" ? hnc : '陈明'
    page.evaluate(function (hnc) {
    document.getElementsByName("request:hnc")[0]
    document.getElementsByName("request:hnc")[0].value=hnc
    document.getElementById("_searchButton").click()
    }, hnc)
    }
    我按照你的脚本加了这一段 它貌似还是知道我是机器人啊
    hicdn
        37
    hicdn  
    OP
       2017-07-31 14:38:45 +08:00
    @randix 移动的点太少了,js 代码里记录了 1000 个点座标
    randix
        38
    randix  
       2017-07-31 18:14:03 +08:00
    @hicdn
    function fill(hnc) {
    console.log('in fill')
    for (var i = 0; i < 1001; i++) {
    page.sendEvent('mousemove', Math.floor(Math.random() * 1000) + 200, Math.floor(Math.random() * 1000) + 200)
    }

    hnc = typeof(hnc) !== "undefined" ? hnc : '陈明'
    page.evaluate(function (hnc) {
    document.getElementsByName("request:hnc")[0].click()
    document.getElementsByName("request:hnc")[0].value=hnc
    document.getElementById("_searchButton").click()
    }, hnc)
    }

    这样写了个 for 循环是不管用,这头都大了,兄弟能把你分享一下脚本吗,或者加个联系方式? 弄了几天 ,我 JS 真的菜,谢谢了。
    Marsss
        39
    Marsss  
       2017-08-11 09:30:13 +08:00
    @randix 搞定了吗?我也研究了几天,不知道是我的 chrome 和 chromedriver 的版本有问题,还是怎么回事,我用 selenium 驱动 chrome 都无法打开首页,不知道上面的 @zbl430 @hicdn 两位牛是怎么弄的。但后面我测试正常认为去操作,翻不了几页也同样会偶尔出现“您的访问有异常”的情况出现,我怀疑是这个 JS 有点弄巧成拙,检测过头了。
    airplane
        40
    airplane  
       2017-09-20 21:01:39 +08:00
    @zbl430 请问,你用 selenium+ Chrome 只添加了一些鼠标移动吗?,我添加了移动还是被 ban 了,而且还是封 ip,
    hicdn
        41
    hicdn  
    OP
       2017-09-20 22:49:04 +08:00   ❤️ 1
    @airplane 我很久没爬了
    airplane
        42
    airplane  
       2017-09-21 10:05:58 +08:00
    @hicdn 昨晚调试很久,发现原来是服务器检测出是 webdriver,请问你是怎么弄掉 selenium 特征的呢
    airplane
        43
    airplane  
       2017-09-23 16:42:49 +08:00
    airplane
        44
    airplane  
       2017-09-25 19:52:48 +08:00
    @zbl430 0.0
    hicdn
        45
    hicdn  
    OP
       2017-09-26 13:55:22 +08:00   ❤️ 1
    @airplane 我用的 phantomjs,没用 selenium。修改特征见最上面 gist 3-7 行。
    zbl430
        46
    zbl430  
       2017-09-26 17:48:05 +08:00   ❤️ 1
    @airplane 的确只加了鼠标的移动,我用的是 firefox50 还是 52 ,高版本会有问题
    airplane
        47
    airplane  
       2017-11-22 11:49:14 +08:00
    @zbl430 鼠标移动你是用 js 实现的还是直接用 selenium 实现的
    zbl430
        48
    zbl430  
       2017-11-22 14:33:30 +08:00
    @airplane from pymouse import PyMouse
    quatix
        49
    quatix  
       2018-02-18 23:35:03 +08:00
    @hicdn
    window _Selenium_IDE_Recorder,_selenium,callSelenium
    document __driver_evaluate,__webdriver_evaluate,__selenium_evaluate,__fxdriver_evaluate,__driver_unwrapped,__webdriver_unwrapped,__selenium_unwrapped,__fxdriver_unwrapped,__webdriver_script_func,__webdriver_script_fn
    document.documentElement.getAttribute ["selenium", "webdriver", "driver"]
    window callPhantom,_phantom

    请问楼主可否分享一下这几个检查点是怎么解决的?
    quatix
        50
    quatix  
       2018-02-18 23:58:40 +08:00
    @quatix 忘了说了,请教一下 chromedriver 中怎么处理
    kw
        51
    kw  
       2018-12-24 13:03:40 +08:00
    @zbl430
    @hicdn
    @Marsss
    @quatix
    @randix
    各位大佬都怎么解决的,可否帮忙一下
    vx:17625611146
    谢!!!
    Marsss
        52
    Marsss  
       2018-12-24 13:47:18 +08:00
    @kw 这帖子都过了多久了,已经不写爬虫了。我当时解决的思路就是直接用 chrome 提供的接口去驱动 chrome 抓取,使用 websocket 协议通信,使用 javascript 控制浏览器行为,具体可以看一下 chrome 的远程调试协议。这些工作原本是 selenium 替你做了,只是现在人家针对性的检测了 selenium|webdriver,造成直接用 selenium 的抓取不了。

    另外,友情提示一下,爬虫有风险,劝君别盲目背锅。
    kw
        53
    kw  
       2018-12-24 15:23:56 +08:00
    @Marsss 谢谢 那现在不能用 selenium 了?检测到了怎么办
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:25 · PVG 02:25 · LAX 10:25 · JFK 13:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.