搭建免費代理池---採集代理(1)

在對網站信息進去抓取時,不免遇到被封IP的狀況。針對這一狀況可採用代理IP的方法來處理,好了  如今我遇到的問題是什麼呢? 就是我沒有代理IP啊。app

百度了下,發現網上有好多免費的代理IP,因此我決定把能找到的因此免費代理IP所有采集下來,之後作成接口的方式來供你們無償使用。函數

本篇文章主要是對採集 「66免費代理網 http://www.66ip.cn/」作技術總結。post

一、GET/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

相關文章
相關標籤/搜索