久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python爬蟲(chóng)代理池搭建的方法步驟

瀏覽:2日期:2022-07-09 16:26:36
一、為什么要搭建爬蟲(chóng)代理池

在眾多的網(wǎng)站防爬措施中,有一種是根據(jù)ip的訪問(wèn)頻率進(jìn)行限制,即在某一時(shí)間段內(nèi),當(dāng)某個(gè)ip的訪問(wèn)次數(shù)達(dá)到一定的閥值時(shí),該ip就會(huì)被拉黑、在一段時(shí)間內(nèi)禁止訪問(wèn)。

應(yīng)對(duì)的方法有兩種:

1. 降低爬蟲(chóng)的爬取頻率,避免IP被限制訪問(wèn),缺點(diǎn)顯而易見(jiàn):會(huì)大大降低爬取的效率。

2. 搭建一個(gè)IP代理池,使用不同的IP輪流進(jìn)行爬取。

二、搭建思路

1、從代理網(wǎng)站(如:西刺代理、快代理、云代理、無(wú)憂(yōu)代理)爬取代理IP;

2、驗(yàn)證代理IP的可用性(使用代理IP去請(qǐng)求指定URL,根據(jù)響應(yīng)驗(yàn)證代理IP是否生效);

3、將可用的代理IP保存到數(shù)據(jù)庫(kù);

常用代理網(wǎng)站:西刺代理 、云代理 、IP海 、無(wú)憂(yōu)代理 、飛蟻代理 、快代理

三、代碼實(shí)現(xiàn)

工程結(jié)構(gòu)如下:

Python爬蟲(chóng)代理池搭建的方法步驟

ipproxy.py

IPProxy代理類(lèi)定義了要爬取的IP代理的字段信息和一些基礎(chǔ)方法。

# -*- coding: utf-8 -*-import reimport timefrom settings import PROXY_URL_FORMATTERschema_pattern = re.compile(r’http|https$’, re.I)ip_pattern = re.compile(r’^([0-9]{1,3}.){3}[0-9]{1,3}$’, re.I)port_pattern = re.compile(r’^[0-9]{2,5}$’, re.I)class IPProxy: ’’’ { 'schema': 'http', # 代理的類(lèi)型 'ip': '127.0.0.1', # 代理的IP地址 'port': '8050', # 代理的端口號(hào) 'used_total': 11, # 代理的使用次數(shù) 'success_times': 5, # 代理請(qǐng)求成功的次數(shù) 'continuous_failed': 3, # 使用代理發(fā)送請(qǐng)求,連續(xù)失敗的次數(shù) 'created_time': '2018-05-02' # 代理的爬取時(shí)間 } ’’’ def __init__(self, schema, ip, port, used_total=0, success_times=0, continuous_failed=0, created_time=None): '''Initialize the proxy instance''' if schema == '' or schema is None: schema = 'http' self.schema = schema.lower() self.ip = ip self.port = port self.used_total = used_total self.success_times = success_times self.continuous_failed = continuous_failed if created_time is None: created_time = time.strftime(’%Y-%m-%d’, time.localtime(time.time())) self.created_time = created_time def _get_url(self): ’’’ Return the proxy url’’’ return PROXY_URL_FORMATTER % {’schema’: self.schema, ’ip’: self.ip, ’port’: self.port} def _check_format(self): ’’’ Return True if the proxy fields are well-formed,otherwise return False’’’ if self.schema is not None and self.ip is not None and self.port is not None: if schema_pattern.match(self.schema) and ip_pattern.match(self.ip) and port_pattern.match(self.port):return True return False def _is_https(self): ’’’ Return True if the proxy is https,otherwise return False’’’ return self.schema == ’https’ def _update(self, successed=False): ’’’ Update proxy based on the result of the request’s response’’’ self.used_total = self.used_total + 1 if successed: self.continuous_failed = 0 self.success_times = self.success_times + 1 else: print(self.continuous_failed) self.continuous_failed = self.continuous_failed + 1if __name__ == ’__main__’: proxy = IPProxy(’HTTPS’, ’192.168.2.25’, '8080') print(proxy._get_url()) print(proxy._check_format()) print(proxy._is_https())

settings.py

settings.py中匯聚了工程所需要的配置信息。

# 指定Redis的主機(jī)名和端口REDIS_HOST = ’localhost’REDIS_PORT = 6379# 代理保存到Redis key 格式化字符串PROXIES_REDIS_FORMATTER = ’proxies::{}’# 已經(jīng)存在的HTTP代理和HTTPS代理集合PROXIES_REDIS_EXISTED = ’proxies::existed’# 最多連續(xù)失敗幾次MAX_CONTINUOUS_TIMES = 3# 代理地址的格式化字符串PROXY_URL_FORMATTER = ’%(schema)s://%(ip)s:%(port)s’USER_AGENT_LIST = [ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1', 'Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6', 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6', 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5', 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3', 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3', 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3', 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24', 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24']# 爬取到的代理保存前先檢驗(yàn)是否可用,默認(rèn)TruePROXY_CHECK_BEFOREADD = True# 檢驗(yàn)代理可用性的請(qǐng)求地址,支持多個(gè)PROXY_CHECK_URLS = {’https’:[’https://icanhazip.com’],’http’:[’http://icanhazip.com’]}

proxy_util.py

proxy_util.py 中主要定義了一些實(shí)用方法,例如:proxy_to_dict(proxy)用來(lái)將IPProxy代理實(shí)例轉(zhuǎn)換成字典;proxy_from_dict(d)用來(lái)將字典轉(zhuǎn)換為IPProxy實(shí)例;request_page()用來(lái)發(fā)送請(qǐng)求;_is_proxy_available()用來(lái)校驗(yàn)代理IP是否可用。

# -*- coding: utf-8 -*-import randomimport loggingimport requestsfrom ipproxy import IPProxyfrom settings import USER_AGENT_LIST, PROXY_CHECK_URLS# Setting logger output formatlogging.basicConfig(level=logging.INFO, format=’[%(asctime)-15s] [%(levelname)8s] [%(name)10s ] - %(message)s (%(filename)s:%(lineno)s)’, datefmt=’%Y-%m-%d %T’ )logger = logging.getLogger(__name__)def proxy_to_dict(proxy): d = { 'schema': proxy.schema, 'ip': proxy.ip, 'port': proxy.port, 'used_total': proxy.used_total, 'success_times': proxy.success_times, 'continuous_failed': proxy.continuous_failed, 'created_time': proxy.created_time } return ddef proxy_from_dict(d): return IPProxy(schema=d[’schema’], ip=d[’ip’], port=d[’port’], used_total=d[’used_total’], success_times=d[’success_times’], continuous_failed=d[’continuous_failed’], created_time=d[’created_time’])# Truncate header and tailer blanksdef strip(data): if data is not None: return data.strip() return database_headers = { ’Accept-Encoding’: ’gzip, deflate, br’, ’Accept-Language’: ’en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7’}def request_page(url, options={}, encoding=’utf-8’): '''send a request,get response''' headers = dict(base_headers, **options) if ’User-Agent’ not in headers.keys(): headers[’User-Agent’] = random.choice(USER_AGENT_LIST) logger.info(’正在抓取: ’ + url) try: response = requests.get(url, headers=headers) if response.status_code == 200: logger.info(’抓取成功: ’ + url) return response.content.decode(encoding=encoding) except ConnectionError: logger.error(’抓取失敗’ + url) return Nonedef _is_proxy_available(proxy, options={}): '''Check whether the Proxy is available or not''' headers = dict(base_headers, **options) if ’User-Agent’ not in headers.keys(): headers[’User-Agent’] = random.choice(USER_AGENT_LIST) proxies = {proxy.schema: proxy._get_url()} check_urls = PROXY_CHECK_URLS[proxy.schema] for url in check_urls: try: response = requests.get(url=url, proxies=proxies, headers=headers, timeout=5) except BaseException: logger.info('< ' + url + ' > 驗(yàn)證代理 < ' + proxy._get_url() + ' > 結(jié)果: 不可用 ') else: if response.status_code == 200:logger.info('< ' + url + ' > 驗(yàn)證代理 < ' + proxy._get_url() + ' > 結(jié)果: 可用 ')return True else:logger.info('< ' + url + ' > 驗(yàn)證代理 < ' + proxy._get_url() + ' > 結(jié)果: 不可用 ') return Falseif __name__ == ’__main__’: headers = dict(base_headers) if ’User-Agent’ not in headers.keys(): headers[’User-Agent’] = random.choice(USER_AGENT_LIST) proxies = {'https': 'https://163.125.255.154:9797'} response = requests.get('https://www.baidu.com', headers=headers, proxies=proxies, timeout=3) print(response.content)

proxy_queue.py

代理隊(duì)列用來(lái)保存并對(duì)外提供 IP代理,不同的代理隊(duì)列內(nèi)代理IP的保存和提取策略可以不同。在這里, BaseQueue 是所有代理隊(duì)列的基類(lèi),其中聲明了所有代理隊(duì)列都需要實(shí)現(xiàn)的保存代理IP、提取代理IP、查看代理IP數(shù)量等接口。示例的 FifoQueue 是一個(gè)先進(jìn)先出隊(duì)列,底層使用 Redis 列表實(shí)現(xiàn),為了確保同一個(gè)代理IP只能被放入隊(duì)列一次,這里使用了一個(gè)Redis proxies::existed 集合進(jìn)行入隊(duì)前重復(fù)校驗(yàn)。

# -*- coding: utf-8 -*-from proxy_util import loggerimport jsonimport redisfrom ipproxy import IPProxyfrom proxy_util import proxy_to_dict, proxy_from_dict, _is_proxy_availablefrom settings import PROXIES_REDIS_EXISTED, PROXIES_REDIS_FORMATTER, MAX_CONTINUOUS_TIMES, PROXY_CHECK_BEFOREADD'''Proxy Queue Base Class'''class BaseQueue(object): def __init__(self, server): '''Initialize the proxy queue instance Parameters ---------- server : StrictRedis Redis client instance ''' self.server = server def _serialize_proxy(self, proxy): '''Serialize proxy instance''' return proxy_to_dict(proxy) def _deserialize_proxy(self, serialized_proxy): '''deserialize proxy instance''' return proxy_from_dict(eval(serialized_proxy)) def __len__(self, schema=’http’): '''Return the length of the queue''' raise NotImplementedError def push(self, proxy, need_check): '''Push a proxy''' raise NotImplementedError def pop(self, schema=’http’, timeout=0): '''Pop a proxy''' raise NotImplementedErrorclass FifoQueue(BaseQueue): '''First in first out queue''' def __len__(self, schema=’http’): '''Return the length of the queue''' return self.server.llen(PROXIES_REDIS_FORMATTER.format(schema)) def push(self, proxy, need_check=PROXY_CHECK_BEFOREADD): '''Push a proxy''' if need_check and not _is_proxy_available(proxy): return elif proxy.continuous_failed < MAX_CONTINUOUS_TIMES and not self._is_existed(proxy): key = PROXIES_REDIS_FORMATTER.format(proxy.schema) self.server.rpush(key, json.dumps(self._serialize_proxy(proxy),ensure_ascii=False)) def pop(self, schema=’http’, timeout=0): '''Pop a proxy''' if timeout > 0: p = self.server.blpop(PROXIES_REDIS_FORMATTER.format(schema.lower()), timeout) if isinstance(p, tuple):p = p[1] else: p = self.server.lpop(PROXIES_REDIS_FORMATTER.format(schema.lower())) if p: p = self._deserialize_proxy(p) self.server.srem(PROXIES_REDIS_EXISTED, p._get_url()) return p def _is_existed(self, proxy): added = self.server.sadd(PROXIES_REDIS_EXISTED, proxy._get_url()) return added == 0if __name__ == ’__main__’: r = redis.StrictRedis(host=’localhost’, port=6379) queue = FifoQueue(r) proxy = IPProxy(’http’, ’218.66.253.144’, ’80’) queue.push(proxy) proxy = queue.pop(schema=’http’) print(proxy._get_url())

proxy_crawlers.py

ProxyBaseCrawler 是所有代理爬蟲(chóng)的基類(lèi),其中只定義了一個(gè) _start_crawl() 方法用來(lái)從搜集到的代理網(wǎng)站爬取代理IP。

# -*- coding: utf-8 -*-from lxml import etreefrom ipproxy import IPProxyfrom proxy_util import strip, request_page, loggerclass ProxyBaseCrawler(object): def __init__(self, queue=None, website=None, urls=[]): self.queue = queue self.website = website self.urls = urls def _start_crawl(self): raise NotImplementedErrorclass KuaiDailiCrawler(ProxyBaseCrawler): # 快代理 def _start_crawl(self): for url_dict in self.urls: logger.info('開(kāi)始爬取 [ ' + self.website + ' ] :::> [ ' + url_dict[’type’] + ' ]') has_more = True url = None while has_more:if ’page’ in url_dict.keys() and str.find(url_dict[’url’], ’{}’) != -1: url = url_dict[’url’].format(str(url_dict[’page’])) url_dict[’page’] = url_dict[’page’] + 1else: url = url_dict[’url’] has_more = Falsehtml = etree.HTML(request_page(url))tr_list = html.xpath('//table[@class=’table table-bordered table-striped’]/tbody/tr')for tr in tr_list: ip = tr.xpath('./td[@data-title=’IP’]/text()')[0] if len( tr.xpath('./td[@data-title=’IP’]/text()')) else None port = tr.xpath('./td[@data-title=’PORT’]/text()')[0] if len( tr.xpath('./td[@data-title=’PORT’]/text()')) else None schema = tr.xpath('./td[@data-title=’類(lèi)型’]/text()')[0] if len( tr.xpath('./td[@data-title=’類(lèi)型’]/text()')) else None proxy = IPProxy(schema=strip(schema), ip=strip(ip), port=strip(port)) if proxy._check_format(): self.queue.push(proxy)if tr_list is None: has_more = Falseclass FeiyiDailiCrawler(ProxyBaseCrawler): # 飛蟻代理 def _start_crawl(self): for url_dict in self.urls: logger.info('開(kāi)始爬取 [ ' + self.website + ' ] :::> [ ' + url_dict[’type’] + ' ]') has_more = True url = None while has_more:if ’page’ in url_dict.keys() and str.find(url_dict[’url’], ’{}’) != -1: url = url_dict[’url’].format(str(url_dict[’page’])) url_dict[’page’] = url_dict[’page’] + 1else: url = url_dict[’url’] has_more = Falsehtml = etree.HTML(request_page(url))tr_list = html.xpath('//div[@id=’main-content’]//table/tr[position()>1]')for tr in tr_list: ip = tr.xpath('./td[1]/text()')[0] if len(tr.xpath('./td[1]/text()')) else None port = tr.xpath('./td[2]/text()')[0] if len(tr.xpath('./td[2]/text()')) else None schema = tr.xpath('./td[4]/text()')[0] if len(tr.xpath('./td[4]/text()')) else None proxy = IPProxy(schema=strip(schema), ip=strip(ip), port=strip(port)) if proxy._check_format(): self.queue.push(proxy)if tr_list is None: has_more = Falseclass WuyouDailiCrawler(ProxyBaseCrawler): # 無(wú)憂(yōu)代理 def _start_crawl(self): for url_dict in self.urls: logger.info('開(kāi)始爬取 [ ' + self.website + ' ] :::> [ ' + url_dict[’type’] + ' ]') has_more = True url = None while has_more:if ’page’ in url_dict.keys() and str.find(url_dict[’url’], ’{}’) != -1: url = url_dict[’url’].format(str(url_dict[’page’])) url_dict[’page’] = url_dict[’page’] + 1else: url = url_dict[’url’] has_more = Falsehtml = etree.HTML(request_page(url))ul_list = html.xpath('//div[@class=’wlist’][2]//ul[@class=’l2’]')for ul in ul_list: ip = ul.xpath('./span[1]/li/text()')[0] if len(ul.xpath('./span[1]/li/text()')) else None port = ul.xpath('./span[2]/li/text()')[0] if len(ul.xpath('./span[2]/li/text()')) else None schema = ul.xpath('./span[4]/li/text()')[0] if len(ul.xpath('./span[4]/li/text()')) else None proxy = IPProxy(schema=strip(schema), ip=strip(ip), port=strip(port)) if proxy._check_format(): self.queue.push(proxy)if ul_list is None: has_more = Falseclass IPhaiDailiCrawler(ProxyBaseCrawler): # IP海代理 def _start_crawl(self): for url_dict in self.urls: logger.info('開(kāi)始爬取 [ ' + self.website + ' ] :::> [ ' + url_dict[’type’] + ' ]') has_more = True url = None while has_more:if ’page’ in url_dict.keys() and str.find(url_dict[’url’], ’{}’) != -1: url = url_dict[’url’].format(str(url_dict[’page’])) url_dict[’page’] = url_dict[’page’] + 1else: url = url_dict[’url’] has_more = Falsehtml = etree.HTML(request_page(url))tr_list = html.xpath('//table//tr[position()>1]')for tr in tr_list: ip = tr.xpath('./td[1]/text()')[0] if len(tr.xpath('./td[1]/text()')) else None port = tr.xpath('./td[2]/text()')[0] if len(tr.xpath('./td[2]/text()')) else None schema = tr.xpath('./td[4]/text()')[0] if len(tr.xpath('./td[4]/text()')) else None proxy = IPProxy(schema=strip(schema), ip=strip(ip), port=strip(port)) if proxy._check_format(): self.queue.push(proxy)if tr_list is None: has_more = Falseclass YunDailiCrawler(ProxyBaseCrawler): # 云代理 def _start_crawl(self): for url_dict in self.urls: logger.info('開(kāi)始爬取 [ ' + self.website + ' ] :::> [ ' + url_dict[’type’] + ' ]') has_more = True url = None while has_more:if ’page’ in url_dict.keys() and str.find(url_dict[’url’], ’{}’) != -1: url = url_dict[’url’].format(str(url_dict[’page’])) url_dict[’page’] = url_dict[’page’] + 1else: url = url_dict[’url’] has_more = Falsehtml = etree.HTML(request_page(url, encoding=’gbk’))tr_list = html.xpath('//table/tbody/tr')for tr in tr_list: ip = tr.xpath('./td[1]/text()')[0] if len(tr.xpath('./td[1]/text()')) else None port = tr.xpath('./td[2]/text()')[0] if len(tr.xpath('./td[2]/text()')) else None schema = tr.xpath('./td[4]/text()')[0] if len(tr.xpath('./td[4]/text()')) else None proxy = IPProxy(schema=strip(schema), ip=strip(ip), port=strip(port)) if proxy._check_format(): self.queue.push(proxy)if tr_list is None: has_more = Falseclass XiCiDailiCrawler(ProxyBaseCrawler): # 西刺代理 def _start_crawl(self): for url_dict in self.urls: logger.info('開(kāi)始爬取 [ ' + self.website + ' ] :::> [ ' + url_dict[’type’] + ' ]') has_more = True url = None while has_more:if ’page’ in url_dict.keys() and str.find(url_dict[’url’], ’{}’) != -1: url = url_dict[’url’].format(str(url_dict[’page’])) url_dict[’page’] = url_dict[’page’] + 1else: url = url_dict[’url’] has_more = Falsehtml = etree.HTML(request_page(url))tr_list = html.xpath('//table[@id=’ip_list’]//tr[@class!=’subtitle’]')for tr in tr_list: ip = tr.xpath('./td[2]/text()')[0] if len(tr.xpath('./td[2]/text()')) else None port = tr.xpath('./td[3]/text()')[0] if len(tr.xpath('./td[3]/text()')) else None schema = tr.xpath('./td[6]/text()')[0] if len(tr.xpath('./td[6]/text()')) else None if schema.lower() == 'http' or schema.lower() == 'https': proxy = IPProxy(schema=strip(schema), ip=strip(ip), port=strip(port)) if proxy._check_format(): self.queue.push(proxy)if tr_list is None: has_more = False

run.py

通過(guò)run.py啟動(dòng)各個(gè)代理網(wǎng)站爬蟲(chóng)。

# -*- coding: utf-8 -*-import redisfrom proxy_queue import FifoQueuefrom settings import REDIS_HOST, REDIS_PORTfrom proxy_crawlers import WuyouDailiCrawler, FeiyiDailiCrawler, KuaiDailiCrawler, IPhaiDailiCrawler, YunDailiCrawler, XiCiDailiCrawlerr = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)fifo_queue = FifoQueue(r)def run_kuai(): kuaidailiCrawler = KuaiDailiCrawler(queue=fifo_queue, website=’快代理[國(guó)內(nèi)高匿]’, urls=[{’url’: ’https://www.kuaidaili.com/free/inha/{}/’, ’type’: ’國(guó)內(nèi)高匿’,’page’: 1}, {’url’: ’https://www.kuaidaili.com/free/intr/{}/’, ’type’: ’國(guó)內(nèi)普通’,’page’: 1}]) kuaidailiCrawler._start_crawl()def run_feiyi(): feiyidailiCrawler = FeiyiDailiCrawler(queue=fifo_queue, website=’飛蟻代理’, urls=[{’url’: ’http://www.feiyiproxy.com/?page_id=1457’, ’type’: ’首頁(yè)推薦’}]) feiyidailiCrawler._start_crawl()def run_wuyou(): wuyoudailiCrawler = WuyouDailiCrawler(queue=fifo_queue, website=’無(wú)憂(yōu)代理’, urls=[{’url’: ’http://www.data5u.com/free/index.html’, ’type’: ’首頁(yè)推薦’},{’url’: ’http://www.data5u.com/free/gngn/index.shtml’, ’type’: ’國(guó)內(nèi)高匿’},{’url’: ’http://www.data5u.com/free/gnpt/index.shtml’, ’type’: ’國(guó)內(nèi)普通’}]) wuyoudailiCrawler._start_crawl()def run_iphai(): crawler = IPhaiDailiCrawler(queue=fifo_queue, website=’IP海代理’,urls=[{’url’: ’http://www.iphai.com/free/ng’, ’type’: ’國(guó)內(nèi)高匿’}, {’url’: ’http://www.iphai.com/free/np’, ’type’: ’國(guó)內(nèi)普通’}, {’url’: ’http://www.iphai.com/free/wg’, ’type’: ’國(guó)外高匿’}, {’url’: ’http://www.iphai.com/free/wp’, ’type’: ’國(guó)外普通’}]) crawler._start_crawl()def run_yun(): crawler = YunDailiCrawler(queue=fifo_queue, website=’云代理’, urls=[{’url’: ’http://www.ip3366.net/free/?stype=1&page={}’, ’type’: ’國(guó)內(nèi)高匿’, ’page’: 1}, {’url’: ’http://www.ip3366.net/free/?stype=2&page={}’, ’type’: ’國(guó)內(nèi)普通’, ’page’: 1}, {’url’: ’http://www.ip3366.net/free/?stype=3&page={}’, ’type’: ’國(guó)外高匿’, ’page’: 1}, {’url’: ’http://www.ip3366.net/free/?stype=4&page={}’, ’type’: ’國(guó)外普通’, ’page’: 1}]) crawler._start_crawl()def run_xici(): crawler = XiCiDailiCrawler(queue=fifo_queue, website=’西刺代理’,urls=[{’url’: ’https://www.xicidaili.com/’, ’type’: ’首頁(yè)推薦’}, {’url’: ’https://www.xicidaili.com/nn/{}’, ’type’: ’國(guó)內(nèi)高匿’, ’page’: 1}, {’url’: ’https://www.xicidaili.com/nt/{}’, ’type’: ’國(guó)內(nèi)普通’, ’page’: 1}, {’url’: ’https://www.xicidaili.com/wn/{}’, ’type’: ’國(guó)外高匿’, ’page’: 1}, {’url’: ’https://www.xicidaili.com/wt/{}’, ’type’: ’國(guó)外普通’, ’page’: 1}]) crawler._start_crawl()if __name__ == ’__main__’: run_xici() run_iphai() run_kuai() run_feiyi() run_yun() run_wuyou()

爬取西刺代理時(shí),后臺(tái)日志示例如下:

Python爬蟲(chóng)代理池搭建的方法步驟

Redis數(shù)據(jù)庫(kù)中爬取到的代理IP的數(shù)據(jù)結(jié)構(gòu)如下:

Python爬蟲(chóng)代理池搭建的方法步驟

四、代理測(cè)試

接下來(lái),使用爬取好的代理來(lái)請(qǐng)求 http://icanhazip.com 進(jìn)行測(cè)試,代碼如下:

# -*- coding: utf-8 -*-import randomimport requestsfrom proxy_util import loggerfrom run import fifo_queuefrom settings import USER_AGENT_LISTfrom proxy_util import base_headers# 測(cè)試地址url = ’http://icanhazip.com’# 獲取代理proxy = fifo_queue.pop(schema=’http’)proxies = {proxy.schema:proxy._get_url()}# 構(gòu)造請(qǐng)求頭headers = dict(base_headers)if ’User-Agent’ not in headers.keys(): headers[’User-Agent’] = random.choice(USER_AGENT_LIST)response = Nonesuccessed = Falsetry: response = requests.get(url,headers=headers,proxies = proxies,timeout=5)except BaseException: logger.error('使用代理< '+proxy._get_url()+' > 請(qǐng)求 < '+url+' > 結(jié)果: 失敗 ')else: if (response.status_code == 200): logger.info(response.content.decode()) successed = True logger.info('使用代理< ' + proxy._get_url() + ' > 請(qǐng)求 < ' + url + ' > 結(jié)果: 成功 ') else: logger.info(response.content.decode()) logger.info('使用代理< ' + proxy._get_url() + ' > 請(qǐng)求 < ' + url + ' > 結(jié)果: 失敗 ')# 根據(jù)請(qǐng)求的響應(yīng)結(jié)果更新代理proxy._update(successed)# 將代理返還給隊(duì)列,返還時(shí)不校驗(yàn)可用性fifo_queue.push(proxy,need_check=False)

使用 http://218.66.253.144:80 代理請(qǐng)求成功后將代理重新放回隊(duì)列,并將 Redis 中該代理的 used_total 、success_times 、continuous_failed三個(gè)字段信息進(jìn)行了相應(yīng)的更新。

Python爬蟲(chóng)代理池搭建的方法步驟

項(xiàng)目地址:https://github.com/pengjunlee/ipproxy_pool.git

到此這篇關(guān)于Python爬蟲(chóng)代理池搭建的方法步驟的文章就介紹到這了,更多相關(guān)Python爬蟲(chóng)代理池搭建內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 日本久久网 | 天天爽天天操 | 国产精品久久久一区二区三区 | 中国国产一级毛片 | 国产1区2区 | 日本色站| 欧美嘿咻 | 欧美一级视频在线观看 | 成人欧美一区二区 | 97国产精品视频人人做人人爱 | www久久精品 | 国内自拍视频在线观看 | 亚洲精品国产第一综合99久久 | 日韩精品专区在线影院重磅 | 日韩av免费看| 蜜臀影院| 久久黄视频 | 色婷婷av一区二区三区大白胸 | 国产精品亚洲视频 | av三级在线观看 | 亚洲男人天堂网 | 亚洲性在线 | 久久久久久国产精品高清 | 国产伦精品一区二区三区四区视频 | 一区免费视频 | 亚洲网在线 | 久久国产一区 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美一级片在线观看 | 亚洲精品中文字幕乱码无线 | 免费一区二区三区 | 成人在线免费视频 | 97国产在线视频 | 黄色在线 | 欧美在线观看黄 | 国产精品夜夜春夜夜爽久久电影 | 国产亚洲女人久久久久毛片 | 一级黄色片视频 | 国产免费自拍 | 百性阁综合另类 | 欧美日韩中文字幕 | 国产成人综合网 | 久久精品99 | 精品视频在线观看一区二区三区 | 人人鲁人人莫一区二区三区 | 四虎影院最新地址 | 精品一区久久 | 久久伊人av | 成人久久精品 | 午夜精品久久久久久久白皮肤 | 草樱av| 亚洲一区中文字幕 | 日韩一区二区三区在线 | 欧美日韩大陆 | 免费一区二区三区 | 狠狠躁夜夜躁人人爽天天高潮 | 色视频www在线播放国产人成 | 国产亚洲精品v | 美女在线视频一区二区 | 91精品国产综合久久久久久 | 国产超碰在线观看 | 成人羞羞网站 | 在线视频 亚洲 | 一区二区三区日韩 | 日韩视频在线不卡 | 乳色吐息在线观看 | 欧美一区三区 | 亚洲国产欧美91 | 成人精品一区 | 综合久久99 | 一区二区免费视频 | 中文字幕1区 | 国产精品a一区二区三区网址 | 国产一区二区三区在线 | 国产香蕉视频在线播放 | 免费观看视频www | 欧美一级在线免费观看 | 国产成人在线视频 | 成人一区二区在线 | 久草免费在线视频 | 中文字幕一区二区三区乱码图片 | 国产中文字幕一区 | 成人区一区二区三区 | 亚洲国产精品va在线看黑人 | 亚洲人成人一区二区在线观看 | 亚洲成人第一 | 国产精品高清在线 | 精品一区二区三区免费毛片爱 | 久久久精品久久久久 | 级毛片| 亚洲欧洲精品视频 | 国产精品久久久久久久粉嫩 | 成人深夜在线 | 欧美成人一区二区三区片免费 | 国产高清久久久 | 免费毛片一区二区三区久久久 | 一级免费毛片 | 欧美精品一区在线发布 | 久久精彩视频 | av手机电影| 天天操天天操 | 亚洲高清视频在线 | 黄色小视频在线观看 | 完全免费av | 视频一区二区三区免费观看 | 亚洲成av人片一区二区梦乃 | 久草视频在线播放 | 天堂中文av在线 | 成年人免费网站 | 成人亚洲在线观看 | 国产福利一区二区三区视频 | 国产色区 | 国产乱码精品一区二区三区忘忧草 | 蜜月久综合久久综合国产 | 免费毛片在线播放 | 国产精品成人久久久久 | 亚洲精品久久久 | 亚洲一区中文字幕在线观看 | 蜜桃视频在线观看www社区 | 成人午夜精品一区二区三区 | 亚洲综合区 | 国产日韩精品在线 | 一区二区不卡视频在线观看 | 成人日韩 | 国产乱xxxxx97国语对白 | 在线视频久 | 国产激情视频在线 | 在线观看中文字幕 | 国产免费一区二区三区最新不卡 | jlzzjlzz国产精品久久 | 精品国产91乱码一区二区三区 | 在线视频日韩 | 久久精品不卡 | 精品无码久久久久国产 | 国产91在线观看 | 色婷婷一区二区三区 | 国产成人精品综合 | 毛片天堂| 午夜免费小视频 | 日韩欧洲亚洲 | 国产传媒一区 | www.久久久久| 国产高清一区二区 | 91香蕉视频在线观看 | 国产精品久久久久久久久久久久久久久久 | 超碰人人爽 | 越南性xxxx精品hd | 国产午夜精品一区二区三区 | 国产亚洲综合一区二区 | 精品久久电影 | 国产美女中出 | 亚洲第一成年免费网站 | 久久久网 | 亚洲国产精品久久 | 欧美一级在线观看 | 一级片免费在线视频 | 成人在线免费 | 日韩专区视频 | 国产中文字幕在线播放 | 国产精品免费一区二区三区四区 | 国产精品乱码一区二区三区 | 综合网亚洲 | 特黄一级| 91丨九色丨国产在线 | 精品国产乱码久久久久久88av | 欧美精品一区二区三区在线 | 亚洲啊v | 国产精品久久久久久久久久新婚 | 日韩在线免费观看视频 | 国产第一亚洲 | 亚洲视频观看 | 国产精品美女久久久久aⅴ国产馆 | 影音先锋在线看片资源 | 激情六月综合 | 在线观看成人 | 久久国内精品 | www.日韩三级 | 日韩成人精品 | 久久久综合网 | 青草成人免费视频 | 国产精品欧美一区二区三区 | 在线观看亚洲一区二区 | 欧美一级高清在线 | 91麻豆精品国产91久久久更新资源速度超快 | 天天操操 | 精品国产综合 | 一区二区视频 | www.9191 | 伊人无码高清 | 国产精品美女久久久 | 精品无码久久久久国产 | 色婷网 | 草视频在线 | 国产91网址 | 国产精品99久久 | 午夜亚洲 | 中文字幕亚洲一区二区三区 | 在线播放亚洲 | 国产色视频在线观看免费 | 一级电影在线观看 | 午夜免费视频 | 五月天婷婷色综合 | 亚洲精品一区二区三区 | 亚洲三级av| 欧美日韩一区二区三区在线观看 | 国产一区视频在线 | 欧美成人三区 | 香蕉成人啪国产精品视频综合网 | 亚洲在线观看免费视频 | 亚洲精品成人悠悠色影视 | 国产精品二区一区 | 69热在线观看 | 欧美精品福利 | 亚洲精品99| 亚洲不卡视频在线观看 | 久久伊人久久 | 国产99页| 亚洲免费在线观看 | 亚洲欧美激情在线 | 日韩中文一区 | 午夜在线观看 | 亚洲欧洲在线观看 | 欧美日韩精品亚洲 | 欧美一区二区在线播放 | 精品国产31久久久久久 | 91av在线视频播放 | 91香蕉视频 | 日本不卡视频 | 日韩在线视频资源 | 一区视频 | 国产精品久久久久久久久免费桃花 | 日本一区二区三区四区 | 一区二区三区免费网站 | 一区二区三区日本 | 国产精品久久久久9999赢消 | www.狠狠干| 欧美视频在线免费 | 三级黄色片在线观看 | 欧美日韩啪啪 | 日韩久久成人 | 亚洲一二三 | 日韩精品视频在线观看一区二区 | 久久久亚洲 | 久草院线 | 欧美日韩一区精品 | 特一级黄色片 | 国产99久久 | 欧美国产高清 | 成人黄色电影小说 | 国产精品久久久久久久久免费 | 嫩草成人影院 | 91一级 | 欧美一区二区三区爽大粗免费 | av黄色一级片 | 欧美日韩国产精品 | 日韩欧美在线免费观看 | 日韩精品一区二区三区 | 国产精品永久免费 | 日韩免费一区 | 黄色大片网站在线观看 | 午夜精品视频在线观看 | 久久久久中文字幕 | www狠狠干 | 精品在线一区 | a级毛片黄| 99精品一区二区三区 | 亚洲国产高清在线 | 国产中文字幕一区 | 国产成人精品一区二区三区四区 | 天堂中文字幕 | 国产视频色| 天天插天天射天天干 | 欧美第7页| 日韩在线一区二区三区 | 超碰人人爽 | 久久亚洲一区二区 | 最新国产在线 | 伊人青青草 | 欧美一区二区伦理片 | 九九热这里只有精品在线观看 | 少妇久久久| 亚洲一二三区电影 | 精品三区在线观看 | 欧美a一级| 99riav国产一区二区三区 | 成人乱人乱一区二区三区 | 久久高潮| 精品久久久久久 | www.日本精品| 欧美一区二区三区 | 国产精品欧美日韩在线观看 | 久久伊人官网 | 成人免费视频在线观看 | 国产精品一二三区视频 | 99久久日韩精品视频免费在线观看 | 99久久视频 | 欧美日一区二区 | 亚洲精品乱码久久久久久国产主播 | 亚洲色图综合 | 精品亚洲一区二区 | 欧美精品乱码久久久久久按摩 | 91色电影| 亚洲欧美日韩在线一区二区 | 久久综合色88 | 久久久久久久一区二区三区 | 国产精品第一国产精品 | 成人在线免费视频 | 免费成人高清 | 欧美一区中文字幕 | 天天操天天添 | 亚洲欧美福利视频 | 精品久久久久久久久久久久久久久久久久久 | 在线播放国产一区二区三区 | 超碰最新网址 | 狠狠夜夜 | 久久9999| 国产精品国色综合久久 | 九色91视频 | 国产精品久久电影观看 | 日韩av在线不卡 | 亚洲高清在线视频 | 91精品国产一区二区三区香蕉 | 国产日韩免费视频 | 亚洲国产精品自拍 | 国产一区二区三区在线免费 | 国产精品18久久久久久久久久久久 | 韩国精品主播一区二区在线观看 | 日韩欧美一区二区三区免费观看 | 91中文字幕在线观看 | 亚洲欧洲成人 | 欧美一级一区 | 久草免费在线 | 在线观看三级av | www操com | 久久久久国产 | 亚洲欧美韩国 | 午夜影院a | 成人精品久久 | 成人精品一区 | 色综合天天综合网国产成人网 | 日韩欧美第一页 | 久久九 | 亚洲美女视频一区二区三区 | 色www精品视频在线观看 | 国产精品久久久久久亚洲调教 | 成人午夜在线 | 中文在线视频 | 欧美成人一区二区 | 亚洲第一av | 成人激情视频在线观看 | sese综合 | 国产成人天天爽高清视频 | 日韩不卡一二三 | 一区二区三区四区久久 | 在线观看一区 | 男人的天堂久久 | www日韩 | 久久天堂 | www.成人在线视频 | 日韩一区精品视频 | 欧美精品在线观看 | 国产成人免费在线观看 | 亚洲精品乱码久久久久久按摩观 | 成人国产精品久久 | 日本在线观看 | 日韩在线中文 | 国产一二三区在线观看 | 国产精品天天干 | 日本五月婷婷 | 在线观看精品91福利 | 国产一区二区视频在线播放 | 精品一区av | 九九在线视频 | 色丁香婷婷 | 亚洲成人av一区二区三区 | 91久久国产精品 | 国产精品成人久久久久 | 黄色高清视频 | 精品视频在线观看一区二区三区 | 日本黄色一级片视频 | www.伊人.com| 中文二区 | 在线视频 亚洲 | 亚洲国产精品久久 | 呦呦在线观看 | 电影91 | 欧美黑人一级爽快片淫片高清 | 国产香蕉97碰碰久久人人九色 | 亚洲精品www| 亚洲国产精品久久久久婷婷老年 | 我爱操| 欧美国产一区二区 | 亚洲欧美视频 | 亚洲一区二区三区免费在线 | 亚洲精品国产剧情久久9191 | 天天干国产 | 日韩成人在线一区 | wwwjizz日本| 黑人巨大精品欧美黑白配亚洲 | 中文字幕一区二区三区免费视频 | 亚洲男人天堂网 | 伊人网网站 | 亚洲视频在线一区 | 国产精品ssss在线亚洲 | 毛片免费在线 | 色视频网站在线观看 | 中文在线一区二区 | www.久久精品视频 | 看a网址 | 香蕉视频黄色 | 亚洲综合电影 | 久久久久久久久99精品 | 欧美日韩一区免费 | 日本福利视频网 | 国产一区二区三区精品久久久 | 欧美日本国产一区 | 日韩免费高清视频 | 国产日韩精品视频 | 日本高清视频在线播放 | 免费国产黄网站在线观看视频 | 久久久久一区 | 91亚洲免费| 91精品久久久久久久99 | 成人一区视频 | 欧美精品第十页 | 日本三级中国三级99人妇网站 | www一起操 | www.色涩涩.com网站 | 亚洲av毛片 | 欧美日韩电影一区二区三区 | a级黄色在线观看 | 欧美日韩精品久久 | 久久久久国产精品 | 久久这里只有精品首页 | 欧美成人免费在线观看 | 极品久久 | 91久久久久久久 | 一区二区三区四区不卡视频 | 玖玖综合网 | 欧美日韩中文字幕在线 | 毛片免费观看视频 | 99久草| 久久精品国产亚卅av嘿嘿 | 久久999 | 日本久久久亚洲精品 | 精品日韩欧美一区二区在线播放 | 国产成人高清 | 福利社午夜影院 | 一区在线观看 | 国产精品久久久久久久久久久久久久 | 色综合久久网 | 99精品99 | 精品视频一区二区 | 久久精品久久久久久 | 欧美精品一区二区三区蜜臀 | 久久精品久久久久电影 | 中文字幕日韩欧美一区二区三区 | 欧美日韩综合精品 | 黄色国产一级视频 | 免费成人高清在线视频 | 国产一级特黄aaa大片评分 | 亚洲国产精品99久久久久久久久 | 欧美一区二区三 | 欧美美乳 | 理论片一区 | 中文字幕爱爱视频 | 欧美激情一区二区三区在线视频 | 午夜精品成人一区二区 | www.国产在线 | 天天插天天干 | 日韩欧美一区二区三区视频 | 亚洲欧洲精品一区二区 | 粉嫩在线 | 国产激情一区二区三区 | 欧美一区二区在线播放 | 欧美激情视频一区二区三区在线播放 | 久久青 | 精品福利av导航 | 精品99久久久久久 | 亚洲人人舔人人 | 可以在线观看的av网站 | 色综合色综合 | 97夜夜操| 成人在线免费观看 | 久久久久精 | 国产xxxx精品 | 91午夜激情| 麻豆国产免费 | 成a人片在线观看 | 欧美激情国产日韩精品一区18 | 91日韩精品一区二区三区 | 一区二区中文字幕 | 99精品视频在线观看 | 91精品国产欧美一区二区成人 | 日韩中文一区二区三区 | 精品一区二区免费视频 | 黄色精品视频 | 一本岛在线视频 | 波多野结衣一区二区三区高清 | 亚洲一区二区三区久久 | 国产成人免费视频网站高清观看视频 | 青青久在线视频 | 女同理伦片在线观看禁男之园 | 日本一区二区三区四区不卡视频 | 国产一区二区三区在线视频 | 久久久久一区 | 国产欧美精品一区二区三区四区 | 九九热在线免费视频 | 一区二区中文 | 欧美一区二区三区男人的天堂 | 91高清视频在线观看 | 毛片视频观看 | 欧洲一级毛片 | 欧美一区久久 | 国产成人综合在线 | 国产精品一区二区三区四区五区 | 色婷婷国产精品综合在线观看 | 成人一区二区三区久久精品嫩草 | 99精品久久| 在线视频一区二区三区 | 国产高清视频一区二区 | 亚洲精品乱码久久久久久花季 | 久久国产一区二区 | 日本成人中文字幕 | 精品亚洲自拍 | 成人精品国产 | 精品久 | 天天爽夜夜爽 | 国产中文字幕在线 | 国产精品网站在线 | 在线播放黄色片网站 | 国产成人精品久久二区二区 | 亚洲人免费| 91干在线观看 | 欧美日韩亚洲二区 | 日韩一区二区三区在线 | 日韩中文字 | 欧美在线亚洲 | 91麻豆久久久 | 欧美喷潮久久久xxxxx | 亚洲视频中文字幕 | 日本不卡一区二区 | 欧美国产一区二区三区 | 亚洲电影免费 | 亚洲大奶网 | 久久久久国产一级毛片高清版小说 | 国产一区二区精品在线 | 国产一区二区三区在线看 | 国产激情偷乱视频一区二区三区 | 狠狠色综合欧美激情 | 亚洲一区视频在线 | 成人免费视频播放 | 天天综合欧美 | 国产色99精品9i | 日韩精品免费观看 | 波多野结衣 一区二区三区 精品精品久久 | 精品96久久久久久中文字幕无 | 国产一区二区三区免费观看 | 成人免费视频网站在线看 | 国产三级精品在线 | 色综合99 | 日韩特黄一级欧美毛片特黄 | 一区二区在线视频 | 日韩中文字幕在线观看 | 密色视频 | 亚洲自拍偷拍欧美 | 日韩毛片免费看 | 特黄视频 | 久久99精品视频在线观看 | 国产精品九九九 | 韩日视频在线观看 | 成人国产精品久久久 | 久久久美女 | 国产精品欧美久久久久一区二区 | 成人看片免费网站 | 香蕉视频91 | 美女久久 | 亚洲精品在线网站 | 蜜桃视频一区二区三区 | 国产成人综合一区二区三区 | 91在线视频免费播放 | 99久草| 午夜免费剧场 | 北条麻妃99精品青青久久主播 | 日本中文字幕一区二区 | 日韩一区二区不卡 | 亚洲成人在线视频播放 | 国产丝袜一区二区三区免费视频 | 91亚洲国产成人久久精品网站 | 97国产超碰 | 99精品一区 | 亚洲精品乱码久久久久久蜜桃不爽 | www久久精品| 中文字幕日韩在线 | 在线精品亚洲 | 国产精品久久久精品 | 亚洲人成人一区二区在线观看 | 国产精选一区二区三区不卡催乳 | 成人精品视频在线观看 | 成人av片在线观看 | 另类一区 | 在线免费色视频 | 成年人视频在线免费观看 | www.久久久 | 国产精品成av人在线视午夜片 | 欧美日本一区二区三区 | av黄色一级| 欧美激情一区二区三级高清视频 | 亚洲国产精品自拍 | 日韩精品一二区 | 6080yy午夜一二三区久久 | 中文字字幕一区二区三区四区五区 | 午夜老湿影院 | 久久国产一区二区三区 | 最新天堂中文在线 |