在爬虫学习的过程中,维护一个自己的代理池是非常重要的。

详情看代码:

  1.运行环境 python3.x,需求库:bs4,requests

  2.实时抓取西刺-国内高匿代理中前3页的代理ip(可根据需求自由修改)

  3.多线程对抓取的代理进行验证并存储验证后的代理ip

#-*-coding:utf8-*-

import re,threading,requests,time
import urllib.request
from bs4 import BeautifulSoup as BS rawProxyList = []
checkedProxyList = []
targets = []
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Connection': 'keep-alive'
} for i in range(1,4):
target = r"http://www.xicidaili.com/nn/%d" %i
targets.append(target)
#print (targets) #获取代理的类
class ProxyGet(threading.Thread):
def __init__(self,target):
threading.Thread.__init__(self)
self.target =target def getProxy(self):
print ("目标网站:"+self.target)
r = requests.get(self.target,headers =headers)
page = r.text
soup = BS(page,"lxml")
#这里的class_用的是"Searching by CSS class"",BS文档中有详细介绍
tr_list = soup.find_all("tr", class_= "odd") for i in range(len(tr_list)):
row = []
#.stripped_strings 方法返回去除前后空白的Python的string对象.
for text in tr_list[i].stripped_strings:
row.append(text)
#row = ['58.208.16.141','808','江苏苏州','高匿','HTTP,......]
ip =row[0]
port = row[1]
agent = row[4].lower()
addr =agent+ "://" + ip + ":" + port
proxy = [ip, port, agent, addr]
rawProxyList.append(proxy) def run(self):
self.getProxy() #检验代理类
class ProxyCheck(threading.Thread):
def __init__(self,proxyList):
threading.Thread.__init__(self)
self.proxyList = proxyList
self.timeout =2
self.testUrl = "https://www.baidu.com/" def checkProxy(self): for proxy in self.proxyList:
proxies = {}
if proxy[2] =="http":
proxies['http'] = proxy[3]
else:
proxies['https'] = proxy[3]
t1 =time.time()
try:
r = requests.get(self.testUrl, headers=headers, proxies=proxies, timeout=self.timeout)
time_used = time.time() - t1
if r:
checkedProxyList.append((proxy[0],proxy[1],proxy[2],proxy[3],time_used))
else:
continue
except Exception as e:
continue def run(self):
self.checkProxy()
print("hello") if __name__ =="__main__":
getThreads = []
checkedThreads = [] # 对每个目标网站开启一个线程负责抓取代理
for i in range(len(targets)):
t= ProxyGet(targets[i])
getThreads.append(t) for i in range(len(getThreads)):
getThreads[i].start() for i in range(len(getThreads)):
getThreads[i].join() print ('.'*10+"总共抓取了%s个代理" %len(rawProxyList) +'.'*10) #开启20个线程负责校验,将抓取到的代理分成20份,每个线程校验一份
for i in range(10):
n =len(rawProxyList)/10
#print (str(int(n * i))+ ":" +str(int(n * (i+1))))
t = ProxyCheck(rawProxyList[int(n * i):int(n * (i+1))])
checkedThreads.append(t) for i in range(len(checkedThreads)):
checkedThreads[i].start() for i in range(len(checkedThreads)):
checkedThreads[i].join()
print ('.'*10+"总共有%s个代理通过校验" %len(checkedProxyList) +'.'*10 ) #持久化
f = open("proxy_list.txt",'w+')
for checked_proxy in sorted(checkedProxyList):
print ("checked proxy is: %s\t%s" %(checked_proxy[3],checked_proxy[4]) )
f.write("%s:%s\t%s\t%s\t%s\n" % (checked_proxy[0], checked_proxy[1], checked_proxy[2], checked_proxy[3], checked_proxy[4]))
f.close()

python爬虫实战(一)——实时获取代理ip的更多相关文章

  1. 原创:Python爬虫实战之爬取代理ip

    编程的快乐只有在运行成功的那一刻才知道QAQ 目标网站:https://www.kuaidaili.com/free/inha/  #若有侵权请联系我 因为上面的代理都是http的所以没写这个判断 代 ...

  2. Python学习笔记六(免费获取代理IP)

    为获取网上免费代理IP,闲的无聊,整合了一下,免费从三个代理网站获取免费代理IP,目的是在某一代理网站被限制时,仍可从可以访问的其他网站上获取代理IP.亲测可用哦!^_^  仅供大家参考,以下脚本可添 ...

  3. Python爬虫技术:爬虫时如何知道是否代理ip伪装成功?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. python爬虫时如何知道是否代理ip伪装成功: 有时候我们的爬虫程序添加了 ...

  4. python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客

    python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客 undefined Python多线程抓取代理服务器 | Linux运维笔记 undefined java如 ...

  5. python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性)

    python爬虫之反爬虫(随机user-agent,获取代理ip,检测代理ip可用性) 目录 随机User-Agent 获取代理ip 检测代理ip可用性 随机User-Agent fake_usera ...

  6. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  7. Python实战:Python爬虫学习教程,获取电影排行榜

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  8. 分享一个获取代理ip的python函数

    分享一个获取代理ip的python函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #coding:utf-8 from bs4 import Beaut ...

  9. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

随机推荐

  1. java compiler level does not match the version of the installed java project facet

    Java compiler level does not match the version of the installed java project facet错误的解决 因工作的关系,Eclip ...

  2. C#调用WebService (转)

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  3. JSON.stringify()

    概述 JSON.stringify() 方法可以将任意的 JavaScript 值序列化成 JSON 字符串. 语法 JSON.stringify(value[, replacer [, space] ...

  4. SQL 递归

    -- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数 ) SET @Dept_name = N'MIS' ;WITH DEPTS AS( -- 查询指定部门及其下的所有子部门 -- 定位点成员 ...

  5. Java 邮件发送

    <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId&g ...

  6. libtool: line 990: g++: command not found的解决

    yum -y install gcc+ gcc-c++

  7. King's Quest —— POJ1904(ZOJ2470)Tarjan缩点

    King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon ...

  8. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  9. 系统服务监视、系统服务守护 ServiceMonitor

    源码及版权来自易语言论坛邓学彬,本人只是稍微修改了一下. 下载链接: https://pan.baidu.com/s/1i4Aja4l 密码: 8fuv

  10. 【转】如何查看当前Open的Cursor

    遇到错误:A cursor with thename ' ' already exists,想要看是什么代码导致的.找到下面几种方法. --测试声明Cursor并且打开 DECLARE vend_cu ...