天天看點

Python3并發檢驗代理池位址

【用線程池并發檢驗代理有效性】

<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) &lt; </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) &lt; </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