前言最近在做監控相關的配套設施,發現很多腳本都是基於Python的。很早之前就聽說其大名,人生苦短,我學Python,這並非一句戲言。隨著人工智慧、機器學習、深度學習的崛起,目前市面上大部分的人工智慧的代碼 大多使用Python 來編寫。所以人工智慧時代,是時候學點Python了。進軍指南對於沒有任 ...
前言
最近在做監控相關的配套設施,發現很多腳本都是基於Python的。很早之前就聽說其大名,人生苦短,我學Python,這並非一句戲言。隨著人工智慧、機器學習、深度學習的崛起,目前市面上大部分的人工智慧的代碼 大多使用Python 來編寫。所以人工智慧時代,是時候學點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 自行安裝
[root@AY140216131049Z mzitu]# python2 -V
Python
2.7.5
[root@AY140216131049Z mzitu]# python3 -V
Python
3.7.1
# 預設版本
[root@AY140216131049Z mzitu]# python -V
Python
2.7.5
# 臨時切換版本 <whereis python>
[root@AY140216131049Z mzitu]# alias python='/usr/local/bin/python3.7'
[root@AY140216131049Z 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張圖片。
[root@itstyle mzitu]# du -sh
17G .
[root@itstyle mzitu]# ll -s
total 5332
下麵,請小伙伴們睜大眼睛,雞凍人心的套圖時刻來了。
小結
作為一個初學者,腳本肯定多多少少有一些問題或者待優化的地方,另外註意不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你缺新項目練習或者沒有python精講教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,裡面很多新教程項目,還可以跟老司機交流討教!
本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。