今天玩點(diǎn)新鮮的,使用一個(gè)新庫(kù) aiohttp
,利用它提高咱爬蟲(chóng)的爬取速度。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到阿合奇網(wǎng)站設(shè)計(jì)與阿合奇網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋阿合奇地區(qū)。
安裝模塊常規(guī)套路
pip install aiohttp
運(yùn)行之后等待,安裝完畢,想要深造,那么官方文檔必備 :https://aiohttp.readthedocs.io/en/stable/
接下來(lái)就可以開(kāi)始寫(xiě)代碼了。
我們要爬取的頁(yè)面,這一次選取的是
http://bbs.fengniao.com/forum/forum_101_1_lastpost.html
打開(kāi)頁(yè)面,我們很容易就獲取到了頁(yè)碼
好久沒(méi)有這么方便的看到頁(yè)碼了。
嘗試用 aiohttp
訪問(wèn)這個(gè)頁(yè)面吧,模塊的引入,沒(méi)有什么特殊的,采用 import
即可
如果我們需要 使用Asyncio + Aiohttp
異步IO 編寫(xiě)爬蟲(chóng),那么需要注意,你需要異步的方法前面加上async
接下來(lái),先嘗試去獲取一下上面那個(gè)地址的網(wǎng)頁(yè)源碼。
代碼中,先聲明一個(gè)fetch_img_url的函數(shù),同時(shí)攜帶一個(gè)參數(shù),這個(gè)參數(shù)也可以直接寫(xiě)死。
with
上下文不在提示,自行搜索相關(guān)資料即可 (`?ω?′)
aiohttp.ClientSession() as session:
創(chuàng)建一個(gè)session
對(duì)象,然后用該session
對(duì)象去打開(kāi)網(wǎng)頁(yè)。session
可以進(jìn)行多項(xiàng)操作,比如post
, get
, put
等
代碼中 await response.text()
等待網(wǎng)頁(yè)數(shù)據(jù)返回
asyncio.get_event_loop
創(chuàng)建線程,run_until_complete
方法負(fù)責(zé)安排執(zhí)行 tasks
中的任務(wù)。tasks
可以為單獨(dú)的函數(shù),也可以是列表。
import aiohttp
import asyncio
async def fetch_img_url(num):
url = f'http://bbs.fengniao.com/forum/forum_101_{num}_lastpost.html' # 字符串拼接
# 或者直接寫(xiě)成 url = 'http://bbs.fengniao.com/forum/forum_101_1_lastpost.html'
print(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6726.400 QQBrowser/10.2.2265.400',
}
async with aiohttp.ClientSession() as session:
# 獲取輪播圖地址
async with session.get(url,headers=headers) as response:
try:
html = await response.text() # 獲取到網(wǎng)頁(yè)源碼
print(html)
except Exception as e:
print("基本錯(cuò)誤")
print(e)
# 這部分你可以直接臨摹
loop = asyncio.get_event_loop()
tasks = asyncio.ensure_future(fetch_img_url(1))
results = loop.run_until_complete(tasks)
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
上面代碼最后一部分也可以寫(xiě)成
loop = asyncio.get_event_loop()
tasks = [fetch_img_url(1)]
results = loop.run_until_complete(asyncio.wait(tasks))
好了,如果你已經(jīng)成果的獲取到了源碼,那么距離最終的目的就差那么一丟丟了。
修改代碼為批量獲取10頁(yè)。
只需要修改tasks
即可,在此運(yùn)行,看到如下結(jié)果
tasks = [fetch_img_url(num) for num in range(1, 10)]
下面的一系列操作和上一篇博客非常類(lèi)似,找規(guī)律。
隨便打開(kāi)一個(gè)頁(yè)面
http://bbs.fengniao.com/forum/forum_101_4_lastpost.html
點(diǎn)擊一張圖片,進(jìn)入內(nèi)頁(yè),在點(diǎn)擊內(nèi)頁(yè)的一張圖片,進(jìn)入到一個(gè)輪播頁(yè)面
再次點(diǎn)擊進(jìn)入圖片播放頁(yè)面
最后我們?cè)趫D片播放頁(yè)面,找到源碼中發(fā)現(xiàn)了所有的圖片鏈接,那么問(wèn)題出來(lái)了,如何從上面的第一個(gè)鏈接,轉(zhuǎn)變成輪播圖的鏈接???
下面的源碼是在 http://bbs.fengniao.com/forum/pic/slide_101_10408464_89383854.html
右鍵查看源碼。
繼續(xù)分析吧~~~~ ヾ(=?ω?=)o
http://bbs.fengniao.com/forum/forum_101_4_lastpost.html
轉(zhuǎn)變成下面的鏈接?
http://bbs.fengniao.com/forum/pic/slide_101_10408464_89383854.html
繼續(xù)看第一個(gè)鏈接,我們使用F12開(kāi)發(fā)者工具,去抓取一個(gè)圖片看看。
圖片中標(biāo)×××框的位置,發(fā)現(xiàn)了我們想要的數(shù)字,那么好了,我們只需要通過(guò)正則表達(dá)式把他們匹配出來(lái)就好了。
代碼在下面####
的位置,需要注意的是,我采用的原始的正則匹配,在編寫(xiě)正則表達(dá)式的過(guò)程中,我發(fā)現(xiàn)一步竟然沒(méi)有完整匹配,只能分成兩個(gè)步驟了,你可以看一下具體的細(xì)節(jié)o(╥﹏╥)o
<div class="picList">
async def fetch_img_url(num):
url = f'http://bbs.fengniao.com/forum/forum_101_{num}_lastpost.html'
print(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6726.400 QQBrowser/10.2.2265.400',
}
async with aiohttp.ClientSession() as session:
# 獲取輪播圖地址
async with session.get(url,headers=headers) as response:
try:
###############################################
url_format = "http://bbs.fengniao.com/forum/pic/slide_101_{0}_{1}.html"
html = await response.text() # 獲取到網(wǎng)頁(yè)源碼
pattern = re.compile('<div class="picList">([\s\S.]*?)</div>')
first_match = pattern.findall(html)
href_pattern = re.compile('href="/forum/(\d+?)_p(\d+?)\.html')
urls = [url_format.format(href_pattern.search(url).group(1), href_pattern.search(url).group(2)) for url in first_match]
##############################################
except Exception as e:
print("基本錯(cuò)誤")
print(e)
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
代碼完成,我們已經(jīng)獲取到,我們想要的URL了,下面繼續(xù)讀取URL內(nèi)部信息,然后匹配我們想要的圖片鏈接
async def fetch_img_url(num):
# 去抄上面的代碼
async with aiohttp.ClientSession() as session:
# 獲取輪播圖地址
async with session.get(url,headers=headers) as response:
try:
#去抄上面的代碼去吧
################################################################
for img_slider in urls:
try:
async with session.get(img_slider, headers=headers) as slider:
slider_html = await slider.text() # 獲取到網(wǎng)頁(yè)源碼
try:
pic_list_pattern = re.compile('var picList = \[(.*)?\];')
pic_list = "[{}]".format(pic_list_pattern.search(slider_html).group(1))
pic_json = json.loads(pic_list) # 圖片列表已經(jīng)拿到
print(pic_json)
except Exception as e:
print("代碼調(diào)試錯(cuò)誤")
print(pic_list)
print("*"*100)
print(e)
except Exception as e:
print("獲取圖片列表錯(cuò)誤")
print(img_slider)
print(e)
continue
################################################################
print("{}已經(jīng)操作完畢".format(url))
except Exception as e:
print("基本錯(cuò)誤")
print(e)
圖片最終的JSON已經(jīng)拿到,最后一步,下載圖片,當(dāng)當(dāng)當(dāng)~~~~,一頓迅猛的操作之后,圖片就拿下來(lái)了
async def fetch_img_url(num):
# 代碼去上面找
async with aiohttp.ClientSession() as session:
# 獲取輪播圖地址
async with session.get(url,headers=headers) as response:
try:
# 代碼去上面找
for img_slider in urls:
try:
async with session.get(img_slider, headers=headers) as slider:
# 代碼去上面找
##########################################################
for img in pic_json:
try:
img = img["downloadPic"]
async with session.get(img, headers=headers) as img_res:
imgcode = await img_res.read() # 圖片讀取
with open("images/{}".format(img.split('/')[-1]), 'wb') as f:
f.write(imgcode)
f.close()
except Exception as e:
print("圖片下載錯(cuò)誤")
print(e)
continue
###############################################################
except Exception as e:
print("獲取圖片列表錯(cuò)誤")
print(img_slider)
print(e)
continue
print("{}已經(jīng)操作完畢".format(url))
except Exception as e:
print("基本錯(cuò)誤")
print(e)
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
圖片會(huì)在你提前寫(xiě)好的images
文件夾里面快速的生成
tasks
最多可以開(kāi)1024協(xié)程,但是建議你開(kāi)100個(gè)就OK了,太多并發(fā),人家服務(wù)器吃不消。
以上操作執(zhí)行完畢,在添加一些細(xì)節(jié),比如保存到指定文件夾,就OK了。
網(wǎng)站題目:Python爬蟲(chóng)入門(mén)【7】:蜂鳥(niǎo)網(wǎng)圖片爬取之二
URL網(wǎng)址:http://sd-ha.com/article22/gegejc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站建設(shè)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)