Python搭建代理IP池实现检测IP的方法


Posted in Python onOctober 27, 2019

在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不可用分数就减 1,这样就可以实时改变每个代理的可用情况,在获取有效 IP 的时候只需要获取分数高的 IP

代码地址:https://github.com/Stevengz/Proxy_pool

另外三篇:
Python搭建代理IP池(一)- 获取 IP
Python搭建代理IP池(二)- 存储 IP
Python搭建代理IP池(四)- 接口设置与整体调度

由于代理 IP 的数量非常多,为了提高 IP 的检测效率,这里使用异步请求库 Aiohttp 来进行检测。至于为什么不用抓取时用的 Requests 库,是因为它是一个同步请求库,在发出一个请求之后需要等待网页加载完成之后才能继续执行程序。这个过程会阻塞在等待响应中,如果服务器响应非常慢,一个请求就会需要十几秒,程序不会继续往下执行

异步请求库就解决了这个问题,在请求发出之后,程序可以继续接下去执行其他的事情,当响应到达时会通知程序再去处理这个响应,这样程序就没有被阻塞,可以充分把时间和资源利用起来

添加设置

增加了几个测试用的常量

setting.py

# 数据库地址
HOST = '127.0.0.1'
# MySql端口
MYSQL_PORT = 3306
# MySQl用户名、密码
MYSQL_USERNAME = '***'
MYSQL_PASSWORD = '***'
# 数据库名
SQL_NAME = 'test'

# 代理等级
MAX_SCORE = 30
MIN_SCORE = 0
INITIAL_SCORE = 10

# 代理池数量界限
POOL_UPPER_THRESHOLD = 1000

VALID_STATUS_CODES = [200, 302]

# 测试API,建议抓哪个网站测哪个
TEST_URL = 'http://www.baidu.com'

# 最大批测试量
BATCH_TEST_SIZE = 30

VALID_STATUS_CODES 变量包含了正常的状态码,获取 Response 后需要判断响应的状态,如果状态码在

VALID_STATUS_CODES 这个列表里,则代表代理可用

定义方法

定义了一个类 Tester,init() 方法中建立了一个 MySqlClient 对象,供类中其他方法使用。接下来定义了一个 test_single_proxy() 方法,用来检测单个代理的可用情况,其参数就是被检测的代理

tester.py

import asyncio
import aiohttp
import time
import sys
from aiohttp import ClientError
from db import MySqlClient
from setting import *


class Tester(object):
 def __init__(self):
  self.mysql = MySqlClient()
 
 # 测试单个代理
 async def test_single_ip(self, ip):
  conn = aiohttp.TCPConnector(verify_ssl=False)
  async with aiohttp.ClientSession(connector=conn) as session:
   try:
    if isinstance(ip, bytes):
     ip = ip.decode('utf-8')
    real_ip = 'http://' + ip
    print('正在测试', ip)
    async with session.get(TEST_URL, proxy=real_ip, timeout=15, allow_redirects=False) as response:
     if response.status in VALID_STATUS_CODES:
      self.mysql.max(ip)
      print('代理可用', ip)
     else:
      self.mysql.decrease(ip)
      print('请求响应码不合法 ', response.status, 'IP', ip)
   except (ClientError, aiohttp.client_exceptions.ClientConnectorError, asyncio.TimeoutError, AttributeError):
    self.mysql.decrease(ip)
    print('代理请求失败', ip)
 
 # 主函数
 def run(self):
  print('测试器开始运行')
  try:
   count = self.mysql.count()
   print('当前剩余', count, '个代理')
   for i in range(0, count, BATCH_TEST_SIZE):
    start = i
    stop = min(i + BATCH_TEST_SIZE, count)
    print('正在测试第', start + 1, '-', stop, '个代理')
    test_ip_group = self.mysql.batch(start, stop)
    loop = asyncio.get_event_loop()
    tasks = [self.test_single_ip(ip_tuple[0]) for ip_tuple in test_ip_group]
    loop.run_until_complete(asyncio.wait(tasks))
    sys.stdout.flush()
    time.sleep(5)
  except Exception as e:
   print('测试器发生错误', e.args)


if __name__ == "__main__":
 test = Tester()
 test.run()

test_single_proxy() 方法前面加了 async 关键词,代表这个方法是异步的,方法内部首先创建了 Aiohttp 的 ClientSession 对象,此对象类似于 Requests 的 Session 对象,可以直接调用该对象的 get() 方法来访问页面

运行结果:

Python搭建代理IP池实现检测IP的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中endswith()函数的基本使用
Apr 07 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
python中import与from方法总结(推荐)
Mar 21 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 Python
python通过SSH登陆linux并操作的实现
Oct 10 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
对python中arange()和linspace()的区别说明
May 03 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
运行Python编写的程序方法实例
Oct 21 Python
Python实现生活常识解答机器人
Jun 28 Python
浅析使用Python搭建http服务器
Oct 27 #Python
Python搭建代理IP池实现存储IP的方法
Oct 27 #Python
Python搭建代理IP池实现获取IP的方法
Oct 27 #Python
详解python statistics模块及函数用法
Oct 27 #Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
Oct 27 #Python
python自动结束mysql慢查询会话的实例代码
Oct 27 #Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 #Python
You might like
基于文本的留言簿
2006/10/09 PHP
基于mysql的论坛(6)
2006/10/09 PHP
php基础知识:类与对象(1)
2006/12/13 PHP
给php新手谈谈我的学习心得
2007/02/25 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
php数组去除空值函数分享
2015/02/02 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
arguments对象
2006/11/20 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python是怎么被发明的
2020/06/15 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
档案接收函范文
2014/01/10 职场文书
求职信模板怎么做
2014/01/26 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
手残删除python之后的补救方法
2021/06/26 Python
分享Python异步爬取知乎热榜
2022/04/12 Python