在對網站信息進去抓取時,不免遇到被封IP的狀況。針對這一狀況可採用代理IP的方法來處理,好了 如今我遇到的問題是什麼呢? 就是我沒有代理IP啊。app
百度了下,發現網上有好多免費的代理IP,因此我決定把能找到的因此免費代理IP所有采集下來,之後作成接口的方式來供你們無償使用。函數
本篇文章主要是對採集 「66免費代理網 http://www.66ip.cn/」作技術總結。post
爲了讓操做更加簡單 採用工廠模式對GET / Post 請求進行了封裝。網站
import requests import abc ''' 請求方法抽象類 ''' class AbsMethod: @abc.abstractmethod def request(self, url, attach): pass ''' Get 方法 ''' class Get(AbsMethod): ''' 請求 ''' def request(self, url, attach) -> requests.Response: res = requests.post(url, attach) if not res.ok: return res.raise_for_status() return res ''' Post 方法 ''' class Post(AbsMethod): ''' 請求 ''' def request(self, url, attach) -> requests.Response: res = requests.get(url, attach) if not res.ok: return res.raise_for_status() return res ''' 方法工廠 ''' class MethodFactory: def create(self, method: str) -> AbsMethod: return eval(method)() ''' http 請求 ''' class HttpReuqest: ''' 發送求請 ''' @staticmethod def send(url, attach = {}, method='Get') -> requests.Response: factory = MethodFactory() target = factory.create(method) return target.request(url, attach)
class WWW_66IP_CN: ''' URL地址 ''' __url = 'http://www.66ip.cn' ''' 頁面編碼 ''' __code = 'gbk' ''' 選擇器 ''' __selector = '.containerbox table tr' ''' 獲取免費代理 ''' def get_proxy(self) -> str: soup = bs4.BeautifulSoup(self.text, 'lxml') result = soup.select(self.__selector) result = self.__filters([str(n) for n in result]) return result ''' 獲取頁面內容 ''' @property def text(self) -> str: http = HttpReuqest() res = http.send(self.__url) if res.headers['Content-Encoding'] == 'gzip': # 頁面採用gizp壓縮了,須要對它進行解碼否則中文會亂碼 return res.content.decode(self.__code) return res.text ''' 過濾 ''' def __filters(self, items: List[str]) -> List[list]: result, regex = [], re.compile(r'<td>([^<>]+)</td>') for item in items: result.append(regex.findall(item)) return result proxy = WWW_66IP_CN() d = proxy.get_proxy() print(d)
目標站點採用了 gzip 進行了頁面壓縮,若是不對頁面進行解碼那麼中文字符就會以亂碼的形式出現。針對這一狀況,可採用 字符串函數 decode()進行解碼編碼
連接:https://pan.baidu.com/s/1BStzSFPteMCcfOum6_4RUw
提取碼:dlsr url