用Python爬取了妹子網100G的套圖,值得收藏

来源:https://www.cnblogs.com/chengxuyuanaa/archive/2020/04/10/12676001.html
-Advertisement-
Play Games

前言最近在做監控相關的配套設施,發現很多腳本都是基於Python的。很早之前就聽說其大名,人生苦短,我學Python,這並非一句戲言。隨著人工智慧、機器學習、深度學習的崛起,目前市面上大部分的人工智慧的代碼 大多使用Python 來編寫。所以人工智慧時代,是時候學點Python了。進軍指南對於沒有任 ...


 


前言
最近在做監控相關的配套設施,發現很多腳本都是基於Python的。很早之前就聽說其大名,人生苦短,我學Python,這並非一句戲言。隨著人工智慧、機器學習、深度學習的崛起,目前市面上大部分的人工智慧的代碼 大多使用Python 來編寫。所以人工智慧時代,是時候學點Python了。

進軍指南
對於沒有任何語言開發經驗的同學,建議從頭系統的學起,無論是書、視頻還是文字教程都可以。
另外註意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你缺新項目練習或者沒有python精講教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,裡面很多新教程項目,還可以跟老司機交流討教!

如果是有其他語言開發經驗的同學,建議從一個案例入手,比如爬取某個網站的套圖。
因為語言都是想通的,語法之類的只要你要語感,代碼基本能讀個八九不離十。
所以不建議有經驗的開發者從頭學起,無論是視頻還是書,對於開始學一門語言來說都是太浪費時間了。
當然,等你深入進去以後,還是要系統的去學習,這是後話。
軟體工具
Python3
這裡選擇的是最新版 Python 3.7.1
安裝教程推薦:

Win下載地址:

Linux下載地址:

PyCharm
可視化開發工具:

案例
實現步驟
以妹子圖為例,其實很簡單,分以下四步:

  • 獲取首頁的頁碼數,並創建與頁碼對應的文件夾
  • 獲取頁面的欄目地址
  • 進入欄目,獲取欄目頁碼數(每個欄目下有多張圖片,分頁顯示)
  • 獲取到欄目下對用標簽中的圖片並下載

註意事項
爬取過程中,還需要註意以下幾點,可能對你有所幫助:
1)導庫,其實就類似於Java中框架或者是工具類,底層都被封裝好了
安裝第三方庫

  1. # Win下直接裝的 python3
  2. pip install bs4、pip install requests
  3. # Linux python2 python3 共存
  4. pip3 install bs4、pip3 install requests


導入第三方庫

  1. # 導入requests庫
  2. import requests
  3. # 導入文件操作庫
  4. import os
  5. # bs4全名BeautifulSoup,是編寫python爬蟲常用庫之一,主要用來解析html標簽。
  6. import bs4
  7. from bs4 importBeautifulSoup
  8. # 基礎類庫
  9. import sys
  10. # Python 3.x 解決中文編碼問題
  11. import importlib
  12. importlib.reload(sys)


2)定義方法函數,一個爬蟲可能會幾百行,所以儘量不要寫成一坨

  1. def download(page_no, file_path):
  2. # 這裡寫代碼邏輯


3)定義全局變數

  1. # 給請求指定一個請求頭來模擬chrome瀏覽器
  2. global headers # 告訴編譯器這是全局變數 headers
  3. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
  4. # 函數內使用之前需要
  5. # 告訴編譯器我在這個方法中使用的a是剛纔定義的全局變數 headers ,而不是方法內部的局部變數。
  6. global headers


4)防盜鏈
有些網站加入了防盜鏈,無所不能的 python 解決方案

  1. headers = {'Referer': href}
  2. img = requests.get(url, headers=headers)


5)切換版本
Linux伺服器使用的是阿裡雲伺服器,預設版本 python2,python3 自行安裝

  1. [root@AY140216131049Z mzitu]# python2 -V
  2. Python2.7.5
  3. [root@AY140216131049Z mzitu]# python3 -V
  4. Python3.7.1
  5. # 預設版本
  6. [root@AY140216131049Z mzitu]# python -V
  7. Python2.7.5
  8. # 臨時切換版本 <whereis python>
  9. [root@AY140216131049Z mzitu]# alias python='/usr/local/bin/python3.7'
  10. [root@AY140216131049Z mzitu]# python -V
  11. Python3.7.1


6)異常捕獲
在爬取的過程中可能存在異常頁面,這裡我們進行捕獲,不影響後續操作

  1. try:
  2. # 業務邏輯
  3. exceptExceptionas e:
  4. print(e)


代碼實現
編輯腳本:vi mzitu.py

  1. #coding=utf-8
  2. #!/usr/bin/python
  3. # 導入requests庫
  4. import requests
  5. # 導入文件操作庫
  6. import os
  7. import bs4
  8. from bs4 importBeautifulSoup
  9. import sys
  10. import importlib
  11. importlib.reload(sys)
  12. # 給請求指定一個請求頭來模擬chrome瀏覽器
  13. global headers
  14. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
  15. # 爬圖地址
  16. mziTu = 'http://www.mzitu.com/'
  17. # 定義存儲位置
  18. global save_path
  19. save_path = '/mnt/data/mzitu'
  20. # 創建文件夾
  21. def createFile(file_path):
  22. if os.path.exists(file_path) isFalse:
  23. os.makedirs(file_path)
  24. # 切換路徑至上面創建的文件夾
  25. os.chdir(file_path)
  26. # 下載文件
  27. def download(page_no, file_path):
  28. global headers
  29. res_sub = requests.get(page_no, headers=headers)
  30. # 解析html
  31. soup_sub = BeautifulSoup(res_sub.text, 'html.parser')
  32. # 獲取頁面的欄目地址
  33. all_a = soup_sub.find('div',class_='postlist').find_all('a',target='_blank')
  34. count = 0
  35. for a in all_a:
  36. count = count + 1
  37. if (count % 2) == 0:
  38. print("內頁第幾頁:" + str(count))
  39. # 提取href
  40. href = a.attrs['href']
  41. print("套圖地址:" + href)
  42. res_sub_1 = requests.get(href, headers=headers)
  43. soup_sub_1 = BeautifulSoup(res_sub_1.text, 'html.parser')
  44. # ------ 這裡最好使用異常處理 ------
  45. try:
  46. # 獲取套圖的最大數量
  47. pic_max = soup_sub_1.find('div',class_='pagenavi').find_all('span')[6].text
  48. print("套圖數量:" + pic_max)
  49. for j in range(1, int(pic_max) + 1):
  50. # print("子內頁第幾頁:" + str(j))
  51. # j int類型需要轉字元串
  52. href_sub = href + "/" + str(j)
  53. print(href_sub)
  54. res_sub_2 = requests.get(href_sub, headers=headers)
  55. soup_sub_2 = BeautifulSoup(res_sub_2.text, "html.parser")
  56. img = soup_sub_2.find('div', class_='main-image').find('img')
  57. if isinstance(img, bs4.element.Tag):
  58. # 提取src
  59. url = img.attrs['src']
  60. array = url.split('/')
  61. file_name = array[len(array)-1]
  62. # print(file_name)
  63. # 防盜鏈加入Referer
  64. headers = {'Referer': href}
  65. img = requests.get(url, headers=headers)
  66. # print('開始保存圖片')
  67. f = open(file_name, 'ab')
  68. f.write(img.content)
  69. # print(file_name, '圖片保存成功!')
  70. f.close()
  71. exceptExceptionas e:
  72. print(e)
  73. # 主方法
  74. def main():
  75. res = requests.get(mziTu, headers=headers)
  76. # 使用自帶的html.parser解析
  77. soup = BeautifulSoup(res.text, 'html.parser')
  78. # 創建文件夾
  79. createFile(save_path)
  80. # 獲取首頁總頁數
  81. img_max = soup.find('div', class_='nav-links').find_all('a')[3].text
  82. # print("總頁數:"+img_max)
  83. for i in range(1, int(img_max) + 1):
  84. # 獲取每頁的URL地址
  85. if i == 1:
  86. page = mziTu
  87. else:
  88. page = mziTu + 'page/' + str(i)
  89. file = save_path + '/' + str(i)
  90. createFile(file)
  91. # 下載每頁的圖片
  92. print("套圖頁碼:" + page)
  93. download(page, file)
  94. if __name__ == '__main__':
    main()


腳本在Linux伺服器下運行,執行以下命令

  1. python 3 mzitu.py
  2. # 或者後臺執行
  3. nohup python3 -u mzitu.py > mzitu.log 2>&1 &


目前只爬取了一個欄目的套圖,一共17G,5332張圖片。

  1. [root@itstyle mzitu]# du -sh
  2. 17G .
  3. [root@itstyle mzitu]# ll -s
  4. total 5332


下麵,請小伙伴們睜大眼睛,雞凍人心的套圖時刻來了。

 


小結
作為一個初學者,腳本肯定多多少少有一些問題或者待優化的地方,另外註意不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你缺新項目練習或者沒有python精講教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,裡面很多新教程項目,還可以跟老司機交流討教!
本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用 pip 安裝 pipenv pip install pipenv 拋出錯誤異常 連接超時 time out 解決方案 更換國內資源 操作: 在C:\Users\Administrator\下新建pip文件夾,在創建pip.ini文件,拷貝下麵代碼進去,保存 切換下載源地址為 [global] ...
  • 通俗理解spring源碼(一)—— 容器的基本實現 大家都知道spring的主要功能就是將本來由我們程式員new出來的對象,交給spring管理。這個管理不僅包括實例化的過程,還包括依賴註入等整個bean生命周期的管理。而spring是通過一個容器,來管理所有bean的。 spring容器的概念,和 ...
  • public class CopyText { public static void main(String[] args) { copy_1(); } public static void copy_1() { FileWriter fw = null; FileReader fr = null; ...
  • 垃圾回收器的發展歷程 背景 01、 解決的問題 垃圾回收器是 年正式提出, 開始正式支持,在 年作為 預設的垃圾處理器。 在 年的時候, 程式堆的記憶體越來越大,從而導致程式中可存活的活對象越來越多,因此 的`STW G1 STW`帶來的停頓時間太長了 。 在此之前效率也很高,但活對象數量一多, 時間 ...
  • 雖然目前越來越多的國產優秀技術產品走出了國門,但是對於眾領域的開發者來說,依然對於國外的各種基礎資源依賴還是非常的強。所以,一些網路基本技能一直都是我們需要掌握的,但是速度與穩定性問題一直也都有困擾著大家。 所以,今天就給眾 Java 開發者推薦兩個提速神器:Maven的國內鏡像和Spring的國內 ...
  • 上一篇我們通過一個簡單的Netty代碼瞭解到了Netty中的核心組件,這一篇我們將圍繞核心組件中的Channel來展開學習。 Channel的簡介 Channel代表著與網路套接字或者能夠進行IO操作(read、write、connect或者bind)的組件的聯繫,一個Channel向用戶提供瞭如下 ...
  • 為什麼需要epoll? 基於select 的I/O 復用技術速度過慢,從代碼上分析,最主要的兩點是 1. 每次調用select 函數是都需要向改函數傳遞對象信息 2. 需要遍歷所有文件描述符才能獲取有變化的文件描述符 epoll 不需要以上兩點操作 epoll 函數介紹 epoll_create e ...
  • 寫在前面 作為一名Java開發者,進大廠是不是所有人的期待,就是最終想獲得大廠的offer,可能在面試的時候會經歷層層篩選。想要進入大廠首先要有過硬的技術,以及面試的時候要有一個良好的心態,只有這樣在面試的時候才不會與心儀大廠失之交臂。 今天分享給大家的都是目前大廠使用最高頻的面試題:redis,S ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...