Python爬蟲九:豌豆莢設計獎多程式,非同步IO爬取速度對比
一:前言
使用requests+BeautifulSoup或者xpath等網頁解析工具就可以爬取大部分的網頁 ,但是有時爬取的量很大時爬取的速度就讓人頭疼,今天我就使用三種方式來爬取豌豆莢的設計獎APP相關資訊並儲存到mongodb,從而對比速度讓我們更清楚的認識這些東西用處。
- 正常requests爬取
- requests + pool多程式爬取
- asynico + aiohttp非同步IO爬取
二:執行環境
- IDE:Pycharm 2017
- Python 3.6
- aiohttp 2.1.0
- asyncio 3.4.3
- pymongo 3.4.0
三:例項分析
1.豌豆莢的設計獎首頁是http://www.wandoujia.com/award 點選下一頁之後就會發現網頁地址變成了http://www.wandoujia.com/award?page=x x就是當前的頁數。
2.然後來看看本次抓取的資訊分佈,我抓取的是每個設計獎的背景圖片,APP名稱,圖示,獲獎說明。進入瀏覽器開發者模式後即可查詢資訊位置。(使用Ctrl+Shift+C選擇目標快速到達程式碼位置,同時這個夸克瀏覽器也挺不錯的,簡潔流暢推薦大家安裝試試。)
3.資訊位置都找到了就可以使用BeautifulSoup來解析網頁選擇到這些資料,然後儲存到mongodb。
四:實戰程式碼
完整程式碼放在github中,github.com/rieuse/learnPython
共用部分是url的構造,一些headers,代理部分。前幾次爬蟲可以不用headers和代理,但是測試幾次後爬取的網站就可能給你封ip或者限速。我這裡就需要這些反ban方法,因為我測試幾次就唄網站限制了。
這裡為了反反爬蟲可以加入headers,User-Agent也是隨機選擇。再配合代理ip就很棒了。
# 共用部分
clients = pymongo.MongoClient('localhost')
db = clients["wandoujia"]
col = db["info"]
urls = ['http://www.wandoujia.com/award?page={}'.format(num) for num in range(1, 46)]
UA_LIST = [
"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"
]
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
'Connection': 'keep-alive',
'Host': 'www.wandoujia.com',
'User-Agent': random.choice(UA_LIST)
}
proxies = {
'http': 'http://123.206.6.17:3128',
'https': 'http://123.206.6.17:3128'
}
方式一:正常requests爬取
def method_1():
start = time.time()
for url in urls:
html = requests.get(url, headers=headers, proxies=proxies).text
soup = BeautifulSoup(html, 'lxml')
title = soup.find_all(class_='title')
app_title = soup.find_all(class_='app-title')
item_cover = soup.find_all(class_='item-cover')
icon_cover = soup.select('div.list-wrap > ul > li > div.icon > img')
for title_i, app_title_i, item_cover_i, icon_cover_i in zip(title, app_title, item_cover, icon_cover):
content = {
'title': title_i.get_text(),
'app_title': app_title_i.get_text(),
'item_cover': item_cover_i['data-original'],
'icon_cover': icon_cover_i['data-original']
}
col.insert(content)
print('成功插入一組資料' + str(content))
print('一共用時:' + str(time.time() - start))
if __name__ == '__main__':
method_1()
執行這部分的程式碼後執行時間
之後mongodb的資料庫中就有了這些資料。
方式二:使用Requests + Pool程式池爬取
def method_2(url):
html = requests.get(url, headers=headers, proxies=proxies).text
soup = BeautifulSoup(html, 'lxml')
title = soup.find_all(class_='title')
app_title = soup.find_all(class_='app-title')
item_cover = soup.find_all(class_='item-cover')
icon_cover = soup.select('div.list-wrap > ul > li > div.icon > img')
for title_i, app_title_i, item_cover_i, icon_cover_i in zip(title, app_title, item_cover, icon_cover):
content = {
'title': title_i.get_text(),
'app_title': app_title_i.get_text(),
'item_cover': item_cover_i['data-original'],
'icon_cover': icon_cover_i['data-original']
}
# time.sleep(1)
col.insert(content)
print('成功插入一組資料' + str(content))
if __name__ == '__main__':
start = time.time()
pool = multiprocessing.Pool(4) # 使用4個程式
pool.map(method_2, urls) # map函式就是把後面urls列表中的url分別傳遞給method_2()函式
pool.close()
pool.join()
print('一共用時:' + str(time.time() - start))
執行這部分的程式碼後執行時間,確實比方法一快了一些
方式三:使用Asyncio + Aiohttp非同步IO爬取
使用這個方法需要對每個函式前面加async,表示成一個非同步函式,呼叫asyncio.get_event_loop建立執行緒,run_until_complete方法負責安排執行 tasks中的任務。
def method_3():
async def get_url(url):
async with aiohttp.ClientSession() as session: # await關鍵字將暫停協程函式的執行,等待非同步IO返回結果。
async with session.get(url) as html:
response = await html.text(encoding="utf-8") # await關鍵字將暫停協程函式的執行,等待非同步IO返回結果。
return response
async def parser(url):
html = await get_url(url)
soup = BeautifulSoup(html, 'lxml')
title = soup.find_all(class_='title')
app_title = soup.find_all(class_='app-title')
item_cover = soup.find_all(class_='item-cover')
icon_cover = soup.select('div.list-wrap > ul > li > div.icon > img')
for title_i, app_title_i, item_cover_i, icon_cover_i in zip(title, app_title, item_cover, icon_cover):
content = {
'title': title_i.get_text(),
'app_title': app_title_i.get_text(),
'item_cover': item_cover_i['data-original'],
'icon_cover': icon_cover_i['data-original']
}
col.insert(content)
print('成功插入一組資料' + str(content))
start = time.time()
loop = asyncio.get_event_loop()
tasks = [parser(url) for url in urls]
loop.run_until_complete(asyncio.gather(*tasks))
print(time.time() - start)
if __name__ == '__main__':
method_3()
執行這部分的程式碼後執行時間,又快了很多。
五:總結
使用三種方法爬取資料儲存到mongodb,從這裡可以看出使用Asyncio + Aiohttp的方法最快,比普通只用requests的方法快很多,如果處理更多的任務的時候使用非同步IO是非常有效率的。備註:Python3.5,開始使用async和await關鍵字。
貼出我的github地址,我的爬蟲程式碼和學習的基礎部分都放進去了,有喜歡的朋友可以點選 start follw一起學習交流吧!**github.com/rieuse/learnPython **
相關文章
- Python使用多程式提高網路爬蟲的爬取速度Python爬蟲
- 如何合理控制爬蟲爬取速度?爬蟲
- 爬蟲:多程式爬蟲爬蟲
- python多執行緒爬蟲與單執行緒爬蟲效率效率對比Python執行緒爬蟲
- python多執行緒非同步爬蟲-Python非同步爬蟲試驗[Celery,gevent,requests]Python執行緒非同步爬蟲
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- 爬蟲爬取微信小程式爬蟲微信小程式
- Python爬蟲入門【9】:圖蟲網多執行緒爬取Python爬蟲執行緒
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- [python爬蟲] BeautifulSoup和Selenium對比爬取豆瓣Top250電影資訊Python爬蟲
- python爬蟲58同城(多個資訊一次爬取)Python爬蟲
- python 爬蟲 爬取 learnku 精華文章Python爬蟲
- python爬蟲——爬取大學排名資訊Python爬蟲
- python爬蟲的最佳實踐(六)--爬蟲中的多程式Python爬蟲
- 爬蟲那些事-爬蟲設計思路爬蟲
- python爬蟲--爬取鏈家租房資訊Python爬蟲
- Python爬蟲爬取美劇網站Python爬蟲網站
- python爬蟲爬取糗事百科Python爬蟲
- Python 爬蟲 (三) - Socket 網路程式設計Python爬蟲程式設計
- Python爬蟲入門【10】:電子書多執行緒爬取Python爬蟲執行緒
- 【python爬蟲】python爬蟲demoPython爬蟲
- python 爬蟲 1 爬取酷狗音樂Python爬蟲
- Python爬蟲爬取淘寶,京東商品資訊Python爬蟲
- 小白學 Python 爬蟲(25):爬取股票資訊Python爬蟲
- python網路爬蟲--爬取淘寶聯盟Python爬蟲
- Python實現微博爬蟲,爬取新浪微博Python爬蟲
- Python爬蟲—爬取某網站圖片Python爬蟲網站
- 爬蟲——爬取貴陽房價(Python實現)爬蟲Python
- 【Python爬蟲】正則爬取趕集網Python爬蟲
- 利用Python爬蟲爬取天氣資料Python爬蟲
- Python微型非同步爬蟲框架Python非同步爬蟲框架
- Python非同步爬蟲(aiohttp版)Python非同步爬蟲AIHTTP
- Python爬蟲入門教程 50-100 Python3爬蟲爬取VIP視訊-Python爬蟲6操作Python爬蟲
- 多程序最佳化頂點小說爬蟲:加速爬取速度的深度最佳化策略爬蟲
- Python爬蟲15--爬蟲遇上多執行緒,速度更上一層樓,爬取1000張圖片連一分鐘也不要!Python爬蟲執行緒
- 爬蟲之股票定向爬取爬蟲
- Python 第一個爬蟲,爬取 147 小說Python爬蟲
- Python爬蟲入門【5】:27270圖片爬取Python爬蟲