【用線程池并發檢驗代理有效性】
<code>#encoding=utf-8</code>
<code>#author: walker</code>
<code>#date: 2016-04-14</code>
<code>#summary: 用線程池并發檢驗代理有效性</code>
<code>import</code> <code>os, sys, time</code>
<code>import</code> <code>requests</code>
<code>from</code> <code>concurrent </code><code>import</code> <code>futures</code>
<code>cur_dir_fullpath </code><code>=</code> <code>os.path.dirname(os.path.abspath(__file__))</code>
<code>Headers </code><code>=</code> <code>{</code>
<code> </code><code>'Accept'</code><code>: </code><code>'*/*'</code><code>,</code>
<code> </code><code>'User-Agent'</code><code>: </code><code>'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)'</code><code>,</code>
<code> </code><code>}</code>
<code> </code>
<code>#檢驗單個代理的有效性</code>
<code>#如果有效,傳回該proxy;否則,傳回空字元串</code>
<code>def</code> <code>Check(desturl, proxy, feature):</code>
<code> </code><code>proxies </code><code>=</code> <code>{</code><code>'http'</code><code>: </code><code>'http://'</code> <code>+</code> <code>proxy}</code>
<code> </code><code>proxies </code><code>=</code> <code>{</code>
<code> </code><code>'http'</code><code>: proxy,</code>
<code> </code><code>'https'</code><code>: proxy</code>
<code> </code><code>r </code><code>=</code> <code>None</code> <code>#聲明</code>
<code> </code><code>exMsg </code><code>=</code> <code>None</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>r </code><code>=</code> <code>requests.get(url</code><code>=</code><code>desturl, headers</code><code>=</code><code>Headers, proxies</code><code>=</code><code>proxies, timeout</code><code>=</code><code>3</code><code>)</code>
<code> </code><code>except</code><code>:</code>
<code> </code><code>exMsg </code><code>=</code> <code>'* '</code> <code>+</code> <code>traceback.format_exc()</code>
<code> </code><code>#print(exMsg)</code>
<code> </code><code>finally</code><code>:</code>
<code> </code><code>if</code> <code>'r'</code> <code>in</code> <code>locals</code><code>() </code><code>and</code> <code>r:</code>
<code> </code><code>r.close()</code>
<code> </code>
<code> </code><code>if</code> <code>exMsg:</code>
<code> </code><code>return</code> <code>''</code>
<code> </code><code>if</code> <code>r.status_code !</code><code>=</code> <code>200</code><code>:</code>
<code> </code><code>return</code> <code>'' </code>
<code> </code><code>if</code> <code>r.content.decode(</code><code>'utf8'</code><code>).find(feature) < </code><code>0</code><code>:</code>
<code> </code>
<code> </code><code>return</code> <code>proxy</code>
<code>#輸入代理清單(set/list),傳回有效代理清單</code>
<code>def</code> <code>GetValidProxyPool(rawProxyPool, desturl, feature):</code>
<code> </code><code>validProxyList </code><code>=</code> <code>list</code><code>() </code><code>#有效代理清單</code>
<code> </code><code>pool </code><code>=</code> <code>futures.ThreadPoolExecutor(</code><code>8</code><code>)</code>
<code> </code><code>futureList </code><code>=</code> <code>list</code><code>()</code>
<code> </code><code>for</code> <code>proxy </code><code>in</code> <code>rawProxyPool:</code>
<code> </code><code>futureList.append(pool.submit(Check, desturl, proxy, feature))</code>
<code> </code><code>print</code><code>(</code><code>'\n submit done, waiting for responses\n'</code><code>)</code>
<code> </code><code>for</code> <code>future </code><code>in</code> <code>futures.as_completed(futureList):</code>
<code> </code><code>proxy </code><code>=</code> <code>future.result()</code>
<code> </code><code>print</code><code>(</code><code>'proxy:'</code> <code>+</code> <code>proxy)</code>
<code> </code><code>if</code> <code>proxy: </code><code>#有效代理 </code>
<code> </code><code>validProxyList.append(proxy) </code>
<code> </code><code>print</code><code>(</code><code>'validProxyList size:'</code> <code>+</code> <code>str</code><code>(</code><code>len</code><code>(validProxyList)))</code>
<code> </code><code>return</code> <code>validProxyList</code>
<code>#擷取原始代理池</code>
<code>def</code> <code>GetRawProxyPool():</code>
<code> </code><code>rawProxyPool </code><code>=</code> <code>set</code><code>()</code>
<code> </code><code>#通過某種方式擷取原始代理池......</code>
<code> </code><code>return</code> <code>rawProxyPool</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>
<code> </code><code>rawProxyPool </code><code>=</code> <code>GetRawProxyPool()</code>
<code> </code><code>desturl </code><code>=</code> <code>'http://...'</code> <code>#需要通過代理通路的目标位址</code>
<code> </code><code>feature </code><code>=</code> <code>'xxx'</code> <code>#目标網頁的特征碼</code>
<code> </code><code>validProxyPool </code><code>=</code> <code>GetValidProxyPool(rawProxyPool, desturl, feature)</code>
【用協程并發檢驗代理有效性】
<code>#date: 2017-03-28</code>
<code>#summary: 用協程并發檢驗代理有效性</code>
<code>#Python sys.version:3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]</code>
<code>import</code> <code>aiohttp</code>
<code>import</code> <code>asyncio</code>
<code>import</code> <code>traceback</code>
<code> </code>
<code>async </code><code>def</code> <code>Check(desturl, proxy, feature):</code>
<code> </code><code>proxy </code><code>=</code> <code>'http://'</code> <code>+</code> <code>proxy</code>
<code> </code><code>#print('proxy:' + proxy)</code>
<code> </code><code>async with aiohttp.ClientSession() as session:</code>
<code> </code><code>async with session.get(desturl, headers</code><code>=</code><code>Headers, proxy</code><code>=</code><code>proxy, timeout</code><code>=</code><code>10</code><code>) as resp:</code>
<code> </code><code>#print(resp.status)</code>
<code> </code><code>assert</code> <code>resp.status </code><code>=</code><code>=</code> <code>200</code>
<code> </code><code>#print(await resp.text())</code>
<code> </code><code>html </code><code>=</code> <code>await resp.text(encoding</code><code>=</code><code>'utf-8'</code><code>)</code>
<code> </code><code>if</code> <code>html.find(feature) < </code><code>0</code><code>:</code>
<code> </code>
<code> </code>
<code>async </code><code>def</code> <code>GetValidProxyPool(rawProxyPool, desturl, feature):</code>
<code> </code><code>print</code><code>(</code><code>'GetValidProxyPool ...'</code><code>)</code>
<code> </code><code>validProxyList </code><code>=</code> <code>list</code><code>() </code><code>#有效代理清單 </code>
<code> </code><code>coroList </code><code>=</code> <code>list</code><code>()</code>
<code> </code><code>coroList.append(asyncio.ensure_future((Check(desturl, proxy, feature)))) </code>
<code> </code><code>totalSleepTime </code><code>=</code> <code>0</code>
<code> </code><code>for</code> <code>f </code><code>in</code> <code>asyncio.as_completed(coroList):</code>
<code> </code><code>proxy </code><code>=</code> <code>await f</code>
<code> </code><code>#print('rtn proxy:' + proxy)</code>
<code> </code><code>if</code> <code>proxy:</code>
<code> </code><code>validProxyList.append(proxy)</code>
<code> </code><code>print</code><code>(</code><code>'validProxyList size: %d'</code> <code>%</code> <code>len</code><code>(validProxyList))</code>
<code> </code><code>startTime </code><code>=</code> <code>time.time()</code>
<code> </code><code>print</code><code>(</code><code>'rawProxyPool size:%d'</code> <code>%</code> <code>len</code><code>(rawProxyPool))</code>
<code> </code><code>loop </code><code>=</code> <code>asyncio.get_event_loop()</code>
<code> </code><code>validProxyList </code><code>=</code> <code>loop.run_until_complete(GetValidProxyPool(rawProxyPool, desturl, feature))</code>
<code> </code><code>loop.close()</code>
<code> </code><code>print</code><code>(</code><code>'rawProxyPool size:%d'</code> <code>%</code> <code>len</code><code>(validProxyList))</code>
<code> </code><code>print</code><code>(</code><code>'time cost:%.2fs'</code> <code>%</code> <code>(time.time()</code><code>-</code><code>startTime))</code>
相關閱讀:
本文轉自walker snapshot部落格51CTO部落格,原文連結http://blog.51cto.com/walkerqt/1763830如需轉載請自行聯系原作者
RQSLT