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 第一步 hello world
Sep 25 Python
python之yield表达式学习
Sep 02 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
python各层级目录下import方法代码实例
Jan 20 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
python简单的三元一次方程求解实例
Apr 02 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
Python 字典中的所有方法及用法
Jun 10 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 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调用三种数据库的方法(3)
2006/10/09 PHP
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
基于node实现websocket协议
2016/04/25 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
python实现2048小游戏
2015/03/30 Python
python实现海螺图片的方法示例
2019/05/12 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
北大研究生linux应用求职信
2013/10/29 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
2014年保育员工作总结
2014/12/02 职场文书
城南旧事读书笔记
2015/06/29 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
goland设置颜色和字体的操作
2021/05/05 Golang
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python
MySQL 数据表操作
2022/05/04 MySQL