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用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
对python3标准库httpclient的使用详解
Dec 18 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
Django框架视图函数设计示例
Jul 29 Python
使用TensorFlow-Slim进行图像分类的实现
Dec 31 Python
Python气泡提示与标签的实现
Apr 01 Python
Python使用for生成列表实现过程解析
Sep 22 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
用60行代码实现Python自动抢微信红包
Feb 04 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
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
python中的colorlog库使用详解
2019/07/05 Python
浅析python redis的连接及相关操作
2019/11/07 Python
Python3的socket使用方法详解
2020/02/18 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
全陪导游欢迎词
2014/01/17 职场文书
员工生日会策划方案
2014/06/14 职场文书
城管年度个人总结
2015/02/28 职场文书
回复函范文
2015/07/14 职场文书
运动会运动员赞词
2015/07/22 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server