您好,登錄后才能下訂單哦!
小編給大家分享一下Python怎么搭建代理IP池獲取IP,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
構建代理 IP 池的第一步:獲取 IP
使用的庫:requests、pyquery
幾個能提供免費代理的代理服務網站(排名不分先后):
廠商名稱 | 地址 |
---|---|
66代理 | http://www.66ip.cn/ |
西刺代理 | https://www.xicidaili.com |
全網代理 | http://www.goubanjia.com |
云代理 | http://www.ip3366.net |
IP海 | http://www.iphai.com |
快代理 | https://www.kuaidaili.com |
免費代理IP庫 | http://ip.jiangxianli.com |
代理服務網站 Crawler
代理獲取的相關代碼,把從每個網站提取 IP 的方法都放到一起,然后運行時只要調用相關方法即可
為了實現靈活,將獲取代理的一個個方法統一定義一個規范,如統一定義以 crawl 開頭,這樣擴展的時候只需要添加 crawl 開頭的方法即可
在這里實現了幾個示例,如抓取代理 66、西刺代理、云代理、快代理 四個免費代理網站,這些方法都定義成生成器,通過 yield 返回。首先將網頁獲取,然后用 PyQuery 解析,解析出 IP 加端口形式的代理再返回
crawler.py
import json import re from utils import get_page from pyquery import PyQuery as pq # 元類 class ProxyMetaclass(type): def __new__(cls, name, bases, attrs): count = 0 attrs['__CrawlFunc__'] = [] for k, v in attrs.items(): if 'crawl_' in k: attrs['__CrawlFunc__'].append(k) count += 1 attrs['__CrawlFuncCount__'] = count return type.__new__(cls, name, bases, attrs) class Crawler(object, metaclass=ProxyMetaclass): def get_proxies(self, callback): proxies = [] for proxy in eval("self.{}()".format(callback)): print('成功獲取到代理', proxy) proxies.append(proxy) return proxies def crawl_daili66(self, page_count=4): start_url = 'http://www.66ip.cn/{}.html' urls = [start_url.format(page) for page in range(1, page_count + 1)] for url in urls: print('Crawling', url) html = get_page(url) if html: doc = pq(html) trs = doc('.containerbox table tr:gt(0)').items() for tr in trs: ip = tr.find('td:nth-child(1)').text() port = tr.find('td:nth-child(2)').text() yield ':'.join([ip, port]) def crawl_xicidaili(self): for i in range(1, 3): start_url = 'http://www.xicidaili.com/nn/{}'.format(i) headers = { 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Host':'www.xicidaili.com', 'Referer':'http://www.xicidaili.com/nn/3', 'Upgrade-Insecure-Requests':'1', } html = get_page(start_url, options=headers) if html: find_trs = re.compile('<tr class.*?>(.*?)</tr>', re.S) trs = find_trs.findall(html) for tr in trs: find_ip = re.compile('<td>(\d+\.\d+\.\d+\.\d+)</td>') re_ip_address = find_ip.findall(tr) find_port = re.compile('<td>(\d+)</td>') re_port = find_port.findall(tr) for address,port in zip(re_ip_address, re_port): address_port = address+':'+port yield address_port.replace(' ','') def crawl_ip3366(self): for i in range(1, 4): start_url = 'http://www.ip3366.net/?stype=1&page={}'.format(i) html = get_page(start_url) if html: find_tr = re.compile('<tr>(.*?)</tr>', re.S) trs = find_tr.findall(html) for s in range(1, len(trs)): find_ip = re.compile('<td>(\d+\.\d+\.\d+\.\d+)</td>') re_ip_address = find_ip.findall(trs[s]) find_port = re.compile('<td>(\d+)</td>') re_port = find_port.findall(trs[s]) for address,port in zip(re_ip_address, re_port): address_port = address+':'+port yield address_port.replace(' ','') def crawl_kuaidaili(self): for i in range(1, 4): start_url = 'http://www.kuaidaili.com/free/inha/{}/'.format(i) html = get_page(start_url) if html: ip_address = re.compile('<td data-title="IP">(.*?)</td>') re_ip_address = ip_address.findall(html) port = re.compile('<td data-title="PORT">(.*?)</td>') re_port = port.findall(html) for address,port in zip(re_ip_address, re_port): address_port = address+':'+port yield address_port.replace(' ','')
定義了一個 ProxyMetaclass,Crawl 類將它設置為元類,元類中實現了 new() 方法,遍歷 attrs 變量即可獲取類的所有方法信息,判斷方法名前面是否是 crawl,是則將其加入到 CrawlFunc 屬性中
代理網站的添加非常靈活,不僅可以添加免費代理,也可以添加付費代理,一些付費代理的提取方式類似,也通過 Web 的形式獲取再進行解析,解析方式可能更加簡單,如解析純文本或 Json,解析之后以同樣的方式返回,可以自行擴展
utils.py
import requests from requests.exceptions import ConnectionError base_headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7' } def get_page(url, options={}): headers = dict(base_headers, **options) print('正在抓取', url) try: response = requests.get(url, headers=headers) print('抓取成功', url, response.status_code) if response.status_code == 200: return response.text except ConnectionError: print('抓取失敗', url) return None
抓取網頁內容的方法,訪問鏈接成功后返回整個網頁 HTML 內容,便于后續對網頁具體內容的提取。封裝成一個方法,讓上面的 crawler 在抓取各個網站時調用
進行抓取
getter.py
from crawler import Crawler from setting import * import sys class Getter(): def __init__(self): self.crawler = Crawler() def run(self): print('獲取器開始執行') for callback_label in range(self.crawler.__CrawlFuncCount__): callback = self.crawler.__CrawlFunc__[callback_label] # 獲取代理 all_ip = self.crawler.get_proxies(callback) if __name__ == '__main__': get = Getter() get.run()
運行結果:
網站上的免費 IP 就被成功抓取下來了,至于能不能用,就有待驗證了
整個過程其實就是一個普通的爬蟲,而且沒什么反爬措施,能到用代理 IP 的地步,代碼里面的訪問、抓取部分的細節應該都看得懂
看完了這篇文章,相信你對“Python怎么搭建代理IP池獲取IP”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。