作者:掌控安全-暗箭
目录
本章亮点:
创建自己的代理池提供批量爬取代理思路 及 方法解决代理利用率低问题 o( ̄▽ ̄)o这两天想摆脱一阵电脑,所以就赶紧回老家,体验下无忧无虑的田园生活o( ̄┰ ̄*)ゞ。
某次看到群里的小伙伴们
在抱怨渗透某些网站时 自己的IP莫名其妙的就被禁封掉了。
这对刚刚接触渗透测试的新学员来说,挺让人无奈的。
因为这些问题总是无法避免的:
没有代理可循。代理可用性低手动单个测试代理IP是否可用(耗时费力)。没有代码功底,不知如何创建代理池所以,我决定来研究一下如何从0开始创建自己的代理池,
并把我的心得分享给你们
希望你们在渗透的道路上畅通无阻(记得遵纪守法哦( ̄▽ ̄)”)
先来插一一句话,本篇文章以照顾新手为主,讲的比较慢,大佬们可以直接下滑到底部下载我的源码,进行修改哦~
我刚来到学院的时候听到代理池一词,是完全蒙B的,只能想象到这可能是一个有很多代理IP的东东 总之感觉好复杂好高级的样子。
但是现在我告诉你们,只需要短短几十行代码,你也能创造出属于自己的代理池,是不是内心的恐惧就消失了一半了呢。
我们是基于爬虫基础上进行代理池创建的,
所以我们要对爬虫的节点选择要有一些了解,
并且找到一个或多个提供免费代理的网站
我们是基于爬虫基础上进行代理池创建的
如果对爬虫节点的选择没有了解,也没关系,本章会介绍部分节点选择的方法
一.寻找提供免费代理的网站
因为没钱所以我们要白嫖,因为没钱所以我们还要多写几行代码~
1.百度一下:免费代理(随便选个妃子)
我们看到这个网站还是很友好的,但是我用的是它的友情链接(小幻代理),89代理就留给你们练手吧
2.找到代理网战,我们就要分析他的前端代码,实施虫术,爬取IP和PORT
(1.)确定IP节点:
将鼠标随机放到一个IP上 直接右键->检查 我们就可以找到IP对应的节点了。
(2.)确定PORT节点方法同上
我们分析一下:
<tr>看作祖节点<td>父节点<a>子节点<tr>节点下有许许多多的子节点<td>,而IP位于第一个<td>节点中的<a>节点中,也就是<tr>节点的孙节点其中<a>节点有一个target属性 他的值为 “_blank” 这个可以更方便我们去定位此节点PORT是位于第二个<td>节点上 也就是第一个<td>的兄节点分析完之后我们就开始构建脚本吧
我们先来调用要用到的模块:
import requests fro这两个库没有安装的小伙伴可以先安装一下,我记得安装起来应该挺简单的
为什么不用selenium库呢?
虽然selenium库极其强大,但是用于创建代理池就有点小题大做了,而且运行起来也没有这两个库运行的快,安装起来也比较麻烦一点
然后我们要发送请求,构造Xpath解析对象
我们将这些操作都放到一个函数中去
def get_url(): url =?page=b97827cc html = requests.get(url).text html = etree.HTML(html)这样就够建好了html为解析对象
再根据我们前面分析的节点,用Xpath规则去筛选我们想要的文本:
result = html.xpath(//td[2]/text()) result2 = html.xpath(//td/a[@target="_blank"]/text())//td/a[@target=”_blank”]/text() 选中<td>节点下 target属性为_blank的子节点<a>,text()获取其文本 则result2 = “我们需要的IP”
//td[2]/text() 选择第二个<td>节点,获取文本内容 resul = “端口”
接下来就需要将爬取的内容遍历出来(我是保存到一个txt文本当中):
for a,b in zip(result2,result): PORT = b IP = a DL =(a +:+b) with open (DL.txt,a)as f: f.write(DL +"\n")DL = “IP”:”PORT” 格式
运行后生成的文本内容为这个样子:
但是这样远远不能满足我们的需求,我们不能只爬取这一页的代理,所以我们要改一下函数,我以前三页为例。
lists =[5crfe930,4ce63706,b97827cc] def get_url(page): url =?page=+ page html = requests.get(url).text html = etree.HTML(html) result = html.xpath(//td[2]/text()) result2 = html.xpath(//td/a[@target="_blank"]/text()) for a,b in zip(result2,result): PORT = b IP = a DL =(a +:+b) with open (DL.txt,a)as f: f.write(DL +"\n")这里引用了lists列表,简单的循环三次请求,分别请求前三页的网址。因为page后的值被加密了 短时间内很难找到规律。
不过当我们调用动态渲染的话(selenium库)就可以完美解决这个问题了,即可实现无视加密 放肆抓取的效果。
这里我就偷个懒了,0基础的萌新也很难看懂selenium库的使用,
所以为了提高效率 我干脆用这种最直白的方法给你们爬一下。
当我们拥有大量IP代理的时候 我们还要确认这里面有哪些IP可以正常为我们所用。
于是我们还要写一个验证函数:(因为穷,所以要写/(ㄒoㄒ)/~~):
def check(DL): url =http://%s% DL.rstrip() try: result = requests.get(url,timeout=5) print(DL +"代理可用") except: print(代理不可用)这样子就很舒服啦,我们设置一个发送一个请求,
如果请求超时5秒,那么直接回显此代理不可用,
如果5秒内请求成功,那么则证明此代理可用,并且将可用代理回显出来。
这里也可以用状态码(status_code)来进行验证 比较好用,
我嫌麻烦懒得那么写了,
因为并不是只有状态码为[200]的代理可用 其实[400]的也可以用。
最后一步就是写个循环 将用到的函数都循环进去,当然你也可以main()函数,将用到的函数包含进去。
for i in lists: get_url(i) with open(DL.txt,r)as F: Str= F.readlines() for DL inStr: check(DL)将lists中的page遍历到url中去,你列表写的越多,爬取的页面也就越多。
然后我们爬取的代理都会存放到与脚本的同目录下,DL.txt
将代理从文本中遍历到check()函数中去
所以最终的代码是这个样子的:
import requests from lxml import etree def get_url(page): url =?page=+ page html = requests.get(url).text html = etree.HTML(html) result = html.xpath(//td[2]/text()) result2 = html.xpath(//td/a[@target="_blank"]/text()) for a,b in zip(result2,result): PORT = b IP = a DL =(a +:+b) with open (DL.txt,a)as f: f.write(DL +"\n") def check(DL): url =http://%s% DL.rstrip() try: result = requests.get(url,timeout=5) print(DL +"可用") except: print(不可用) lists =[5crfe930,4ce63706,b97827cc] for i in lists: get_url(i) with open(DL.txt,r)as F: Str= F.readlines() for DL inStr: check(DL)然后我们来执行一下:
只要显示出的IP基本都是可以用的 而且还是很快的那种
可用代理有很多,我就截一张图好啦
其实写这个脚本的时候碰到很多的坑 pyquery,bs4,selenium,Xpath这些库我都用过,最后还是筛选出Xpath最适用这个脚本。
而且在遍历的时候也碰到很多的坑,没得老师问 自己尝试 还是挺痛苦的。
幸运的是苦尽甘来,大家在爬取代理的时候可以选择多个代理网站同时爬取,只不过多写两个差不多一样的函数罢了。
以用有时间了 也可以尝试配合代理池写个自动SQL注入给大家呀 ~这样老师再也不用但心我们找不到漏洞了
代理池源码已打包
链接:https://pan.baidu.com/s/11BNXV2kLMGzS-py8kfv2kw
提取码:zkaq