python获取代理IP的实例分享


Posted in Python onMay 07, 2018

平时当我们需要爬取一些我们需要的数据时,总是有些网站禁止同一IP重复访问,这时候我们就应该使用代理IP,每次访问前伪装自己,让“敌人”无法察觉。

oooooooooooooooOK,让我们愉快的开始吧!

这个是获取代理ip的文件,我将它们模块化,分为三个函数

注:文中会有些英文注释,是为了写代码方便,毕竟英文一两个单词就ok了

#!/usr/bin/python
#-*- coding:utf-8 -*-
"""
author:dasuda
"""
import urllib2
import re
import socket
import threading
findIP = [] #获取的原始IP数据
IP_data = [] #拼接端口后的IP数据
IP_data_checked = [] #检查可用性后的IP数据
findPORT = [] #IP对应的端口
available_table = [] #可用IP的索引
def getIP(url_target):
 patternIP = re.compile(r'(?<=<td>)[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}')
 patternPORT = re.compile(r'(?<=<td>)[\d]{2,5}(?=</td>)')
 print "now,start to refresh proxy IP..."
 for page in range(1,4):
  url = 'http://www.xicidaili.com/nn/'+str(page)
  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"}
  request = urllib2.Request(url=url, headers=headers)
  response = urllib2.urlopen(request)
  content = response.read()
  findIP = re.findall(patternIP,str(content))
  findPORT = re.findall(patternPORT,str(content))
  #assemble the ip and port
  for i in range(len(findIP)):
   findIP[i] = findIP[i] + ":" + findPORT[i]
   IP_data.extend(findIP)
  print('get page', page)
 print "refresh done!!!"
 #use multithreading
 mul_thread_check(url_target)
 return IP_data_checked
def check_one(url_check,i):
 #get lock
 lock = threading.Lock()
 #setting timeout
 socket.setdefaulttimeout(8)
 try:
  ppp = {"http":IP_data[i]}
  proxy_support = urllib2.ProxyHandler(ppp)
  openercheck = urllib2.build_opener(proxy_support)
  urllib2.install_opener(openercheck)
  request = urllib2.Request(url_check)
  request.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; WOW64)")
  html = urllib2.urlopen(request).read()
  lock.acquire()
  print(IP_data[i],'is OK')
  #get available ip index
  available_table.append(i)
  lock.release()
 except Exception as e:
  lock.acquire()
  print('error')
  lock.release()
def mul_thread_check(url_mul_check):
 threads = []
 for i in range(len(IP_data)):
  #creat thread...
  thread = threading.Thread(target=check_one, args=[url_mul_check,i,])
  threads.append(thread)
  thread.start()
  print "new thread start",i
 for thread in threads:
  thread.join()
 #get the IP_data_checked[]
 for error_cnt in range(len(available_table)):
  aseemble_ip = {'http': IP_data[available_table[error_cnt]]}
  IP_data_checked.append(aseemble_ip)
 print "available proxy ip:",len(available_table)

一、getIP(url_target):主要函数 传入参数是:验证代理IP可用性的网址,推荐ipchina

获取代理IP,从http://www.xicidaili.com/nn/网站获取,它是一个提供免费代理IP的网站,但是里面的IP不是全都能用,而且结合你的实际地理位置、网络情况、访问的目标服务器等情况,能用的大概不到20%,至少我的情况是这样。

访问http://www.xicidaili.com/nn/网站使用正常方式,返回的网页内容通过正则查询获得需要的IP和对应端口,代码如下:

patternIP = re.compile(r'(?<=<td>)[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}')
patternPORT = re.compile(r'(?<=<td>)[\d]{2,5}(?=</td>)')
...
findIP = re.findall(patternIP,str(content))
findPORT = re.findall(patternPORT,str(content))

关于如何构造正则表达式,可以参考其他的文章:

获取的IP保存在findIP中,对应的端口在findPORT中,两者按索引对应,获取一页IP正常数量为100.

接下来进行IP和端口拼接

最后进行可用性检查

二、check_one(url_check,i):线程函数

本次访问url_check还是使用正常方式访问,当访问网页有返回时,则说明本代理IP可用,则记录下当前索引值,用于后面将所有可用IP取出。

三、mul_thread_check(url_mul_check):多线程生成

本函数开启多线程检查代理IP可用性,每个IP开启一个线程进行检查。

本工程直接调用getIP(),并传入用于检查可用性的网址,即可返回一个列表,里面是经可用性检查的ip列表,格式为

['ip1:port1','ip2:port2',....]

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

Python 相关文章推荐
Python中装饰器的一个妙用
Feb 08 Python
python中常用检测字符串相关函数汇总
Apr 15 Python
Python pickle模块用法实例分析
May 27 Python
如何高效使用Python字典的方法详解
Aug 31 Python
Django项目开发中cookies和session的常用操作分析
Jul 03 Python
python学习之hook钩子的原理和使用
Oct 25 Python
python 实现selenium断言和验证的方法
Feb 13 Python
python对常见数据类型的遍历解析
Aug 27 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
python 双循环遍历list 变量判断代码
May 04 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
对python使用http、https代理的实例讲解
May 07 #Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 #Python
python使用代理ip访问网站的实例
May 07 #Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 #Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 #Python
Pyspider中给爬虫伪造随机请求头的实例
May 07 #Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 #Python
You might like
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
学生会主席竞聘书
2014/03/31 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
大学新生军训方案
2014/05/03 职场文书
感恩教育活动总结
2014/05/05 职场文书
金融保险专业求职信
2014/09/03 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
2015年幼师工作总结
2015/04/28 职场文书