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的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
Jan 24 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
python 返回列表中某个值的索引方法
Nov 07 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
python画微信表情符的实例代码
Oct 09 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
PHP调用Webservice实例代码
2011/07/29 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
JS图片轮播与索引变色功能实例详解
2017/07/06 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
Mac中安装nvm的教程分享
2017/12/11 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
javascrit中undefined和null的区别详解
2019/04/07 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
Python中统计函数运行耗时的方法
2015/05/05 Python
python基于右递归解决八皇后问题的方法
2015/05/25 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python实现网站微信登录的示例代码
2019/09/18 Python
python生成器推导式用法简单示例
2019/10/08 Python
python 函数中的参数类型
2020/02/11 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
军训感想500字
2014/02/20 职场文书
医生个人年度总结
2015/02/28 职场文书
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers