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根据时间生成mongodb的ObjectId的方法
Mar 13 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Python创建xml文件示例
Mar 22 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
python实现按行分割文件
Jul 22 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
Python实现扫码工具的示例代码
Oct 09 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
Matplotlib中rcParams使用方法
Jan 05 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 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通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
一个js过滤空格的小函数
2014/10/10 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
2019/05/22 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
python3 pygame实现接小球游戏
2019/05/14 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
大学生村官典型材料
2014/01/12 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
教师教学评估方案
2014/05/09 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
企业安全生产检查制度
2015/08/06 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL