国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python爬蟲入門教程 7-100 蜂鳥網圖片爬取之二

z2xy / 1962人閱讀

摘要:蜂鳥網圖片簡介今天玩點新鮮的,使用一個新庫,利用它提高咱爬蟲的爬取速度。上下文不在提示,自行搜索相關資料即可創建一個對象,然后用該對象去打開網頁。可以進行多項操作,比如等代碼中等待網頁數據返回創建線程,方法負責安排執行中的任務。

1. 蜂鳥網圖片-簡介

今天玩點新鮮的,使用一個新庫 aiohttp ,利用它提高咱爬蟲的爬取速度。

安裝模塊常規套路

pip install aiohttp

運行之后等待,安裝完畢,想要深造,那么官方文檔必備 :https://aiohttp.readthedocs.io/en/stable/

接下來就可以開始寫代碼了。

我們要爬取的頁面,這一次選取的是

http://bbs.fengniao.com/forum/forum_101_1_lastpost.html

打開頁面,我們很容易就獲取到了頁碼

好久沒有這么方便的看到頁碼了。

嘗試用 aiohttp 訪問這個頁面吧,模塊的引入,沒有什么特殊的,采用 import 即可
如果我們需要 使用Asyncio + Aiohttp異步IO 編寫爬蟲,那么需要注意,你需要異步的方法前面加上async

接下來,先嘗試去獲取一下上面那個地址的網頁源碼。

代碼中,先聲明一個fetch_img_url的函數,同時攜帶一個參數,這個參數也可以直接寫死。

with 上下文不在提示,自行搜索相關資料即可 (`?ω?′)

aiohttp.ClientSession() as session: 創建一個session對象,然后用該session對象去打開網頁。session可以進行多項操作,比如post, get, put

代碼中 await response.text() 等待網頁數據返回

asyncio.get_event_loop創建線程,run_until_complete方法負責安排執行 tasks中的任務。tasks可以為多帶帶的函數,也可以是列表。

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()   # 獲取到網頁源碼
                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))

好了,如果你已經成果的獲取到了源碼,那么距離最終的目的就差那么一丟丟了。
修改代碼為批量獲取10頁。
只需要修改tasks即可,在此運行,看到如下結果

tasks =  [fetch_img_url(num) for num in range(1, 10)]

下面的一系列操作和上一篇博客非常類似,找規律。
隨便打開一個頁面

http://bbs.fengniao.com/forum/forum_101_4_lastpost.html

點擊一張圖片,進入內頁,在點擊內頁的一張圖片,進入到一個輪播頁面

再次點擊進入圖片播放頁面

最后我們在圖片播放頁面,找到源碼中發現了所有的圖片鏈接,那么問題出來了,如何從上面的第一個鏈接,轉變成輪播圖的鏈接???
下面的源碼是在 http://bbs.fengniao.com/forum/pic/slide_101_10408464_89383854.html 右鍵查看源碼。

繼續分析吧~~~~ ヾ(=?ω?=)o

http://bbs.fengniao.com/forum/forum_101_4_lastpost.html
轉變成下面的鏈接?
http://bbs.fengniao.com/forum/pic/slide_101_10408464_89383854.html

繼續看第一個鏈接,我們使用F12開發者工具,去抓取一個圖片看看。

圖片中標黃色框的位置,發現了我們想要的數字,那么好了,我們只需要通過正則表達式把他們匹配出來就好了。
代碼在下面####的位置,需要注意的是,我采用的原始的正則匹配,在編寫正則表達式的過程中,我發現一步竟然沒有完整匹配,只能分成兩個步驟了,你可以看一下具體的細節o(╥﹏╥)o

查找所有的圖片

獲取我們想要的兩部分數字

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()   # 獲取到網頁源碼
                pattern = re.compile("
([sS.]*?)
") 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("基本錯誤") print(e)

代碼完成,我們已經獲取到,我們想要的URL了,下面繼續讀取URL內部信息,然后匹配我們想要的圖片鏈接

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()   # 獲取到網頁源碼
                            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)  # 圖片列表已經拿到
                                print(pic_json)
                            except Exception as e:
                                print("代碼調試錯誤")
                                print(pic_list)
                                print("*"*100)
                                print(e)

                    except Exception as e:
                        print("獲取圖片列表錯誤")
                        print(img_slider)
                        print(e)
                        continue
                ################################################################


                print("{}已經操作完畢".format(url))
            except Exception as e:
                print("基本錯誤")
                print(e)

圖片最終的JSON已經拿到,最后一步,下載圖片,當當當~~~~,一頓迅猛的操作之后,圖片就拿下來了

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("{}已經操作完畢".format(url))
            except Exception as e:
                print("基本錯誤")
                print(e)

圖片會在你提前寫好的images文件夾里面快速的生成

tasks最多可以開1024協程,但是建議你開100個就OK了,太多并發,人家服務器吃不消。

以上操作執行完畢,在添加一些細節,比如保存到指定文件夾,就OK了。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43890.html

相關文章

  • Python爬蟲入門教程 7-100 蜂鳥圖片爬取之二

    摘要:蜂鳥網圖片簡介今天玩點新鮮的,使用一個新庫,利用它提高咱爬蟲的爬取速度。上下文不在提示,自行搜索相關資料即可創建一個對象,然后用該對象去打開網頁。可以進行多項操作,比如等代碼中等待網頁數據返回創建線程,方法負責安排執行中的任務。 1. 蜂鳥網圖片-簡介 今天玩點新鮮的,使用一個新庫 aiohttp ,利用它提高咱爬蟲的爬取速度。 安裝模塊常規套路 pip install aiohtt...

    hufeng 評論0 收藏0
  • Python爬蟲入門教程 7-100 蜂鳥圖片爬取之二

    摘要:蜂鳥網圖片簡介今天玩點新鮮的,使用一個新庫,利用它提高咱爬蟲的爬取速度。上下文不在提示,自行搜索相關資料即可創建一個對象,然后用該對象去打開網頁。可以進行多項操作,比如等代碼中等待網頁數據返回創建線程,方法負責安排執行中的任務。 1. 蜂鳥網圖片-簡介 今天玩點新鮮的,使用一個新庫 aiohttp ,利用它提高咱爬蟲的爬取速度。 安裝模塊常規套路 pip install aiohtt...

    mcterry 評論0 收藏0
  • Python爬蟲入門教程 8-100 蜂鳥圖片取之

    摘要:蜂鳥網圖片啰嗦兩句前幾天的教程內容量都比較大,今天寫一個相對簡單的,爬取的還是蜂鳥,依舊采用希望你喜歡爬取頁面本篇教程還是基于學習的目的,為啥選擇蜂鳥,沒辦法,我瞎選的。 1. 蜂鳥網圖片-啰嗦兩句 前幾天的教程內容量都比較大,今天寫一個相對簡單的,爬取的還是蜂鳥,依舊采用aiohttp 希望你喜歡爬取頁面https://tu.fengniao.com/15/ 本篇教程還是基于學習的...

    int64 評論0 收藏0

發表評論

0條評論

z2xy

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<