python扫描proxy并获取可用代理ip的实例


Posted in Python onAugust 07, 2017

今天咱写一个挺实用的工具,就是扫描并获取可用的proxy

首先呢,我先百度找了一个网站:http://www.xicidaili.com 作为例子

这个网站里公布了许多的国内外可用的代理的ip和端口

我们还是按照老样子进行分析,就先把所有国内的proxy扫一遍吧

点开国内部分进行审查发现,国内proxy和目录为以下url:

http://www.xicidaili.com/nn/x

这个x差不多两千多页,那么看来又要线程处理了。。。

老样子,我们尝试是否能直接以最简单的requests.get()获取内容

返回503,那么我们加一个简单的headers

返回200,成咯

好了我们先进行网页内容分析并获取想要的内容

我们发现,包含ip信息的内容在<tr>标签内,于是我们就能很方便的用bs进行获取标签内容

但是我们随之又发现,ip、端口、协议的内容分别在提取的<tr>标签的第2,3,6三个<td>标签内

于是我们开始尝试编写,一下为编写思路:

处理页面的时候,是先提取tr标签,再将tr标签中的td标签提取

所以运用了两次bs操作,并且第二次使用bs操作时需要进行str处理

因为我们获得tr之后,我们需要其中的2,3,6号的东西,

但是当我们用一个for循环输出的i并不能进行组的操作

所以我们干脆分别对每一个td的soup进行第二次操作之后直接提取2,3,6

提取之后,直接加上.string提取内容即可

r = requests.get(url = url,headers = headers)

 soup = bs(r.content,"html.parser")
 data = soup.find_all(name = 'tr',attrs = {'class':re.compile('|[^odd]')})

 for i in data:

  soup = bs(str(i),'html.parser')
  data2 = soup.find_all(name = 'td')
  ip = str(data2[1].string)
  port = str(data2[2].string)
  types = str(data2[5].string).lower() 

  proxy = {}
  proxy[types] = '%s:%s'%(ip,port)

这样,我们每次循环都能生成对应的proxy字典,以便我们接下来验证ip可用性所使用

字典这儿有个注意点,我们有一个将types变为小写的操作,因为在get方法中的proxies中写入的协议名称应为小写,而网页抓取的是大写的内容,所以进行了一个大小写转换

那么验证ip可用性的思路呢

很简单,我们使用get,加上我们的代理,请求网站:

http://1212.ip138.com/ic.asp

这是一个神奇的网站,能返回你的外网ip是什么

url = 'http://1212.ip138.com/ic.asp'
r = requests.get(url = url,proxies = proxy,timeout = 6)

这里我们需要加上timeout去除掉那些等待时间过长的代理,我设置为6秒

我们以一个ip进行尝试,并且分析返回的页面

返回的内容如下:

<html>

<head>

<meta xxxxxxxxxxxxxxxxxx>

<title> 您的IP地址 </title>

</head>

<body style="margin:0px"><center>您的IP是:[xxx.xxx.xxx.xxx] 来自:xxxxxxxx</center></body></html>

那么我们只需要提取出网页内[]的内容即可

如果我们的代理可用,就会返回代理的ip

(这里会出现返回的地址还是我们本机的外网ip的情况,虽然我也不是很清楚,但是我把这种情况排除,应该还是代理不可用)

那么我们就能进行一个判断,如果返回的ip和proxy字典中的ip相同,则认为这个ip是可用的代理,并将其写入文件

我们的思路就是这样,最后进行queue和threading线程的处理即可

上代码:

#coding=utf-8

import requests
import re
from bs4 import BeautifulSoup as bs
import Queue
import threading 

class proxyPick(threading.Thread):
 def __init__(self,queue):
  threading.Thread.__init__(self)
  self._queue = queue

 def run(self):
  while not self._queue.empty():
   url = self._queue.get()

   proxy_spider(url)

def proxy_spider(url):
 headers = {
   .......
  }

 r = requests.get(url = url,headers = headers)
 soup = bs(r.content,"html.parser")
 data = soup.find_all(name = 'tr',attrs = {'class':re.compile('|[^odd]')})

 for i in data:

  soup = bs(str(i),'html.parser')
  data2 = soup.find_all(name = 'td')
  ip = str(data2[1].string)
  port = str(data2[2].string)
  types = str(data2[5].string).lower() 


  proxy = {}
  proxy[types] = '%s:%s'%(ip,port)
  try:
   proxy_check(proxy,ip)
  except Exception,e:
   print e
   pass

def proxy_check(proxy,ip):
 url = 'http://1212.ip138.com/ic.asp'
 r = requests.get(url = url,proxies = proxy,timeout = 6)

 f = open('E:/url/ip_proxy.txt','a+')

 soup = bs(r.text,'html.parser')
 data = soup.find_all(name = 'center')
 for i in data:
  a = re.findall(r'\[(.*?)\]',i.string)
  if a[0] == ip:
   #print proxy
   f.write('%s'%proxy+'\n')
   print 'write down'
   
 f.close()

#proxy_spider()

def main():
 queue = Queue.Queue()
 for i in range(1,2288):
  queue.put('http://www.xicidaili.com/nn/'+str(i))

 threads = []
 thread_count = 10

 for i in range(thread_count):
  spider = proxyPick(queue)
  threads.append(spider)

 for i in threads:
  i.start()

 for i in threads:
  i.join()

 print "It's down,sir!"

if __name__ == '__main__':
 main()

这样我们就能把网站上所提供的能用的代理ip全部写入文件ip_proxy.txt文件中了

以上这篇python扫描proxy并获取可用代理ip的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python演示数型数据结构的教程
Apr 03 Python
Python实现从脚本里运行scrapy的方法
Apr 07 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
Python采用Django开发自己的博客系统
Sep 29 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 Python
如何通过雪花算法用Python实现一个简单的发号器
Jul 03 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
PyQt5实现简单的计算器
May 30 Python
解决python运行启动报错问题
Jun 01 Python
为什么称python为胶水语言
Jun 16 Python
python的多重继承的理解
Aug 06 #Python
python中 chr unichr ord函数的实例详解
Aug 06 #Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 #Python
Python实现将Excel转换为json的方法示例
Aug 05 #Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 #Python
Python基于Socket实现的简单聊天程序示例
Aug 05 #Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 #Python
You might like
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
超级退弹代码
2008/07/07 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
AngularJS语法详解
2015/01/23 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
Python实现简单登录验证
2016/04/13 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
python 读入多行数据的实例
2018/04/19 Python
Python调用C语言的实现
2019/07/26 Python
django和vue实现数据交互的方法
2019/08/21 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
大一自我鉴定范文
2013/12/27 职场文书
社区党务公开实施方案
2014/03/18 职场文书
商业门面租房协议书
2014/11/25 职场文书
小学教师个人总结
2015/02/05 职场文书
英语教师个人工作总结
2015/02/09 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
校园之声广播稿
2015/08/18 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏