前言
在上篇文章中,講述了如何獲取代理ip,當獲取了足夠多的代理ip之后,可以使用代理ip更高效的爬取網絡信息,同時,當爬取大規模的數據時,利用多線程可以實現更快的爬取速度,現在總結一下如何在自己的爬蟲中使用代理ip和多線程
代理ip的利用
上次爬取代理ip之后,發現這些ip信息有兩種類型,分別是http和https,那么相對應的對于這兩種不同類型的ip,應該分別做不同的處理.
詳細代碼如下,返回值為一字典:
def proxys():
url = "http://www.xicidaili.com/"
ips_list = get_ips(url) #獲取代理ip的函數,返回值為一列表
proxy_ip = random.choice(ips_list) #在列表中隨機的獲取一代理ip
'''
如果ip信息為http開始,構建http類型的字典,反之,構建https類型的字典
'''
if proxy_ip.startswith('http'):
proxies = {'http':proxy_ip}
elif proxy_ip.startswith('https'):
proxies = {'https':proxy_ip}
return proxies
最后,再request.get函數中的使用如下:
wb_data = requests.get(url=pages_url,headers=headers,proxies=proxys())
多線程的利用
首先,導入多線程所需要的庫
from multiprocessing import Pool
多線程的實現代碼如下:
pool = Pool(6)
pool.map(get_all_links_from,channel_list)
pool.close() #關閉進程池(pool),使其不在接受新的任務。
pool.join() #主進程阻塞等待子進程的退出,join方法必須在close或terminate之后使用
在以上代碼中,我們實例化了一個Pool類的對象,并為其分配了六個線程,
然后調用了map函數.
注意: map()函數有兩個參數,第一個為多線程執行的函數,另一參數為一迭代器,在本例中,我們使用的是一列表類型的參數.