【代理池入门】——搭建简单代理池

aj545302905   ·   发表于 3个月前   ·   技术文章投稿区

提示:想手写进阶代理池的大佬 请其阅读我的下一篇文章【代理池】只有无尽的跳转,没有封禁的IP!

本章亮点:

  • 创建自己的代理池
  • 提供批量爬取代理思路 及 方法
  • 解决代理利用率低问题 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>的兄节点

分析完之后我们就开始构建脚本吧

我们先来调用要用到的模块:

  1. import requests
  2. from lxml import etree

这两个库没有安装的小伙伴可以先安装一下,我记得安装起来应该挺简单的

为什么不用selenium库呢 虽然selenium库极其强大,但是用于创建代理池就有点小题大做了,而且运行起来也没有这两个库运行的快,安装起来也比较麻烦一点

然后我们要发送请求,构造Xpath解析对象

我们将这些操作都放到一个函数中去

  1. def get_url():
  2. url = 'https://ip.ihuan.me/address/5Lit5Zu9.html?page=b97827cc'
  3. html = requests.get(url).text
  4. html = etree.HTML(html)

这样就够建好了html为解析对象

再根据我们前面分析的节点,用Xpath规则去筛选我们想要的文本:

  1. result = html.xpath('//td[2]/text()')
  2. 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文本当中):

  1. for a,b in zip(result2,result):
  2. PORT = b
  3. IP = a
  4. DL = (a + ':' +b)
  5. with open ('DL.txt','a') as f:
  6. f.write(DL + "\n")

DL = “IP”:”PORT” 格式

运行后生成的文本内容为这个样子:

但是这样远远不能满足我们的需求,我们不能只爬取这一页的代理,所以我们要改一下函数,我以前三页为例。

  1. lists = ['5crfe930','4ce63706','b97827cc']
  2. def get_url(page):
  3. url = 'https://ip.ihuan.me/address/5Lit5Zu9.html?page=' + page
  4. html = requests.get(url).text
  5. html = etree.HTML(html)
  6. result = html.xpath('//td[2]/text()')
  7. result2 = html.xpath('//td/a[@target="_blank"]/text()')
  8. for a,b in zip(result2,result):
  9. PORT = b
  10. IP = a
  11. DL = (a + ':' +b)
  12. with open ('DL.txt','a') as f:
  13. f.write(DL + "\n")

这里引用了lists列表,简单的循环三次请求,分别请求前三页的网址。 因为page后的值被加密了 短时间内很难找到规律。
不过当我们调用动态渲染的话(selenium库)就可以完美解决这个问题了,即可实现无视加密 放肆抓取的效果。
这里我就偷个懒了,0基础的萌新也很难看懂selenium库的使用,所以为了提高效率 我干脆用这种最直白的方法给你们爬一下。

当我们拥有大量IP代理的时候 我们还要确认这里面有哪些IP可以正常为我们所用。

于是我们还要写一个验证函数:(因为穷,所以要写/(ㄒoㄒ)/~~):

  1. def check(DL):
  2. url = 'http://%s' % DL.rstrip()
  3. try:
  4. result = requests.get(url,timeout=5)
  5. print(DL + "代理可用")
  6. except:
  7. print('代理不可用')

这样子就很舒服啦,我们设置一个发送一个请求,如果请求超时5秒,那么直接回显此代理不可用,如果5秒内请求成功,那么则证明此代理可用,并且将可用代理回显出来。
这里也可以用状态码(status_code)来进行验证 比较好用,我嫌麻烦懒得那么写了,因为并不是只有状态码为[200]的代理可用 其实[400]的也可以用。

最后一步就是写个循环 将用到的函数都循环进去,当然你也可以main()函数,将用到的函数包含进去。

  1. for i in lists:
  2. get_url(i)
  3. with open('DL.txt','r') as F:
  4. Str = F.readlines()
  5. for DL in Str:
  6. check(DL)

将lists中的page遍历到url中去,你列表写的越多,爬取的页面也就越多。
然后我们爬取的代理都会存放到与脚本的同目录下,DL.txt
将代理从文本中遍历到check()函数中去

所以最终的代码是这个样子的:

  1. import requests
  2. from lxml import etree
  3. def get_url(page):
  4. url = 'https://ip.ihuan.me/address/5Lit5Zu9.html?page=' + page
  5. html = requests.get(url).text
  6. html = etree.HTML(html)
  7. result = html.xpath('//td[2]/text()')
  8. result2 = html.xpath('//td/a[@target="_blank"]/text()')
  9. for a,b in zip(result2,result):
  10. PORT = b
  11. IP = a
  12. DL = (a + ':' +b)
  13. with open ('DL.txt','a') as f:
  14. f.write(DL + "\n")
  15. def check(DL):
  16. url = 'http://%s' % DL.rstrip()
  17. try:
  18. result = requests.get(url,timeout=5)
  19. print(DL + "可用")
  20. except:
  21. print('不可用')
  22. lists = ['5crfe930','4ce63706','b97827cc']
  23. for i in lists:
  24. get_url(i)
  25. with open('DL.txt','r') as F:
  26. Str = F.readlines()
  27. for DL in Str:
  28. check(DL)

然后我们来执行一下:

只要显示出的IP基本都是可以用的 而且还是很快的那种

可用代理有很多,我就截一张图好啦

其实写这个脚本的时候碰到很多的坑 pyquery,bs4,selenium,Xpath这些库我都用过,最后还是筛选出Xpath最适用这个脚本。而且在遍历的时候也碰到很多的坑,没得老师问 自己尝试 还是挺痛苦的。

幸运的是苦尽甘来,大家在爬取代理的时候可以选择多个代理网站同时爬取,只不过多写两个差不多一样的函数罢了。

以用有时间了 也可以尝试配合代理池写个自动SQL注入给大家呀 ~

这样老师再也不用但心我们找不到漏洞了

PS:写文章好累 分享好快乐

用户名金币积分时间理由
奖励系统 100.00 0 2020-08-08 16:04:39 投稿满 10 赞奖励
奖励系统 50.00 0 2020-08-06 22:10:03 投稿满 5 赞奖励
Track-聂风 80.00 0 2020-08-06 19:07:18 加油~支持同学

打赏我,让我更有动力~

33 Reply   |  Until 3天前 | 768 View

zkzw990816
发表于 2个月前

来看看,风哥讲的

评论列表

  • 加载数据中...

编写评论内容

fenghua123
发表于 2个月前

谢谢大佬分享

评论列表

  • 加载数据中...

编写评论内容

marz13
发表于 2个月前

anjian nanfang 果然起名对事业有帮助

评论列表

  • 加载数据中...

编写评论内容

chenx
发表于 2个月前

可以增加一个多线程,单线程就比较麻烦,要一个一个的去验证。

评论列表

  • 加载数据中...

编写评论内容

weidong
发表于 2个月前

果然起名对事业有帮助

评论列表

  • 加载数据中...

编写评论内容

1554057597
发表于 2个月前

感觉挺厉害的 先留言看看隐藏附件

评论列表

  • 加载数据中...

编写评论内容

一岁时就很帅
发表于 2个月前

1

评论列表

  • 加载数据中...

编写评论内容

王灵
发表于 2个月前

e

评论列表

  • 加载数据中...

编写评论内容

羔羊
发表于 2个月前

厉害了

评论列表

  • 加载数据中...

编写评论内容

小黑飞了
发表于 2个月前

厉害

评论列表

  • 加载数据中...

编写评论内容

蝶舞恋冰
发表于 2个月前

牛逼大佬

评论列表

  • 加载数据中...

编写评论内容

1761012518
发表于 2个月前

tql

评论列表

  • 加载数据中...

编写评论内容

柠檬
发表于 2个月前

1111

评论列表

  • 加载数据中...

编写评论内容

盒子rex
发表于 2个月前

白嫖怪:我也要!

评论列表

  • 加载数据中...

编写评论内容

qmq287
发表于 2个月前

大佬nb

评论列表

  • 加载数据中...

编写评论内容

jimbo
发表于 2个月前

niu 牛,学习一下。

评论列表

  • 加载数据中...

编写评论内容

qq605198466
发表于 2个月前

谢谢大佬分享

评论列表

  • 加载数据中...

编写评论内容

j1tax
发表于 2个月前

学习了学习了

评论列表

  • 加载数据中...

编写评论内容

master666
发表于 2个月前

tql

评论列表

  • 加载数据中...

编写评论内容

zbzb456789
发表于 2个月前

厉害 厉害 学习到了

评论列表

  • 加载数据中...

编写评论内容
1 2 / 2 跳转 尾页
LoginCan Publish Content
返回顶部 投诉反馈

掌控者 © 2016. All Rights Reserved. 掌控者

Powered by 掌控者 Version 2.1.3