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下singleton模式的实现方法
Jul 16 Python
初步认识Python中的列表与位运算符
Oct 12 Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 Python
详谈python read readline readlines的区别
Sep 22 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
pandas string转dataframe的方法
Apr 11 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python变量访问权限控制详解
Jun 29 Python
在django中,关于session的通用设置方法
Aug 06 Python
python使用列表的最佳方案
Aug 12 Python
基于python实现简单网页服务器代码实例
Sep 14 Python
python打包多类型文件的操作方法
Sep 21 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
ThinkPHP的I方法使用详解
2014/06/18 PHP
php常见的魔术方法详解
2014/12/25 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
&amp;lt;script defer&amp;gt; defer 是什么意思
2009/05/10 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
Python装饰器使用示例及实际应用例子
2015/03/06 Python
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python实现购物程序思路及代码
2017/07/24 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
Python读取YAML文件过程详解
2019/12/30 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
HTML5实现直播间评论滚动效果的代码
2020/05/27 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
中学生运动会新闻稿
2014/09/24 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
JS中如何优雅的使用async await详解
2021/10/05 Javascript