Python爬蟲實戰——從大師網站自動下載項目圖片

2021-02-13 非解構

        小編身為建築師,經常需要到各種建築網站找項目的參考圖片。然而這年頭各個大師們的事務所網站大家都懂得,各種高冷或者炫酷的動畫效果讓人一次只能看一張圖,要想更高效率的看圖或者下載到高清大圖就更加麻煩了。

        那麼身為新時代的設計師,有沒有簡單高效的方式來搞定這一切嗎?

        有!答案就是Python爬蟲

        我們今天以著名結構建築兩棲大師卡拉特拉瓦的個人網站為例。簡單介紹下怎樣用Python爬蟲高效獲取大師的高清作品集。

用爬蟲獲取大師的作品集,其實原理上跟瀏覽網頁一樣,都是先打開項目的頁面,點開高清大圖,然後保存圖片,只不過python爬蟲的速度很快而已。

因為是爬取圖片,所以本次爬蟲沒有使用Selenium,而是選擇了純代碼的方式,這樣可以省下瀏覽器打開圖片渲染頁面的時間消耗。

整個爬蟲分為四個步驟:

訪問網站

找到有哪些項目,以及項目的詳細介紹的網頁

在項目詳細介紹的網頁找到高清大圖的地址

下載圖片

        在最開始我們可以用任意一款python編輯器,新建一個空的.py的文件。然後在最開頭的地方加入我們需要用到的程序包,本次爬蟲用了Beautifulsoup包,如果沒有安裝可以按以下方法安裝。

pip install beautifulsoup4
pip3 install beautifulsoup4

Beautifulsoup包安裝方法,強烈推薦使用Anaconda,這些常用包都是默認配置好的。

import requests, re, osfrom bs4 import BeautifulSoup

project_url = r'https://calatrava.com/projects.html?all=yes'def download_page(url):    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'               }    data = requests.get(url, headers=headers).content.decode('utf-8')    return data

2.找到有哪些項目,以及項目的詳細介紹的網址

我們可以通過F12調出瀏覽器的開發者工具,看看這個網頁到底是怎麼構成的。我們可以看到所有的項目信息都在一個<div>打頭的大標籤裡。在這個標籤中,每個項目又分別對應了一個<li>的標籤,li標籤的class名是odd或者even。利用Beautifulsoup的find_all方法,我們就可以拆分出這個頁面中出現的每個項目的網頁信息,而項目的詳細地址

def parse_html(url):    html = download_page(url)    soup = BeautifulSoup(html, features='lxml')    project_list_part=soup.find("div",{"class":"mod_cal_project_list thumb_view block"})    project_list_soup = project_list_part.find_all('li', {'class': {'odd',"even"}})    return project_list_soupdef get_project_title(project_list_soup):    project_title = []    for link in project_list_soup:        project_year = link.find('span', {'class': 'year'})        links = link.find('a')['href']        name = str(project_year.string) + '--'+ str(links[9:-5])        project_title.append(name)    return project_titledef get_project_link(project_list_soup):    project_link = []    for link in project_list_soup:        links = link.find('a')['href']                links = str(r"https://calatrava.com/" + links+r"?view_mode=gallery")        project_link.append(links)    return project_link

3.我們需要在項目詳細介紹的網頁找到高清大圖的地址。

我們依然按F12進入瀏覽器的開發者模式,進入Network標籤頁,找到項目的大圖的實際地址。再通過大圖的實際地址轉到element標籤頁中進行查找,這樣我們可以解析出隱藏在翻頁動畫背後的高清大圖的存儲結構。

在開發者模式的network標籤頁中找到高清大圖的位置

用找到的高清大圖的名稱,回到element標籤頁中Ctrl+F查找這個名稱

至此我們可以發現頁面的動畫效果是通過一個JavaScript代碼實現的,而每個項目的大圖都是結構化的存儲在這段json對象中,那我們直接用正則表達式提取出來就好了。

def parse_sub_html(project_link):    html = download_page(project_link)    project_soup = BeautifulSoup(html, features='lxml')        project_img_links_script=project_soup.find_all("script")    project_img_links=re.findall(r"'(?P<addr>files.*)',  title",str(project_img_links_script))    for i in range(len(project_img_links)):        project_img_links[i]=str(r"https://calatrava.com/")+project_img_links[i]        print(project_img_links)    print("此項目大圖數量 = "+len(project_img_links))    return project_img_links

def save_img(links, name):    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}    os.makedirs('./Calatrava project img/', exist_ok=True)    t = 1    for link in links:        filename = str('./Calatrava project img/' + str(name) + '%s.jpg' % (repr(t)))        print("Downloading----",str(filename))        with open(filename, "wb") as img:            img.write(requests.get(link, headers=headers).content)            t += 1

至此我們每一個步驟的方法都寫完了,最後的最後組裝成一個main函數運行就可以搓手收圖了。

def main():    soup = parse_html(project_url)        name = get_project_title(soup)    link = get_project_link(soup)    print(link)            t = 0    while t < len(name):                if link[t] == "":            print("Skip it,Because it is null,Hurry coding,,Fix it later")            t += 1        else:            img_list = parse_sub_html(link[t])            print('Project Name is :', name[t])            save_name = str(repr(t + 1)+"-" + name[t])            save_img(img_list, save_name)            print('No %s is ok' % repr(t + 1))            t += 1
if __name__ == '__main__':    main()

運行狀態

卡拉特拉瓦的事務所網站一共90個項目,630張高清大圖,就這樣可以自動下好了。而且這個爬蟲基本可以覆蓋市面上95%以上的事務所網站的構架了,稍微改改地址之類的操作就可以一蟲多用,是不是真香!

本文僅做python爬蟲的技術探討,請各位在法律框架下謹慎使用。

‍‍‍‍

相關焦點

  • 使用Python爬蟲實現自動下載圖片
    python爬蟲支持模塊多、代碼簡潔、開發效率高 ,是我們進行網絡爬蟲可以選取的好工具。
  • 歐美音樂網站Python爬蟲項目實戰
    爬蟲項目實戰0x01 目標分析最近發現一個比較好的歐美音樂下載網站,可以下載大部分高質量歐美音樂。
  • 爬蟲 | Python 自動下載百度圖片
    製作一個爬蟲一般分以下幾個步驟:分析需求分析網頁原始碼,配合開發者工具編寫正則表達式或者XPath表達式正式編寫 python 爬蟲代碼效果預覽運行效果如下:需求分析我們的爬蟲至少要實現兩個功能:一是搜索圖片,二是自動下載。搜索圖片:最容易想到的是爬百度圖片的結果,我們就上百度圖片看看:
  • python爬蟲資源匯總:書單、網站博客、框架、工具、項目(附資源)
    隨著爬蟲技術的流行,網上的資源層出不窮,但對於初學者來說,可能難以選擇,如果選錯還會在爬蟲學習上走一些彎路。我們專門針對零基礎的同學做了一份python爬蟲資源匯總,包含書單、網站博客、框架、工具以及項目匯總。至於為什麼選擇python語言,是因為python對於小白來說更容易上手。
  • 推薦18個Python爬蟲實戰案例
    目錄爬蟲小工具爬蟲實戰筆趣看小說下載VIP視頻下載百度文庫文章下載_rev1百度文庫文章下載_rev2《帥啊》網帥哥圖片下載構建代理IP池《火影忍者》漫畫下載財務報表下載小助手一小時入門網絡爬蟲抖音App視頻下載_rev1
  • Python網絡爬蟲應用實戰
    從小到伺服器運維的腳本,到大型軟體開發,使用python都能夠很靈活的快速實現。python不但可以快速實現大型的web應用程式,在網絡層的開發,以及工程計算、數學計算上都有方便的開發手段。Map&Reduce思想在python裡面也有著非常方便的實現。甚至在一些嵌入式設備上,你也可以實現自己的python應用。
  • 18個Python爬蟲實戰案例(已開源)
    點擊上方「Python技術之巔」,馬上關注,每天下午17:40準時推送目錄爬蟲小工具爬蟲實戰筆趣看小說下載VIP視頻下載百度文庫文章下載_rev1百度文庫文章下載_rev2《帥啊》網帥哥圖片下載構建代理IP池
  • 乾貨 | 18個Python爬蟲實戰案例(已開源)
    目錄爬蟲小工具爬蟲實戰筆趣看小說下載VIP視頻下載百度文庫文章下載_rev1
  • Python爬蟲實戰 批量下載高清美女圖片
    彼岸圖網站裡有大量的高清圖片素材和壁紙,並且可以免費下載,讀者也可以根據自己需要爬取其他類型圖片,方法是類似的,本文通過python爬蟲批量下載網站裡的高清美女圖片
  • 18個網站的Python爬蟲登錄示例 | 開源項目推薦
    作者 | CriseLYJ來源 | CriseLYJ的GitHub該項目收集了一些各大網站登陸方式和一些網站的爬蟲程序
  • Github最熱門的200個Python中文項目
    😮python模擬登陸一些大型網站,還有一些簡單的爬蟲,希望對你們有所幫助❤️,如果喜歡記得給個star哦🌟13.4k17Jack-Cherish/python-spider🌈Python3網絡爬蟲實戰:淘寶、京東、網易雲、B站、12306、抖音、筆趣閣、漫畫小說下載、音樂電影下載等13.1k18
  • 一入爬蟲深似海,從此遊戲是路人!分享我的Python爬蟲學習經驗和資料!
    知識技能scrapy, scrapy-redis, scrapyd數據處理:MySQL, Redis, Elastic Search3./代理池 https://github.com/jhao104/proxy_pool4 知識體系當你有了一定的基礎,最好的學習方式就是參考開源的項目,去實戰,去實戰,去實戰!
  • Python爬蟲實戰——從太平洋地震工程研究中心資料庫自動下載地震波時程
    爬蟲,小編身為結構工程師,這個詞直到我意識到我需要從太平洋地震工程研究中心(PEERC)資料庫下載海量地震波時程之前都是又遙遠又神秘的。整個地震波時程的下載流程大概是這樣的:進入PEERC的網站,找到資料庫,登陸帳號,搜地震波號,點擊下載,搜地震波號,點擊下載,搜地震波號,點擊下……我想我可以不用再往下說了。
  • Python3 網絡爬蟲快速入門實戰解析
    本文以實戰為主,閱讀過程如稍有不適,還望多加練習。網絡爬蟲簡介網絡爬蟲,也叫網絡蜘蛛(Web Spider)。它根據網頁地址(URL)爬取網頁內容,而網頁地址(URL)就是我們在瀏覽器中輸入的網站連結。比如:https://www.baidu.com/,它就是一個 URL。
  • Python開發簡單爬蟲【學習資料總結】
    有些URL存在相互自動跳轉的關係使用HTTPRedirectHandler進行處理。開發爬蟲的步驟開發爬蟲步驟python語言基礎:(帶你熟悉python語言的特性,學會使用python開發環境,使用python開發一些簡單的案例)(1)Python3入門,數據類型,字符串
  • 玩轉Python必須熟練掌握的 38 個實戰項目
    我們在學習過程中最容易犯的一個錯誤就是:看的多動手的少,特別是對於一些項目的開發學習就更少了!沒有一個完整的項目開發過程,是不會對整個開發流程以及理論知識有牢固的認知的,對於怎樣將所學的理論知識應用到實際開發中更是不得而知了!以上就是我們在學習過程中必須要有項目實戰開發經驗的原因,其實無論項目大小,但是一定要動手去進行開發學習。
  • python爬蟲--自動下載cosplay小姐姐圖片
    這樣爬蟲也太簡單了吧在這裡插入圖片描述其實大家根據xpath這個名字就能看出來他是通過路徑來查找我們需要的元素的。在這裡插入圖片描述2.遇到的 bug以及解決措施2.1bug因為之前一直是直接存儲到我們的python項目下的文件夾中,一旦量大了之後就會很影響我的觀感體驗,所以我想著能不能自定義存儲路徑
  • Python爬蟲下載美女圖片(不同網站不同方法)!全教你了哦!
    讀者朋友理解思路就好一、思路介紹  不同的圖片網站設有不同的反爬蟲機制,根據具體網站採取對應的方法  1.Python測試類獲取網頁內容,從而獲取圖片地址  3. Python測試類下載圖片,保存成功則爬蟲可以實現 二、豆瓣美女(難度:❤)  1.
  • 【在線學Python】從入門到企業項目實戰!
    編程了解Python基本的函數操作這時候你可以看得懂簡單的python項目代碼了!實戰項目:用python做一個屬於自己的計算器適合人群二階段:框架知識進階核心專題Python庫Python 框架階段介紹:該階段你能學習到python所有強大的庫的運用 以及了解python重要的幾個框架包括:Django、tornado、Bottle、web py、Flask、Pyramid、Aiohttp
  • 【爬蟲實戰】Python爬取「磁力熊」網站
    最近跟隨螞蟻老師學習了用flask框架開發web項目以及爬蟲,我就打算自己開發一個電影網站練練手