1. 程式人生 > >100G套圖我用pythono爬蟲雙手奉上,給方法給資源你對哪個心動?

100G套圖我用pythono爬蟲雙手奉上,給方法給資源你對哪個心動?

 

100G套圖我用pythono爬蟲雙手奉上,給方法給資源你對哪個心動?

 

前言

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

進軍指南

對於沒有任何語言開發經驗的同學,建議從頭系統的學起,無論是書、視訊還是文字教程都可以。

如果是有其他語言開發經驗的同學,建議從一個案例入手,比如爬取某個網站的套圖。

因為語言都是想通的,語法之類的只要你要語感,程式碼基本能讀個八九不離十。

所以不建議有經驗的開發者從頭學起,無論是視訊還是書,對於開始學一門語言來說都是太浪費時間了。

當然,等你深入進去以後,還是要系統的去學習,這是後話。

軟體工具

Python3

這裡選擇的是最新版 Python 3.7.1

安裝教程推薦:

http://www.runoob.com/python3/python3-install.html
Win下載地址:
https://www.python.org/downloads/windows
Linux下載地址:
https://www.python.org/downloads/source
PyCharm
視覺化開發工具:
http://www.jetbrains.com/pycharm
案例

實現步驟

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

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

注意事項

爬取過程中,還需要注意以下幾點,可能對你有所幫助:

1)導庫,其實就類似於Java中框架或者是工具類,底層都被封裝好了

安裝第三方庫

# Win下直接裝的 python3
pip install bs4、pip install requests
# Linux python2 python3 共存
pip3 install bs4、pip3 install requests

匯入第三方庫

# 匯入requests庫
import requests
# 匯入檔案操作庫
import os
# bs4全名BeautifulSoup,是編寫python爬蟲常用庫之一,主要用來解析html標籤。
import bs4
from bs4 import BeautifulSoup
# 基礎類庫
import sys
# Python 3.x 解決中文編碼問題
import importlib
importlib.reload(sys)

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

def download(page_no, file_path):
# 這裡寫程式碼邏輯

3)定義全域性變數

# 給請求指定一個請求頭來模擬chrome瀏覽器
global headers # 告訴編譯器這是全域性變數 headers
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'}
# 函式內使用之前需要
# 告訴編譯器我在這個方法中使用的a是剛才定義的全域性變數 headers ,而不是方法內部的區域性變數。
global headers

4)防盜鏈

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

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

5)切換版本

Linux伺服器使用的是阿里雲伺服器,預設版本 python2,python3 自行安裝

[[email protected] mzitu]# python2 -V
Python 2.7.5
[[email protected] mzitu]# python3 -V
Python 3.7.1
# 預設版本
[[email protected] mzitu]# python -V
Python 2.7.5
# 臨時切換版本 <whereis python>
[[email protected] mzitu]# alias python='/usr/local/bin/python3.7'
[[email protected] mzitu]# python -V
Python 3.7.1

6)異常捕獲

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

try:
# 業務邏輯
except Exception as e:
print(e)

程式碼實現

編輯指令碼:vi mzitu.py

#coding=utf-8
#!/usr/bin/python
# 匯入requests庫
import requests
# 匯入檔案操作庫
import os
import bs4
from bs4 import BeautifulSoup
import sys
import importlib
importlib.reload(sys)
# 給請求指定一個請求頭來模擬chrome瀏覽器
global headers
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'}
# 爬圖地址
mziTu = 'http://www.mzitu.com/'
# 定義儲存位置
global save_path
save_path = '/mnt/data/mzitu'
# 建立資料夾
def createFile(file_path):
if os.path.exists(file_path) is False:
os.makedirs(file_path)
# 切換路徑至上面建立的資料夾
os.chdir(file_path)
# 下載檔案
def download(page_no, file_path):
global headers
res_sub = requests.get(page_no, headers=headers)
# 解析html
soup_sub = BeautifulSoup(res_sub.text, 'html.parser')
# 獲取頁面的欄目地址
all_a = soup_sub.find('div',class_='postlist').find_all('a',target='_blank')
count = 0
for a in all_a:
count = count + 1
if (count % 2) == 0:
print("內頁第幾頁:" + str(count))
# 提取href
href = a.attrs['href']
print("套圖地址:" + href)
res_sub_1 = requests.get(href, headers=headers)
soup_sub_1 = BeautifulSoup(res_sub_1.text, 'html.parser')
# ------ 這裡最好使用異常處理 ------
try:
# 獲取套圖的最大數量
pic_max = soup_sub_1.find('div',class_='pagenavi').find_all('span')[6].text
print("套圖數量:" + pic_max)
for j in range(1, int(pic_max) + 1):
# print("子內頁第幾頁:" + str(j))
# j int型別需要轉字串
href_sub = href + "/" + str(j)
print(href_sub)
res_sub_2 = requests.get(href_sub, headers=headers)
soup_sub_2 = BeautifulSoup(res_sub_2.text, "html.parser")
img = soup_sub_2.find('div', class_='main-image').find('img')
if isinstance(img, bs4.element.Tag):
# 提取src
url = img.attrs['src']
array = url.split('/')
file_name = array[len(array)-1]
# print(file_name)
# 防盜鏈加入Referer
headers = {'Referer': href}
img = requests.get(url, headers=headers)
# print('開始儲存圖片')
f = open(file_name, 'ab')
f.write(img.content)
# print(file_name, '圖片儲存成功!')
f.close()
except Exception as e:
print(e)
# 主方法
def main():
res = requests.get(mziTu, headers=headers)
# 使用自帶的html.parser解析
soup = BeautifulSoup(res.text, 'html.parser')
# 建立資料夾
createFile(save_path)
# 獲取首頁總頁數
img_max = soup.find('div', class_='nav-links').find_all('a')[3].text
# print("總頁數:"+img_max)
for i in range(1, int(img_max) + 1):
# 獲取每頁的URL地址
if i == 1:
page = mziTu
else:
page = mziTu + 'page/' + str(i)
file = save_path + '/' + str(i)
createFile(file)
# 下載每頁的圖片
print("套圖頁碼:" + page)
download(page, file)
if __name__ == '__main__':
main()

指令碼在Linux伺服器下執行,執行以下命令

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

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

[[email protected] mzitu]# du -sh 
17G .
[[email protected] mzitu]# ll -s
total 5332

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

100G套圖我用pythono爬蟲雙手奉上,給方法給資源你對哪個心動?

 

小結

作為一個初學者,指令碼肯定多多少少有一些問題或者待優化的地方,如遇Python大嬸,還請多多指教。

100G套圖我用pythono爬蟲雙手奉上,給方法給資源你對哪個心動?

 

 

其實指令碼很簡單,從配置環境、安裝整合開發環境、編寫指令碼到整個指令碼順利執行,差不多花費了四五個小時,最終指令碼一根筋的執行。限於伺服器頻寬以及配置的影響,17G的圖差不多下載了三四個小時,至於剩下的83G,小夥伴們自行下載吧。