摘要:蜂鳥網(wǎng)圖片簡介今天玩點(diǎn)新鮮的,使用一個新庫,利用它提高咱爬蟲的爬取速度。上下文不在提示,自行搜索相關(guān)資料即可創(chuàng)建一個對象,然后用該對象去打開網(wǎng)頁??梢赃M(jìn)行多項(xiàng)操作,比如等代碼中等待網(wǎng)頁數(shù)據(jù)返回創(chuàng)建線程,方法負(fù)責(zé)安排執(zhí)行中的任務(wù)。
1. 蜂鳥網(wǎng)圖片-簡介
今天玩點(diǎn)新鮮的,使用一個新庫 aiohttp ,利用它提高咱爬蟲的爬取速度。
安裝模塊常規(guī)套路
pip install aiohttp
運(yùn)行之后等待,安裝完畢,想要深造,那么官方文檔必備 :https://aiohttp.readthedocs.io/en/stable/
接下來就可以開始寫代碼了。
我們要爬取的頁面,這一次選取的是
http://bbs.fengniao.com/forum/forum_101_1_lastpost.html
打開頁面,我們很容易就獲取到了頁碼
好久沒有這么方便的看到頁碼了。
嘗試用 aiohttp 訪問這個頁面吧,模塊的引入,沒有什么特殊的,采用 import 即可
如果我們需要 使用Asyncio + Aiohttp異步IO 編寫爬蟲,那么需要注意,你需要異步的方法前面加上async
接下來,先嘗試去獲取一下上面那個地址的網(wǎng)頁源碼。
代碼中,先聲明一個fetch_img_url的函數(shù),同時攜帶一個參數(shù),這個參數(shù)也可以直接寫死。
with 上下文不在提示,自行搜索相關(guān)資料即可 (`?ω?′)
aiohttp.ClientSession() as session: 創(chuàng)建一個session對象,然后用該session對象去打開網(wǎng)頁。session可以進(jìn)行多項(xiàng)操作,比如post, get, put等
代碼中 await response.text() 等待網(wǎng)頁數(shù)據(jù)返回
asyncio.get_event_loop創(chuàng)建線程,run_until_complete方法負(fù)責(zé)安排執(zhí)行 tasks中的任務(wù)。tasks可以為多帶帶的函數(shù),也可以是列表。
import aiohttp import asyncio async def fetch_img_url(num): url = f"http://bbs.fengniao.com/forum/forum_101_{num}_lastpost.html" # 字符串拼接 # 或者直接寫成 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)頁源碼 print(html) except Exception as e: print("基本錯誤") print(e) # 這部分你可以直接臨摹 loop = asyncio.get_event_loop() tasks = asyncio.ensure_future(fetch_img_url(1)) results = loop.run_until_complete(tasks)
上面代碼最后一部分也可以寫成
loop = asyncio.get_event_loop() tasks = [fetch_img_url(1)] results = loop.run_until_complete(asyncio.wait(tasks))
好了,如果你已經(jīng)成果的獲取到了源碼,那么距離最終的目的就差那么一丟丟了。
修改代碼為批量獲取10頁。
只需要修改tasks即可,在此運(yùn)行,看到如下結(jié)果
tasks = [fetch_img_url(num) for num in range(1, 10)]
下面的一系列操作和上一篇博客非常類似,找規(guī)律。
隨便打開一個頁面
http://bbs.fengniao.com/forum/forum_101_4_lastpost.html
點(diǎn)擊一張圖片,進(jìn)入內(nèi)頁,在點(diǎn)擊內(nèi)頁的一張圖片,進(jìn)入到一個輪播頁面
再次點(diǎn)擊進(jìn)入圖片播放頁面
最后我們在圖片播放頁面,找到源碼中發(fā)現(xiàn)了所有的圖片鏈接,那么問題出來了,如何從上面的第一個鏈接,轉(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ù)看第一個鏈接,我們使用F12開發(fā)者工具,去抓取一個圖片看看。
圖片中標(biāo)黃色框的位置,發(fā)現(xiàn)了我們想要的數(shù)字,那么好了,我們只需要通過正則表達(dá)式把他們匹配出來就好了。
代碼在下面####的位置,需要注意的是,我采用的原始的正則匹配,在編寫正則表達(dá)式的過程中,我發(fā)現(xiàn)一步竟然沒有完整匹配,只能分成兩個步驟了,你可以看一下具體的細(xì)節(jié)o(╥﹏╥)o
查找所有的圖片 獲取我們想要的兩部分?jǐn)?shù)字 代碼完成,我們已經(jīng)獲取到,我們想要的URL了,下面繼續(xù)讀取URL內(nèi)部信息,然后匹配我們想要的圖片鏈接 圖片最終的JSON已經(jīng)拿到,最后一步,下載圖片,當(dāng)當(dāng)當(dāng)~~~~,一頓迅猛的操作之后,圖片就拿下來了 圖片會在你提前寫好的images文件夾里面快速的生成 tasks最多可以開1024協(xié)程,但是建議你開100個就OK了,太多并發(fā),人家服務(wù)器吃不消。 以上操作執(zhí)行完畢,在添加一些細(xì)節(jié),比如保存到指定文件夾,就OK了。 文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/40458.htmlasync 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)頁源碼
pattern = re.compile("
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)頁源碼
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)試錯誤")
print(pic_list)
print("*"*100)
print(e)
except Exception as e:
print("獲取圖片列表錯誤")
print(img_slider)
print(e)
continue
################################################################
print("{}已經(jīng)操作完畢".format(url))
except Exception as e:
print("基本錯誤")
print(e)
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("圖片下載錯誤")
print(e)
continue
###############################################################
except Exception as e:
print("獲取圖片列表錯誤")
print(img_slider)
print(e)
continue
print("{}已經(jīng)操作完畢".format(url))
except Exception as e:
print("基本錯誤")
print(e)
摘要:蜂鳥網(wǎng)圖片簡介今天玩點(diǎn)新鮮的,使用一個新庫,利用它提高咱爬蟲的爬取速度。上下文不在提示,自行搜索相關(guān)資料即可創(chuàng)建一個對象,然后用該對象去打開網(wǎng)頁??梢赃M(jìn)行多項(xiàng)操作,比如等代碼中等待網(wǎng)頁數(shù)據(jù)返回創(chuàng)建線程,方法負(fù)責(zé)安排執(zhí)行中的任務(wù)。 1. 蜂鳥網(wǎng)圖片-簡介 今天玩點(diǎn)新鮮的,使用一個新庫 aiohttp ,利用它提高咱爬蟲的爬取速度。 安裝模塊常規(guī)套路 pip install aiohtt...
摘要:蜂鳥網(wǎng)圖片簡介今天玩點(diǎn)新鮮的,使用一個新庫,利用它提高咱爬蟲的爬取速度。上下文不在提示,自行搜索相關(guān)資料即可創(chuàng)建一個對象,然后用該對象去打開網(wǎng)頁。可以進(jìn)行多項(xiàng)操作,比如等代碼中等待網(wǎng)頁數(shù)據(jù)返回創(chuàng)建線程,方法負(fù)責(zé)安排執(zhí)行中的任務(wù)。 1. 蜂鳥網(wǎng)圖片-簡介 今天玩點(diǎn)新鮮的,使用一個新庫 aiohttp ,利用它提高咱爬蟲的爬取速度。 安裝模塊常規(guī)套路 pip install aiohtt...
摘要:蜂鳥網(wǎng)圖片啰嗦兩句前幾天的教程內(nèi)容量都比較大,今天寫一個相對簡單的,爬取的還是蜂鳥,依舊采用希望你喜歡爬取頁面本篇教程還是基于學(xué)習(xí)的目的,為啥選擇蜂鳥,沒辦法,我瞎選的。 1. 蜂鳥網(wǎng)圖片-啰嗦兩句 前幾天的教程內(nèi)容量都比較大,今天寫一個相對簡單的,爬取的還是蜂鳥,依舊采用aiohttp 希望你喜歡爬取頁面https://tu.fengniao.com/15/ 本篇教程還是基于學(xué)習(xí)的...
閱讀 1378·2021-11-24 09:38
閱讀 2086·2021-09-22 15:17
閱讀 2341·2021-09-04 16:41
閱讀 3452·2019-08-30 15:56
閱讀 3511·2019-08-29 17:19
閱讀 1939·2019-08-28 18:09
閱讀 1249·2019-08-26 13:35
閱讀 1711·2019-08-23 17:52