小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

python自動下載圖片

 印度阿三17 2020-03-12

近日閑來無事,總有一種無形的力量縈繞在朕身邊,讓朕精神渙散,昏昏欲睡。
在這里插入圖片描述
可是,像朕這么有職業(yè)操守的社畜怎么能在上班期間睡瞌睡呢,我不禁陷入了沉思。。。。
在這里插入圖片描述
突然旁邊的IOS同事問:‘嘿,兄弟,我發(fā)現(xiàn)一個網(wǎng)站的圖片很有意思啊,能不能幫我保存下來提升我的開發(fā)靈感?’
作為一個堅強的社畜怎么能說自己不行呢,當時朕就不假思索的答應:‘oh, It’s simple. Wait for me a few minute.’

點開同事給的圖片網(wǎng)站,網(wǎng)站鏈接見代碼
網(wǎng)站大概長這樣:
在這里插入圖片描述
在朕翻看了幾十頁之后,朕突然覺得有點上頭。心中一想’不對啊,朕不是來學習的嗎?可是看美女圖片這個事情怎么才可以和學習關(guān)聯(lián)起來呢‘

冥思苦想一番之后,突然腦中靈光一閃,’要不用python寫個爬蟲吧,將此網(wǎng)站的圖片一網(wǎng)打盡‘。
在這里插入圖片描述
說干就干,身體力行,要問爬蟲哪家強,‘人生苦短,我用python’。
首先找到我的電腦里面半年前下載的python安裝包,無情的點擊了安裝,環(huán)境裝好之后,略一分析網(wǎng)頁結(jié)構(gòu)。先擼一個簡易版爬蟲

#抓取愛小姐姐網(wǎng)圖片保存到本地
import requests
from lxml import etree as et
import os

#請求頭
headers = {
    #用戶代理 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}

#待抓取網(wǎng)頁基地址
base_url = 'https://www./c/qingchun/'
#保存圖片基本路徑
base_dir = 'D:/python/code/aixjj/'
#保存圖片
def savePic(pic_url):
    #如果目錄不存在,則新建
    if not os.path.exists(base_dir):
        os.makedirs(base_dir)
    
    arr = pic_url.split('/')
    file_name = base_dir arr[-2] arr[-1]
    print(file_name)
    #獲取圖片內(nèi)容
    response = requests.get(pic_url, headers = headers)
    #寫入圖片
    with open(file_name,'wb') as fp:
        for data in response.iter_content(128):
            fp.write(data)

#觀察此網(wǎng)站總共只有62頁,所以循環(huán)62次
for k in range(1,63):
    #請求頁面地址
    url = base_url str(k)
    response = requests.get(url = url, headers = headers)
    #請求狀態(tài)碼
    code = response.status_code
    if code == 200:
        html = et.HTML(response.text)
        #獲取頁面所有圖片地址
        r = html.xpath('//li/a/img/@src')
        #獲取下一頁url
        #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
        for pic_url in r:
            a = 'http:' pic_url
            savePic(a)
    print('第%d頁圖片下載完成' % (k))

print('The End!')

嘗試運行爬蟲,嘿,沒想到行了:

在這里插入圖片描述
在這里插入圖片描述
過了一會兒,旁邊的哥們兒又來:‘嘿 bro 你這個可以是可以,就是速度太慢了啊,我的靈感會被長時間的等待磨滅,你給改進改進?’

怎么提升爬蟲的效率呢?略一思索,公司的電腦可是偉大的四核CPU啊,要不擼個多進程版本試試。然后就產(chǎn)生了下面這個多進程版本

#多進程版——抓取愛小姐姐網(wǎng)圖片保存到本地

import requests
from lxml import etree as et
import os
import time
from multiprocessing import Pool

#請求頭
headers = {
    #用戶代理 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}

#待抓取網(wǎng)頁基地址
base_url = 'https://www./c/qingchun/'
#保存圖片基本路徑
base_dir = 'D:/python/code/aixjj1/'

#保存圖片
def savePic(pic_url):
    #如果目錄不存在,則新建
    if not os.path.exists(base_dir):
        os.makedirs(base_dir)
    
    arr = pic_url.split('/')
    file_name = base_dir arr[-2] arr[-1]
    print(file_name)
    #獲取圖片內(nèi)容
    response = requests.get(pic_url, headers = headers)
    #寫入圖片
    with open(file_name,'wb') as fp:
        for data in response.iter_content(128):
            fp.write(data)

def geturl(url):
    #請求頁面地址
    #url = base_url str(k)
    response = requests.get(url = url, headers = headers)
    #請求狀態(tài)碼
    code = response.status_code
    if code == 200:
        html = et.HTML(response.text)
        #獲取頁面所有圖片地址
        r = html.xpath('//li/a/img/@src')
        #獲取下一頁url
        #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
        for pic_url in r:
            a = 'http:' pic_url
            savePic(a)

if __name__ == '__main__':
    #獲取要爬取的鏈接列表
    url_list = [base_url format(i) for i in range(1,100)]
    a1 = time.time()
    #利用進程池方式創(chuàng)建進程,默認創(chuàng)建進程數(shù)量=電腦核數(shù)
    #自己定義進程數(shù)量方式  pool = Pool(4)
    pool = Pool()
    pool.map(geturl,url_list)
    pool.close()
    pool.join()
    b1 = time.time()
    print('運行時間:',b1-a1)

抱著試一試的心態(tài),運行了多進程版本爬蟲,嘿沒想到又行了,在朕偉大的四核CPU的加持下,爬蟲速度提升了3~4倍。
又過了一會兒,那哥們兒又偏過頭來:‘你這個快是快了不少,但是還不是最理想的狀態(tài),能不能一眨眼就能爬取百八十個圖片,畢竟我的靈感來的快去的也快’

我:‘…’
悄悄打開Google,搜索如何提升爬蟲效率,給出結(jié)論:

多進程:密集CPU任務,需要充分使用多核CPU資源(服務器,大量的并行計算)的時候,用多進程。
多線程:密集I/O任務(網(wǎng)絡I/O,磁盤I/O,數(shù)據(jù)庫I/O)使用多線程合適。

呵,我這可不就是I/O密集任務嗎,趕緊寫一個多線程版爬蟲先。于是,又誕生了第三款:

import threading # 導入threading模塊
from queue import Queue #導入queue模塊
import time  #導入time模塊
import requests
import os
from lxml import etree as et

#請求頭
headers = {
    #用戶代理 
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
#待抓取網(wǎng)頁基地址
base_url = 'https://www./c/qingchun/'
#保存圖片基本路徑
base_dir = 'D:/python/code/aixjj/'

#保存圖片
def savePic(pic_url):
    #如果目錄不存在,則新建
    if not os.path.exists(base_dir):
        os.makedirs(base_dir)
    
    arr = pic_url.split('/')
    file_name = base_dir arr[-2] arr[-1]
    print(file_name)
    #獲取圖片內(nèi)容
    response = requests.get(pic_url, headers = headers)
    #寫入圖片
    with open(file_name,'wb') as fp:
        for data in response.iter_content(128):
            fp.write(data)

# 爬取文章詳情頁
def get_detail_html(detail_url_list, id):
    while True:
        url = detail_url_list.get() #Queue隊列的get方法用于從隊列中提取元素
        response = requests.get(url = url, headers = headers)
        #請求狀態(tài)碼
        code = response.status_code
        if code == 200:
            html = et.HTML(response.text)
            #獲取頁面所有圖片地址
            r = html.xpath('//li/a/img/@src')
            #獲取下一頁url
            #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
            for pic_url in r:
                a = 'http:' pic_url
                savePic(a)

# 爬取文章列表頁
def get_detail_url(queue):
    for i in range(1,100):
        #time.sleep(1) # 延時1s,模擬比爬取文章詳情要快
        #Queue隊列的put方法用于向Queue隊列中放置元素,由于Queue是先進先出隊列,所以先被Put的URL也就會被先get出來。
        page_url = base_url format(i)
        queue.put(page_url)
        print("put page url {id} end".format(id = page_url))#打印出得到了哪些文章的url

#主函數(shù)
if __name__ == "__main__":
    detail_url_queue = Queue(maxsize=1000) #用Queue構(gòu)造一個大小為1000的線程安全的先進先出隊列
    #A線程負責抓取列表url
    thread = threading.Thread(target=get_detail_url, args=(detail_url_queue,)) 
    html_thread= []
    #另外創(chuàng)建三個線程負責抓取圖片
    for i in range(20):
        thread2 = threading.Thread(target=get_detail_html, args=(detail_url_queue,i))
        html_thread.append(thread2)#B C D 線程抓取文章詳情
    start_time = time.time()
    # 啟動四個線程
    thread.start()
    for i in range(20):
        html_thread[i].start()
    # 等待所有線程結(jié)束,thread.join()函數(shù)代表子線程完成之前,其父進程一直處于阻塞狀態(tài)。
    thread.join()
    for i in range(20):
        html_thread[i].join()
    print("last time: {} s".format(time.time()-start_time))#等ABCD四個線程都結(jié)束后,在主進程中計算總爬取時間。

粗略測試一下,得出結(jié)論: ‘Oh my god,這也太快了吧’。
將多線程版本爬蟲扔到同事QQ頭像的臉上,并附文:‘拿去,速滾’

The End!

在現(xiàn)實中,我忍氣吞聲,不敢侮辱別人,在網(wǎng)絡上,我重拳出擊,辱罵網(wǎng)友,意氣風發(fā)!
天不生我鍵盤俠,噴道萬古如長夜。
鍵來!仙之巔,傲世間,有我鍵盤就有天,天下鍵仙三百萬,遇我也需盡低眉,我為鍵帝自當鎮(zhèn)壓世間一切敵。
誰在稱無敵,哪個言不敗,鍵化自在法。
鍵來!大盤之鍵天上來,奔流扣字不復回,待到逆亂陰陽時,以我魔鍵扣青天,大天造化鍵…

來源:https://www./content-1-656451.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多