在對網站信息進去抓取時,難免遇到被封IP的情況。針對這一情況可採用代理IP的方法來處理,好了 現在我遇到的問題是什麼呢? 就是我沒有代理IP啊。 百度了下,發現網上有好多免費的代理IP,所以我決定把能找到的所以免費代理IP全部採集下來,以後做成介面的方式來供大家免費使用。 本篇文章主要是對採集 “6 ...
在對網站信息進去抓取時,難免遇到被封IP的情況。針對這一情況可採用代理IP的方法來處理,好了 現在我遇到的問題是什麼呢? 就是我沒有代理IP啊。
百度了下,發現網上有好多免費的代理IP,所以我決定把能找到的所以免費代理IP全部採集下來,以後做成介面的方式來供大家免費使用。
本篇文章主要是對採集 “66免費代理網 http://www.66ip.cn/”做技術總結。
1、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)
2、採集目標站點
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)
3、技術總結
目標站點採用了 gzip 進行了頁面壓縮,如果不對頁面進行解碼那麼中文字元就會以亂碼的形式出現。針對這一情況,可採用 字元串函數 decode()進行解碼
4、百度網盤
鏈接:https://pan.baidu.com/s/1BStzSFPteMCcfOum6_4RUw
提取碼:dlsr