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网络编程学习笔记(六):Web客户端访问
Jun 09 Python
Python实现115网盘自动下载的方法
Sep 30 Python
初步理解Python进程的信号通讯
Apr 09 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
使用sklearn对多分类的每个类别进行指标评价操作
Jun 11 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
Python实现简单的2048小游戏
Mar 01 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
用Flash图形化数据(二)
2006/10/09 PHP
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
php smarty模版引擎中的缓存应用
2009/12/02 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
Python2.x中文乱码问题解决方法
2015/06/02 Python
Python解析树及树的遍历
2016/02/03 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
详解python 发送邮件实例代码
2016/12/22 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python调用自定义函数的实例操作
2019/06/26 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
简约控的天堂:The Undone
2016/12/21 全球购物
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
演讲稿怎么写才完美
2014/01/02 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
浅谈Python中的正则表达式
2021/06/28 Python