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中使用item()方法遍历字典的例子
Aug 26 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
Python实现两款计算器功能示例
Dec 19 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
Python安装与基本数据类型教程详解
May 29 Python
用Python写一个自动木马程序
Sep 17 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 Python
利用python清除移动硬盘中的临时文件
Oct 28 Python
python 解决函数返回return的问题
Dec 05 Python
Python实现Hash算法
Mar 18 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中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
生成二维码方法汇总
2014/12/26 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
PyMongo安装使用笔记
2015/04/27 Python
Django日志模块logging的配置详解
2017/02/14 Python
python实现音乐下载的统计
2018/06/20 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
django表单的Widgets使用详解
2019/07/22 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
Python xlwt模块使用代码实例
2020/06/10 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
最新销售员个人自荐信
2013/09/21 职场文书
高一数学教学反思
2014/02/07 职场文书
名人演讲稿范文
2014/09/16 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
利用python做表格数据处理
2021/04/13 Python
Apache自带的ab压力测试工具的实现
2022/07/23 Servers