Python使用BeautifulSoup簡單實現爬取妹子mm圖片--初級篇
先來個效果截圖(屈服在我的淫威之下吧!壞壞...嘿0.0)
因為是簡易版而且是自己寫著玩玩而已,自己也剛學,亦是筆記亦是分享,大佬輕噴就好。主要目的是希望更多人能夠體驗爬取一些seqing圖片的 快樂 ??哈哈
完整程式碼:文末已貼出
應該安裝個bs4的包就可以直接用了!程式碼有詳細註釋的,推薦直接看程式碼,後文是淺薄的講解...
↑加包方法
簡單逐步地講一下是怎麼實現的吧(有點像期末答辯的趕腳...不管了裝逼要緊!)
簡單式爬取一個網站資訊的步驟一般是:
1. 確定一個目標網址targetURL >> 2.分析該網站的HTML程式碼(藉助開發者工具
本例targetURL
http://www.mmonly.cc/mmtp/qcmn/237269.html
分析HTML
- 目標網站編碼格式是gb2312到時候解碼需要稍微注意
- 一些關鍵識別符號(紅框標出)幫助我們準確找到要使用的資訊
分析得知:
該網站HTML程式碼,我們知道了每一張大圖本身就是被a 連結標籤包圍的,而大圖的src屬性就是該圖片的下載地址。
那麼:
通過獲得<a>標籤中的href屬性我們可以找到下一個網頁,繼續爬取圖片
通過獲得<img>屬性中的src屬性,我們可以將大圖下載並儲存在本地。
使用BeautifulSoup獲取想要內容
用本例中的程式碼來大致說明一下基本步驟與使用:
#1.導包
from bs4 import BeautifulSoup
#2.新建物件,第一個引數HTML原始碼,第二個引數是解析器類別
soup = BeautifulSoup(html, 'html.parser')
#3.查詢 ,
Divs = soup.find_all('div',attrs={'id':'big-pic' })#從soup物件中,查詢 'id'='big-pic' 的div 標籤 , 返回值是Tag型別
picLink = (div.find('a').find('img')['src'])#查詢div中的a標籤中的img標籤中的src屬性 , 返回值是str
本例我們最想要的就是picLink了(圖片下載地址),有了picLink,我們就可以利用它下載並儲存圖片放置本地了。
儲存資料
上一步已經獲取了想要的下載連結,最後一步就是下載儲存了。如下
執行效果:
本例完整程式碼:
import urllib.request
from bs4 import BeautifulSoup
import os
def Download(url,picAlt,name):
path = 'D:\\pythonDemo____________爬蟲____________\\'+picAlt+'\\'
if not os.path.exists(path):#判斷系統是否存在該路徑,不存在則建立
os.makedirs(path)
urllib.request.urlretrieve( url, '{0}{1}.jpg'.format(path, name)) # ,下載圖片儲存在本地
header = {
"User-Agent":'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.8',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
"""
使用者代理(User-Agent):用於偽裝程式不是爬蟲,讓伺服器以為你是一個正常使用者。
是一種向訪問網站提供你所使用的瀏覽器型別、作業系統及版本、CPU 型別、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等資訊的標識。
UA字串在每次瀏覽器 HTTP 請求時傳送到伺服器
"""
}
def run(targetUrl, beginNUM ,endNUM):
req = urllib.request.Request(url=targetUrl,headers=header)
response = urllib.request.urlopen(req)#這裡的req可看成一種更為高階的URL
html = response.read().decode('gb2312','ignore')#解碼 得到這個網頁的html原始碼:這個網站的編碼使用的是GB2312格式,更常見的網站編碼格式應該是UTF-8了吧
soup = BeautifulSoup(html, 'html.parser')#將得到的HTML程式碼使用python自帶的解析器(也可以使用lxml解析器,效能會更好,本程式碼從簡
Divs = soup.find_all('div',attrs={'id':'big-pic' })#使得條件唯一,找到我們想要下載的目標。這裡語法是bs,主流的解析搜尋方式有:bs,xpath和正則 ,小白還是用bs吧
nowpage = soup.find('span',attrs={'class':'nowpage'}).get_text()#獲取當前頁碼
totalpage= soup.find('span',attrs={'class':'totalpage'}).get_text()#獲取所有頁
if beginNUM ==endNUM :#跳出條件
return
for div in Divs:#遍歷所有大圖所在的div,其實只有一個元素。因為前面使用的是find_all()方法得到的是集合,所以這要遍歷了。有點不太實用 因為與照顧到語法使用全面的意思
beginNUM = beginNUM+1
if div.find("a") is None :#如果這張圖片沒有下一張圖片的連結
print("沒有下一張了")
return
elif div.find("a")['href'] is None or div.find("a")['href']=="":#有連結,但是是 空連結
print("沒有下一張了None")
return
print("=====================================================下載資訊:總進度:",beginNUM,"/",endNUM," ,正在下載套圖:(",nowpage,"/",totalpage,")====================================")
if int(nowpage)<int(totalpage):#nowpage,totalpage是str型別;(如果不轉換成int來比較的話,totalPage是字串“12”無法與‘1’‘2’這些單個字元的字串比較)
nextPageLink ="http://www.mmonly.cc/mmtp/qcmn/" +(div.find('a')['href'])
elif int(nowpage)==int(totalpage):
nextPageLink = (div.find('a')['href'])
picLink = (div.find('a').find('img')['src'])#本網站大圖的SRC屬性是下一張圖片的連結
picAlt = (div.find('a').find('img'))['alt']#圖片的名字alt屬性
print('下載的圖片連結:',picLink)
print('套圖名:[ ', picAlt , ' ] ')
print('開始下載...........')
Download(picLink,picAlt, nowpage)
print("下載成功!")
print('下一頁連結:',nextPageLink)
run(nextPageLink,beginNUM ,endNUM)#遞迴
return
#################################main 函式########################################
if __name__ == '__main__':
#可以是這個網站(http://www.mmonly.cc/mmtp/qcmn/)下的任意一個網址(如下)開始爬取,means爬取的起點()
# targetUrl ="http://www.mmonly.cc/mmtp/qcmn/258345_2.html"
# targetUrl ="http://www.mmonly.cc/mmtp/qcmn/259676_8.html"
targetUrl ="http://www.mmonly.cc/mmtp/qcmn/237269.html"
run(targetUrl,beginNUM=0,endNUM=60)#設定下載圖片數量:endNUM-beginNUM 數字相減為總數量
print("【【【【 OVER! 】】】】】")