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创建列表并给列表赋初始值的方法
Jul 28 Python
Python处理Excel文件实例代码
Jun 20 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
Python探索之ModelForm代码详解
Oct 26 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
matplotlib subplot绘制多个子图的方法示例
Jul 28 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四大安全策略
2014/03/12 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
React手稿之 React-Saga的详解
2018/11/12 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
delegate与普通函数的区别
2014/01/22 面试题
.NET程序员的数据库面试题
2012/10/10 面试题
仓管员岗位责任制
2014/02/19 职场文书
机电一体化专业求职信
2014/07/22 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
企业文化学习心得体会
2016/01/21 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers
Golang实现可重入锁的示例代码
2022/05/25 Golang