採集的站點: 免費代理IP http://ip.yqie.com/ipproxy.htm66免費代理網 http://www.66ip.cn/89免費代理 http://www.89ip.cn/無憂代理 http://www.data5u.com/雲代理 http://www.ip3366.net/ ...
採集的站點:
免費代理IP http://ip.yqie.com/ipproxy.htm
66免費代理網 http://www.66ip.cn/
89免費代理 http://www.89ip.cn/
無憂代理 http://www.data5u.com/
雲代理 http://www.ip3366.net/
快代理 https://www.kuaidaili.com/free/
極速專享代理 http://www.superfastip.com/
HTTP代理IP https://www.xicidaili.com/wt/
小舒代理 http://www.xsdaili.com
西拉免費代理IP http://www.xiladaili.com/
小幻HTTP代理 https://ip.ihuan.me/
全網代理IP http://www.goubanjia.com/
飛龍代理IP http://www.feilongip.com/
採集流程
第一步:獲取頁面內容
第二步:解析內容獲取數據
第三步:數據格式轉換
採集流程定製好了之後,把他創建為抽象類 讓所有站點去繼承它, 子類只需要去實現抽象方法。這是一個比較典型的模板模式
基類
from abc import ABC, abstractmethod from typing import List import requests import bs4 from .model import ProxyModel class AbsFreeProxyBase(ABC): # 請求 http = requests # 初始化 def __init__(self, url, code, **kwargs): """ :param url: 請求地址 :param code: 頁面編碼 :param kw: 附加信息 """ self.url = url self.code = code self.kwargs = kwargs self.beautifulsoup = bs4.BeautifulSoup # 模板方法模式 # 第一步 獲取頁面內容 第二步 解析內容 第二步 格式化數據 def run(self) -> List[ProxyModel]: text = self.get_page_text() soup = self.beautifulsoup(text, 'lxml') data = self.parse_text(soup) return self.to_proxy(data) # 獲取頁面內容 def get_page_text(self): res = AbsFreeProxyBase.http.get(self.url, **self.kwargs) if not res.ok: res.raise_for_status() return res.content.decode(self.code) # 解析內容 @abstractmethod def parse_text(self, soup: bs4.BeautifulSoup) -> List[list]: pass # 格式轉換 @abstractmethod def to_proxy(self, data:List[list]) -> List[ProxyModel]: pass
如:快代理網站
from .base import AbsFreeProxyBase from typing import List from .model import ProxyModel import re ''' 快代理 https://www.kuaidaili.com/free ''' class WWW_KUAIDAILI_COM(AbsFreeProxyBase): # 初始化 def __init__(self, url, code='utf-8', **kwargs): super().__init__(url, code, **kwargs) # 解析內容 def parse_text(self, soup) -> List[list]: """ 格式如下: IP port(埠) 匿名度 類型(HTTP/https) 位置 響應速度 最後驗證時間 """ regex = re.compile(r'<td[^>]*>([^<>]+)</td>') rows = soup.select('.table-bordered tr') result = [] for row in [str(n) for n in rows]: item = regex.findall(row) item and result.append(item) return result # 格式轉換 def to_proxy(self, data: List[list]) -> List[ProxyModel]: result = [] for item in data: result.append(ProxyModel(item[3], item[0], item[1], item[2])) return result
應用實列
from website import ProxyFactory from browser.agent import useragent factory = ProxyFactory() headers = { 'user-agent': useragent.random() } ''' 66免費代理網 www = factory.create('http://www.66ip.cn/mo.php?sxb=&tqsl=100&port=&export=&ktip=&sxa=&submit=%CC%E1++%C8%A1&textarea=', 'gbk', headers=headers) ''' ''' 小幻HTTP代理 www = factory.create('https://ip.ihuan.me/',headers = headers) ''' ''' 89免費代理 http://www.89ip.cn/ www = factory.create('http://www.89ip.cn/',headers = headers) ''' ''' 無憂代理 http://www.data5u.com/ www = factory.create('http://www.data5u.com/',headers = headers) ''' ''' http://www.goubanjia.com/ 全網代理IP www = factory.create('http://www.goubanjia.com/',headers = headers) ''' ''' 雲代理 http://www.ip3366.net/ www = factory.create('http://www.ip3366.net/','gbk',headers = headers) ''' ''' 快代理 https://www.kuaidaili.com/free ''' www = factory.create('https://www.kuaidaili.com/free',headers = headers) data = www.run() print(data)
百度網盤
鏈接:https://pan.baidu.com/s/1aNiuGpcDmgvUR2HmZKR99Q
提取碼:6u82