猥琐方法获取防爬虫网页源码
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.确认保存
中间加入一些缓冲时间。
代码如下:(这里因为楼主电脑使用了搜狗输入法,所以需要发送两个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了。但这种简单的方法其实是可以用到很多地方的,发挥你的想象力。好了,可以交作业了,见笑。
最近在整理一些搜索引擎的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')
使用前,可以手动保存选择一下想保存的路径,虽然也可以使用python实现。这样我们就获取了源码,后面使用soup或者re来获取url就不愁找不到想要的信息了。楼主电脑很破,上面打开chrome以及其他缓冲时间都设置的有些许长,可以根据主机性能设置。
运行这个脚本需要Python for Windows Extensions,你可以在这里找到:
https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/
装了之后,你就可以用python写一些类似vbs的脚本了。
0x04 小结
以上分享了一个模拟键盘的方法,来获取网页源码源码。演示代码,比较丑陋。优点:轻松绕过所有防爬,实现原理简单,不需要注册api,也不需要登录。缺点:程序运行时,不能乱动键盘和鼠标,实现技术太不hacker了。但这种简单的方法其实是可以用到很多地方的,发挥你的想象力。好了,可以交作业了,见笑。
评论33次
厉害了,过来学xi了
爬出来源码,可以辅助渗透测试,算是信息收集的必要吧!
已经很不错了,楼主的方法,简单粗暴直接,我喜欢
效率问题是主要问题,如果只有几百个还好,几千个就太慢了
这个。。。。既然不要求速度,你用python或php去抓的时候sleep下不也可以吗
思路不错 更高级一点可以用splinter 直接spwan浏览器 基本无视所有防爬虫
貌似效率不高啊!
学xi了
感觉瓶颈还是速度和流量限制,要是能应付google并且速度还不错,那就更好了
.....还以为是什么奇技淫巧。几年前博客园就看到过类似的了。也对 土司码农少,这方面的技术文章很少的。谢谢楼主分享
这个思路确实比较好,以前虽然想过,但是没想到python和浏览器通讯这么方便
这样很慢的吧。我用的selenium+Firefox,貌似可以。直接用selenium模拟点击等操作。
这个好
嗯 如果是对付普通网站 效率确实会不好 不过 如果是作为搜索引擎的源码采集 则不会是一个问题 上面有些同学也提到了 搜索引擎是会限制访问频率的 你想快都快不了 比如谷歌 同一个IP基本上需要平均缓冲2分钟左右才能进行大批量采集 不然就容易出现验证码 如果觉得占用资源太多 又不需要js文件的话 那么就不要直接模拟ctrl+s 可以 ctrl+u-->ctrl+a-->ctrl+s-->ctrl+w这样只会保持源码内容。 另外这两天继续研究了一下谷歌远程调试协议 找到了获取源码的协议方法 同样是不惧任何防爬 等同于devtools 那个效果就高级多了 以后另外分享一下 这个帖子也就是开拓一下思路 没什么讨论的价值 谢谢大家 管理可以结贴了
嗯 也是担心效率...
selenium效率太低 本身不适合做爬虫. 针对单一网址进行采集,最好的方案就是分析前端的验证机制. 或许你可以尝试下pyV8.
猥琐模仿按键精灵,思路不错。
如果量级小的花 这个方法可以 但量级大的话 会比较慢
还是有点问题的,就是google类似搜索引擎会限制每小时的查询总量。 一般用户感觉不大,但是对于爬虫来说,频繁的被封IP就很难受了
直接模拟点击,目前来看是个猥琐的网爬虫方法,以后得从根上下手。
这样很慢的吧。 我用的selenium+Firefox,貌似可以。 直接用selenium模拟点击等操作。