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使用CMD模块更优雅的运行脚本
May 11 Python
python基础教程之五种数据类型详解
Jan 12 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
详解python中sort排序使用
Mar 23 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
python定时任务 sched模块用法实例
Nov 04 Python
Python接口开发实现步骤详解
Apr 26 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
Python中使用ipython的详细教程
Jun 22 Python
Python采集爬取京东商品信息和评论并存入MySQL
Apr 12 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
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
php创建无限级树型菜单
2015/11/05 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
php框架知识点的整理和补充
2021/03/01 PHP
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
vue生成随机验证码的示例代码
2017/09/29 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
详解express + mock让前后台并行开发
2018/06/06 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
Python遍历目录中的所有文件的方法
2016/07/08 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
音乐节策划方案
2014/06/09 职场文书
员工开除通知书
2015/04/25 职场文书
寒假致家长的一封信
2015/10/10 职场文书