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 按照固定长度分割字符串的方法小结
Apr 30 Python
python实现Windows电脑定时关机
Jun 20 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
Python生成器next方法和send方法区别详解
May 30 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
python基础之//、/与%的区别详解
Jun 10 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
phpMyadmin 用户权限中英对照
2010/04/02 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
python字符串查找函数的用法详解
2019/07/08 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
亲子活动总结
2014/04/26 职场文书
工商干部先进事迹
2014/05/14 职场文书
经营管理策划方案
2014/05/22 职场文书
体育专业自荐书
2014/05/29 职场文书
节能环保口号
2014/06/12 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
海上钢琴师观后感
2015/06/03 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis