IP_Pool
前言
刚好前段时间突然萌发了自己做一个代理池的想法,于是就用了一些通俗的方法来实现,一来能方便自己理解,二来也加强学习。
这里开放给大家Github:Proxy_IP_Pool,给大家提供一点参考,使用前请务必要仔细查看README.md文件。
总体构思
- 定期从公开的代理网站上采集ip,在进行初次验证后进行格式化并保存到指定文件;
- 定期检测已存ip的有效性;
- 提供api接口查看以存ip及获取有效代理ip。
应用技术
python3
requests
flask
gevent
multiprocessing
logging
目录结构
--[ip_pool]:
--[pool]
--[core]:
--ip_crawl.py # 爬虫代码
--tool_lib.py # 工具函数集合
--items.py # 数据结构定义文件
--settings.py # 基础设置文件
--api.py # RESTful API接口文件
--[data]:
--ip_data.json # 有效ip存储文件(运行后生成文件夹)
--[log]:
--err.log # 错误日志(运行后生成文件夹)
--run.py # 爬虫及验证程序启动文件
--log.yml # logging配置文件
--requirements.txt # python requirments
--README.md
代码片段
仅展示部分代码片段,限于篇幅没有展示自建模块tool_lib,如需浏览完整代码请移步Github/Proxy_IP_Pool,运行前请务必细看README.md文件
ip_crawl.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Purpose: 从公开网站抓取代理ip,创建ip池,每10分钟检测可用性进行更新一次,提供api接口,每次获取一个ip地址,并在取用之前进行检测
Author: YajunZheng
Created: 2018/10/25
"""
import datetime
import requests
from lxml import etree
from pool.items import IpDataFormat
from pool import settings
from pool.core import tool_lib
class XicidailiCrawl(object):
"""西刺代理"""
def __init__(self):
self.init_url = "http://www.xicidaili.com/nn/{0}"
self.s = requests.session()
self.s.keep_alive = False
self.proxies = tool_lib.get_valid_ip()
def start_requests(self):
"""获取第一页中包含的ip列表"""
for i in range(1, 2):
url = self.init_url.format(str(i))
headers = settings.HEADERS
res = self.s