设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2792|回复: 2

Python爬虫之ip代理池

[复制链接]

4

主题

51

金钱

84

积分

新手用户

发表于 2019-9-6 15:39:08 | 显示全部楼层 |阅读模式

   可能在学习爬虫的时候,遇到很多的反爬的手段,封ip 就是其中之一。

    对于封IP的网站。需要很多的代理IP,去买代理IP,对于初学者觉得没有必要,每个卖代理IP的网站有的提供了免费IP,可是又很少,写了个IP代理池 。学习应该就够了

ip代理池:
1,在各大网站爬去免费代理ip
2,检查ip可用 可用存入数据库1和2
3,在数据库1中拿出少量代理ip存入数据库2(方便维护)
4,定时检查数据库1和数据库2的代理数量,以及是否可用
5,调用端口

1,在各大网站爬去免费代理ip
  1. def IPList_61():
  2.   for q in [1,2]:
  3.       url='http://www.66ip.cn/'+str(q)+'.html'
  4.       html=Requestdef.get_page(url)
  5.       if html!=None:
  6.           #print(html)
  7.           iplist=BeautifulSoup(html,'lxml')
  8.           iplist=iplist.find_all('tr')
  9.           i=2
  10.           for ip in iplist:
  11.              if i<=0:
  12.                  loader=''
  13.                  #print(ip)
  14.                  j=0
  15.                  for ipport in ip.find_all('td',limit=2):
  16.                      if j==0:
  17.                         loader+=ipport.text.strip()+':'
  18.                      else:
  19.                          loader+=ipport.text.strip()
  20.                      j=j+1
  21.                  Requestdef.inspect_ip(loader)
  22.              i=i-1
  23.       time.sleep(1)
复制代码


多写几个这样的方法
1.png

2,检查ip可用 可用存入数据库1,和2

3,在数据库1中拿出少量代理ip存入数据库2(方便维护)
  1. ?123456789101112131415161718192021222324def inspect_ip(ipprot): 2     time.sleep(1) 3     herder={ 4         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", 5         'Accept-Encoding':'gzip, deflate', 6         'Accept-Language':'zh-CN,zh;q=0.9', 7         'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 8         'Upgrade-Insecure-Requests':'1' 910     }1112     url='https://www.baidu.com'13     proxies = { "http": "http://"+str(ipprot) }14     request=requests.get(url,headers=herder,proxies=proxies)15     if request.status_code==200:16         print('可用代理'+ipprot)17         if Db.r.llen('Iplist')<=50:18            Db.add_ip(ipprot)19         #Alt.iplist.append(ipprot)2021         else:22            Db.add_ips(ipprot)23     else:24         print('不可用代理'+ipprot)
复制代码

我这里是用的www.baidu.com检测的 给主IP的数据库长度是50 (太多了不好维护)

4,定时检查数据库1和数据库2的代理数量,以及是否可用
  1. #检查ip池数量
  2. def time_ip():

  3.     while True:
  4.         time.sleep(5)
  5.         Db.act_lenip()

  6. #检查备用池数量
  7. def time_ips():
  8.     while True:
  9.         time.sleep(30)<br>        #当备用池数量小于100 再次获取
  10.         if Db.len_ips()<100:
  11.             print('填数据')
  12.             Acting_ip.iplist()
  13. #程序入口
  14. if __name__ == '__main__':

  15.   t1=threading.Thread(target=time_ip)
  16.   t1.start()
  17.   t2=threading.Thread(target=time_ips)
  18.   t2.start()
  19.   t1.join()
  20.   t2.join()
复制代码

给他2个线程  

Db.py
  1. ?12345678910111213141516171819202122232425262728293031323334353637381 #coding:utf-8 2 import redis 3 import Requestdef 4 r = redis.Redis(host='127.0.0.1', port=6379)#host后的IP是需要连接的ip,本地是127.0.0.1或者localhost 5 #主ip池 6 def add_ip(ip): 7      r.lpush('Iplist',ip) 8 #备用ip池 9 def add_ips(ip):10      r.lpush('Iplists',ip)11 #备用ip池第一个开始取出12 def app_ips():13      i=str(r.lindex('Iplists',1),encoding='utf-8')14      r.lrem('Iplists',i,num=0)15      return i16 def len_ips():17     return r.llen('Iplists')18 def len_ip():19     return r.llen('Iplist')20 #第一个开始取出21 def app_ip():22      i=str(r.lpop('Iplist'),encoding='utf-8')23      return i24 #取出从最后一个开始25 def rem_ip():26     i=str(r.rpop('Iplist'),encoding='utf-8')27     return i28 #检查主ip池29 def act_db():30     for i in range(int(r.llen('Iplist')/2)):31        Requestdef.inspect_ip(rem_ip())3233 #如果ip池数量少于25个 则填满34 def act_lenip():35     if r.llen('Iplist')<25:36         print('填ip')37         while r.llen('Iplist')<=50:38           Requestdef.inspect_ip(app_ips())
复制代码



5,调用端口 使用flask库创建接口
  1. ?12345678910111213141516171 from flask import Flask 2 import Db 3 4 app = Flask(__name__) 5 6 @app.route('/', methods=['GET']) 7 def home(): 8     return 'What is?' 910 @app.route('/get', methods=['GET'])11 def homsse():12     return Db.app_ip()13 #线程池数量14 @app.route('/count', methods=['GET'])15 def homsssse():16     return str(Db.len_ip())17 app.run(debug=True)
复制代码

就完成了

运行api
2.png
3.png

数据库里面的 Iplist为主Ip池 iplist 为备用ip池
4.png

用get调用 用一次就删一个
5.png
6.png
小白代码


7

主题

368

金钱

3140

积分

中级用户

发表于 2020-1-2 20:23:15 | 显示全部楼层
great,赞一个
ximenyan
回复 支持 反对

使用道具 举报

7

主题

368

金钱

3140

积分

中级用户

发表于 2020-1-2 20:23:57 | 显示全部楼层
有才人,
ximenyan
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表