猥琐方法获取防爬虫网页源码

2016-08-15 15:15:09 33 10010
0x00 引言
最近在整理一些搜索引擎的python脚本时,发现现在有很多引擎都不能直接通过urllib或者requests库来获取了,因为有很多网页采取了动态js以及防爬虫的措施,比如bing、zoomeye,虽然他们都提供了api来给你用,但还是有些不爽,比如bing限制了一个月5000条,zoomeye是只显示100条。那么这样就能拦住我们这些脚本小子了?那我们和普通网民有什么区别,不行,总得想想办法。

0x01 思路
楼主还是想过一些高大上的方法的,比如selenium加phantomjs,楼主试了,他能对付必应,但还是被zoomeye拦截了。于是楼主换成了selenium加chrome,发现还是不行,我凑。后来发现selenium这些包均是利用了chrome remote debugging protocol协议和浏览器通讯,于是尝试直接使用这个协议来操作浏览器,有兴趣的可以网上搜索相关关键词。大概原理是这样的:
1.开启chrome debug模式 .\chrome --remote-debugging-port=9222
2.使用chrome remote debugging protocol里提供的方法来和浏览器通讯
3.通讯协议使用websocket
经过以上尝试,楼主只研究到了打开一个网址的地方,后续会继续琢磨一下,搞好了再来分享,这里先分享一个猥琐的方法:
我们都知道,手工获取源码是非常简单的,crtl+s就完事了。。。不管你什么措施,除非你不想让浏览器打开,就算你以后防止浏览器打开源码,我们还有devtools,你也想防吗?那么好的,我们来模拟键盘完成这个程序,其实这个用vbs实现很简单,不过楼主python习惯了,还是用这个吧。

0x03 实现
模拟步骤:
1.打开chrome
2.打开网址
3.ctrl + s
4.输入保存文件名
5.确认保存
中间加入一些缓冲时间。
代码如下:
import win32com.client
import webbrowser
import time

def get_source(search_key):
        search_words = search_key
        file_list = []
        shell = win32com.client.Dispatch("WScript.Shell")
        shell.run("chrome.exe",1)
        time.sleep(5)
        shell.AppActivate("chrome.exe")
        for x in range(1,3):
                url = 'https://www.zoomeye.org/search?q=%s&t=host&p=%s' % (search_words,x)
                filename = "mytest_%s.html" % x
                webbrowser.open(url)
                time.sleep(5)
                shell.SendKeys("^s")
                time.sleep(1)
                shell.SendKeys(filename)
                time.sleep(0.5)
                shell.SendKeys("~")
                time.sleep(0.5)
                shell.SendKeys("~")
                time.sleep(2)
                file_list.append(filename)
        return file_list

if __name__ == '__main__':
        get_source('ftp idc')
(这里因为楼主电脑使用了搜狗输入法,所以需要发送两个enter键,一个是确认输入,一个是确认保存,如果你的输入法不需要确认输入,就删掉一个。然后chrome设置为默认浏览器,并将chrome.exe路径加入path)
使用前,可以手动保存选择一下想保存的路径,虽然也可以使用python实现。这样我们就获取了源码,后面使用soup或者re来获取url就不愁找不到想要的信息了。楼主电脑很破,上面打开chrome以及其他缓冲时间都设置的有些许长,可以根据主机性能设置。
运行这个脚本需要Python for Windows Extensions,你可以在这里找到:
https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/
装了之后,你就可以用python写一些类似vbs的脚本了。

0x04 小结
以上分享了一个模拟键盘的方法,来获取网页源码源码。演示代码,比较丑陋。优点:轻松绕过所有防爬,实现原理简单,不需要注册api,也不需要登录。缺点:程序运行时,不能乱动键盘和鼠标,实现技术太不hacker了。但这种简单的方法其实是可以用到很多地方的,发挥你的想象力。好了,可以交作业了,见笑。

关于作者

w0lfeye2篇文章9篇回复

评论33次

要评论?请先  登录  或  注册
  • 13楼
    2016-8-16 01:07

    感觉这种方法唯一的问题就是效率不够高,而且占用资源比较多。

  • 12楼
    2016-8-15 19:47
    三文kit

    不错,用来做爬虫只是其中一个方面,看起来还有很多好玩的用途

    1
    w0lfeye

    上周有个朋友 他说windows自带的画图工具打开图片后直接保存 图片会变小 但是并不会明显的变得不清晰 如果能自动批量完成这个过程就好了 他有很多图片要这样处理 我网上搜索了一下 貌似是因为微软的算法比较好的原因 才会有这样的效果 于是 我也用模拟键盘的方法 给他写了一段脚本 实现自动批量 哈哈 挺好玩的 网上有类似的代码 但不能直接用 需要修改

    2

    虽然程序实现是个好事情,但是有现成的工具的:2345图片查看是用有这个功能的,可以批量,用的也是windows的功能

  • 11楼
    2016-8-15 19:40

    我原来用 autoit+ie 。 autoie 可以在后台调用ie 创建看不到的ie窗口,访问网址,等待加载完毕,读取当前源码 然后 就一切搞定了。

  • 10楼
    2016-8-15 18:22

    selenium直接就可以模拟点击和发送值

  • 9楼
    2016-8-15 17:19

    这样子会比较慢吧

  • 8楼
    2016-8-15 17:13
    三文kit

    @w0lfeye 可以模拟鼠标点击么?给出指定的(x,y)坐标,模拟鼠标发生点击事件?

    1
    w0lfeye

    可以的 之前在学xi的时候 搜到相关的资料 鼠标 键盘都可以模拟 尽量用键盘实现 比较好 你需要的话 去搜搜一下 python 模拟键盘 或者vbs 模拟键盘

    2

    ok,这样很多工作都可以用python脚本自动化实现好了,而且无视前端的很多动态生成和混淆机制。

  • 7楼
    2016-8-15 17:08
    三文kit

    @w0lfeye 可以模拟鼠标点击么?给出指定的(x,y)坐标,模拟鼠标发生点击事件?

    1

    可以的 之前在学xi的时候 搜到相关的资料 鼠标 键盘都可以模拟 尽量用键盘实现 比较好 你需要的话 去搜搜一下 python 模拟键盘 或者vbs 模拟键盘

  • 6楼
    2016-8-15 17:04
  • 5楼
    2016-8-15 17:03

    @w0lfeye 可以模拟鼠标点击么?给出指定的(x,y)坐标,模拟鼠标发生点击事件?

  • 4楼
    2016-8-15 16:50
    三文kit

    不错,用来做爬虫只是其中一个方面,看起来还有很多好玩的用途

    1

    上周有个朋友 他说windows自带的画图工具打开图片后直接保存 图片会变小 但是并不会明显的变得不清晰 如果能自动批量完成这个过程就好了 他有很多图片要这样处理 我网上搜索了一下 貌似是因为微软的算法比较好的原因 才会有这样的效果 于是 我也用模拟键盘的方法 给他写了一段脚本 实现自动批量 哈哈 挺好玩的 网上有类似的代码 但不能直接用 需要修改

  • 3楼
    2016-8-15 16:32
    neag1e

    我明白楼主的想法了,普通的爬虫是使用程序模拟http请求获取返回来获得我们想要的数据,高级一点的爬虫会使用浏览器模拟库模拟浏览器浏览网页的方式来绕过反爬虫引擎,楼主这个直接是模拟人的点击事件了,使用真的浏览器去访问网页。不过好像用pyqt的QtWebKit就可以去爬zoomeye了

    1

    是的 这个有点简单粗暴 还是再看看怎么用chrome remote debug 来获取源码吧 那个就时和devtools差不多

  • 2楼
    2016-8-15 15:53

    我明白楼主的想法了,普通的爬虫是使用程序模拟http请求获取返回来获得我们想要的数据,高级一点的爬虫会使用浏览器模拟库模拟浏览器浏览网页的方式来绕过反爬虫引擎,楼主这个直接是模拟人的点击事件了,使用真的浏览器去访问网页。 不过好像用pyqt的QtWebKit就可以去爬zoomeye了

  • 1楼
    2016-8-15 15:42

    不错,用来做爬虫只是其中一个方面,看起来还有很多好玩的用途