鱼C论坛

 找回密码
 立即注册
查看: 1290|回复: 0

[作品展示] 免费代理池的实现

[复制链接]
发表于 2022-3-22 10:41:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
github地址: https://github.com/7134g/myproxypool


核心:以多线程方式去获取免费的ip站点,存储在内存中



程序分为三部分
1.  测试代理线程
2.  获取代理线程
3.  提供api服务的线程

其中每一个请求将生成一个子线程去处理(获取代理和测试代理)



流程:启动调度器 -> 开启测试,爬取,服务三条主线程
                爬取线程 -> 遍历爬取函数(每一个爬取函数对应一个免费代理平台) -> 清洗提取 -> 添加到队列A中
                测试线程 -> 从队列A中获取ip -> 对设定的站点携带ip访问 -> 无效删除
                服务线程 -> 提供api接口获取队列A中的代理



下列为调度器的启动函数

  1. class Scheduler: # 该程序的调度器
  2.     def run(self):
  3.         factory = Factory() # 用与构建管理所有线程
  4.         # factory.set_active_count([Getter, Tester])
  5.         try:
  6.             if TESTER_ENABLED:
  7.                 factory.add(schedule_tester)
  8.             if GETTER_ENABLED:
  9.                 factory.add(schedule_getter)
  10.             if API_ENABLED:
  11.                 factory.add(schedule_api)
  12.             factory.start() # 启动所有线程,也就是上面所添加的三个线程
  13.         finally:
  14.             factory.stop()
  15.             factory.shutdown()
复制代码




Factory类提供了暂停,停止,等待任务执行完毕的接口,便于控制一批批的测试代理ip。self._create_worker()用于创建工人

  1. class Factory:
  2.         ...
  3.     def start(self):
  4.         Log.debug("线程池启动,招聘打工人")
  5.         self._create_worker()
  6.         Log.debug("打工人准备就绪")
  7.         self._working()
  8.         while self.factory_status:
  9.             time.sleep(CHECK_FACTORY_STATUS)
复制代码



为了减少创建线程,就有了Worker类,其作用就是一个对象意味着一个线程
可由 Factory类 动态控制线程此时的工作
将执行过程中生成的所有Task类任务存放在cls._instance.tasks中,由空闲工人去拉来执行

  1. class Worker(threading.Thread):
  2.         ...
  3.     def run(self):
  4.         self.wf = "doing"
  5.         while self.factory.factory_status and self.status:
  6.             if not self.__running.is_set():
  7.                 Log.info("咋瓦鲁多")
  8.             # 获取任务
  9.             t = self.factory.get_task()
  10.             if not t:
  11.                 self._sleep(self.wid)
  12.                 continue
  13.             try:
  14.                 self.sleep_count = 0
  15.                 t.run()
  16.                 # print(f"打工人{self.wid}号 ,剩余工作 {self.factory._active_working}")
  17.             except Exception as e:
  18.                 Log.error(f"打工人工作异常: {e}")
  19.             finally:
  20.                 self.factory.minus_active(t.name)
  21.             self.__running.wait()  # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
  22.         Log.debug(f"打工人{self.wid}你被炒鱿鱼了")
  23.         self.wf = "fired"

  24. class Task:
  25.         ...
  26.     def run(self):
  27.         if self.args:
  28.             if self.kw:
  29.                 self.fun(*self.args, **self.kw)
  30.             else:
  31.                 self.fun(*self.args)
  32.         else:
  33.             self.fun()
  34.         # 需要工作的内容
复制代码






小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 13:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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