零基礎(chǔ)爬取堆糖網(wǎng)圖片(二)---多線程版

微信圖片_20200417222718.jpg

全文介紹:

接著上篇文章车海,我們已經(jīng)實(shí)現(xiàn)圖片的下載碧浊,但是我們發(fā)現(xiàn)整個(gè)爬取過程中涂邀,因?yàn)槭褂昧?strong>for循環(huán)嵌套,導(dǎo)致每次遍歷辉词,都會打開文件在關(guān)閉必孤,打開文件在關(guān)閉(套娃)。所以需要注意for循環(huán)的使用瑞躺,其次下載圖片是整個(gè)程序中最耗時(shí)的敷搪,如果需要提升爬取速度,那么我們可以從這個(gè)方向入手幢哨,實(shí)現(xiàn)多線程爬取

涉及內(nèi)容:

  1. 爬蟲基本流程
  2. requests庫基本使用
  3. urllib.parse模塊
  4. threading模塊

圖例說明:

  1. 請求與響應(yīng)
sequenceDiagram
瀏覽器->>服務(wù)器: 請求
服務(wù)器-->>瀏覽器: 響應(yīng)
  1. 爬蟲基本流程
graph TD
A[目標(biāo)網(wǎng)站] -->|分析網(wǎng)站| B(url)
B --> C[模擬瀏覽器請求資源]
C -->D[解析網(wǎng)頁]
D-->E[保存數(shù)據(jù)]

正文:

1.導(dǎo)入

import urllib.parse
import threading
import requests

2.發(fā)送請求赡勘,獲取響應(yīng)

def get_page(url):
    page = requests.get(url)
    page = page.content
    # 將 bytes 轉(zhuǎn)化為 字符串
    page = page.decode('utf-8')

    return page

3.關(guān)鍵字以及翻頁

def pages_from_duitang(label):
    url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}'
    pages = []
    # 將中文轉(zhuǎn)化成url編碼
    label = urllib.parse.quote(label)
    # 0-3600 步長100
    for index in range(0, 3600, 100):
        # 將這兩個(gè)變量替換占位符{}
        u = url.format(label, index)
        print(u)
        page = get_page(u)
        pages.append(page)
    return pages

4.獲取一個(gè)頁面上的所有圖片子鏈接

def findall_pages(page, startpart, endpart):
    all_string = []
    end = 0
    # -1代表找不到 意思就是匹配到就執(zhí)行循環(huán)
    while page.find(startpart, end) != -1:
        # 匹配第一個(gè)字符,從下標(biāo)0開始匹配到的位置下標(biāo)捞镰,并將字符長短傳給start變量
        start = page.find(startpart, end) + len(startpart)
        # 將從第一個(gè)需要匹配的字符串后面的字符開始闸与,匹配第二個(gè)需要匹配的字符出現(xiàn)的位置,并將這個(gè)下標(biāo)值賦給end變量
        end = page.find(endpart, start)
        # 切片 取兩個(gè)所要匹配字符 之間的部分也就是圖片url
        string = page[start:end]
        # 存入列表
        all_string.append(string)
    return all_string

5.爬取全部頁面

def pic_url_from_pages(pages):
    pic_url = []
    for page in pages:
        url = findall_pages(page, 'path":"', '"')
        pic_url.extend(url)     # 合并列表
    return pic_url

6.下載圖片

def pic_download(url, n):
    r = requests.get(url)
    path = r"C:\Users\Mark\Desktop\新建文件夾 (2)\%s.jpg" %n
    with open(path, 'wb')as d:
        d.write(r.content)

7.調(diào)用函數(shù)

之前的函數(shù)就像是一個(gè)一個(gè)的零件岸售,現(xiàn)在我們要拼裝這些零件践樱,這個(gè)車才開的起來!??

def main(label):
    pages = pages_from_duitang(label)
    pic_url = pic_url_from_pages(pages)
    n = 0
    for url in pic_url:
        n += 1
        print('正在下載第 {} 張圖片'.format(n))
        pic_download(url,n)
        
main('型雇瑁花')

已完成

  • 函數(shù)封裝
  • 多線程

8.多線程的實(shí)現(xiàn)

栗子來了

排隊(duì)上廁所:商城經(jīng)常會有人排隊(duì)上廁所拷邢,而一個(gè)廁所(進(jìn)程)是可以有多個(gè)坑位(線程),每當(dāng)有位置空著時(shí)就會有下一個(gè)人進(jìn)來屎慢,進(jìn)來后為了讓別人知道這個(gè)位置有人了(避免爭奪)瞭稼,避免尷尬忽洛,需要上鎖,完事兒环肘,出來時(shí)解鎖就行欲虚,然后再有一個(gè)人進(jìn)來......

1587388722298.png
  1. 首先設(shè)置信號量
thread_lock = threading.BoundedSemaphore(value=5)   # value 可以改,但不可過大
  1. 然后就是主函數(shù)中對于下載圖片這個(gè)函數(shù)使用多線程
def main(label):
    pages = pages_from_duitang(label)
    pic_url = pic_url_from_pages(pages)
    n = 0
    for url in pic_url:
        n += 1
        print('正在下載第 {} 張圖片'.format(n))
        # 上鎖
        thread_lock.acquire()
        ## 下載 這個(gè)方法丟進(jìn)線程池
        t = threading.Thread(target=pic_download, args=(url, n))
        t.start()
        pic_download(url,n)

        
main('英雄聯(lián)盟')
  1. 圖片下載完畢悔雹,需要解鎖
thread_lock.release()

效果:

image

注意身體复哆,就不放過多的正能量圖片了

微信圖片_20200417223207.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腌零,隨后出現(xiàn)的幾起案子寂恬,更是在濱河造成了極大的恐慌,老刑警劉巖莱没,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初肉,死亡現(xiàn)場離奇詭異,居然都是意外死亡饰躲,警方通過查閱死者的電腦和手機(jī)牙咏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘹裂,“玉大人妄壶,你說我怎么就攤上這事〖睦牵” “怎么了丁寄?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泊愧。 經(jīng)常有香客問我伊磺,道長,這世上最難降的妖魔是什么删咱? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任屑埋,我火速辦了婚禮,結(jié)果婚禮上痰滋,老公的妹妹穿的比我還像新娘摘能。我一直安慰自己,他們只是感情好敲街,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布团搞。 她就那樣靜靜地躺著,像睡著了一般多艇。 火紅的嫁衣襯著肌膚如雪逻恐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音梢莽,去河邊找鬼。 笑死奸披,一個(gè)胖子當(dāng)著我的面吹牛昏名,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阵面,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼轻局,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了样刷?” 一聲冷哼從身側(cè)響起仑扑,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎置鼻,沒想到半個(gè)月后镇饮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箕母,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年储藐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘶是。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钙勃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聂喇,到底是詐尸還是另有隱情辖源,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布希太,位于F島的核電站克饶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏誊辉。R本人自食惡果不足惜彤路,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芥映。 院中可真熱鬧洲尊,春花似錦、人聲如沸奈偏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惊来。三九已至丽涩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矢渊。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工继准, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矮男。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓移必,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毡鉴。 傳聞我的和親對象是個(gè)殘疾皇子崔泵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容