视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python获取代理IP的实例分享
2020-11-27 14:21:43 责编:小采
文档


这篇文章主要介绍了关于python获取代理IP的实例分享,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

平时当我们需要爬取一些我们需要的数据时,总是有些网站禁止同一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; WOW)"}
 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; WOW)")
 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',....]

下载本文
显示全文
专题