本篇主要面向于對(duì)Python爬蟲感興趣的零基礎(chǔ)的同學(xué)晤硕,實(shí)例為下載煎蛋網(wǎng)中指定頁面的妹子圖悼潭。好了,話不多說舞箍,讓我們開始吧舰褪!
為什么選取這個(gè)網(wǎng)站? 1.妹子 2.這個(gè)網(wǎng)站比較好爬取疏橄,適合入門
所需工具
1.Python3.x
2.Pycharm
3.Chrome瀏覽器
以上的安裝方法在此就不提了占拍,但是需要注意的是要把Python添加到路徑中(此處為了方便引用了廖雪峰老師的圖例)
創(chuàng)建文件以及庫的導(dǎo)入和安裝
各個(gè)軟件安裝調(diào)試完成后我們就開始著手我們的小項(xiàng)目。
1.打開Pycharm并且創(chuàng)建項(xiàng)目
(上面創(chuàng)建的項(xiàng)目是文件夾捎迫,這里右鍵你創(chuàng)建的文件夾晃酒,按照?qǐng)D中實(shí)例即可創(chuàng)建相應(yīng)文件)
假設(shè)現(xiàn)在你的Python file(名為'ooxx')已經(jīng)建好了,代碼第一行開始窄绒,我們導(dǎo)入所需要的庫掖疮。
庫是干什么的?Python之所以很好用就是因?yàn)樗性S多自帶的庫以及第三方庫颗祝,這些庫可以直接提供方法給用戶使用浊闪,例如導(dǎo)入math庫,就可以用來計(jì)算平方根螺戳;導(dǎo)入time庫搁宾,就可以計(jì)算程序運(yùn)行時(shí)間等等功能。無需我們自己再次重寫這些功能(也叫造輪子)
這樣就完成了所需庫的導(dǎo)入
1.這里是灰色的是因?yàn)樗鼈冞€沒有被使用
2.這里有兩種導(dǎo)入庫的方法倔幼,例如第5行是指從bs4庫中導(dǎo)入BeautifulSoup方法,這樣可以節(jié)約空間盖腿,因?yàn)槠渌姆椒ㄎ覀兌紩簳r(shí)用不著
此外,由于第三方庫你并沒有安裝后續(xù)會(huì)報(bào)錯(cuò)翩腐,這里提供一種簡(jiǎn)單的方法膏燃,Pycharm > Setting > 左上角搜索Project Interpreter
檢索上述你沒有安裝的庫,點(diǎn)擊綠色的+號(hào)后组哩,搜索點(diǎn)擊安裝等待片刻即可.(當(dāng)然也還有其他的很多安裝庫的方法等龙,比如pip,Anaconda等)
正式開始
啰嗦了一大堆準(zhǔn)備工作伶贰,現(xiàn)在正式開始(心虛.....因?yàn)楹罄m(xù)還會(huì)穿插很多小知識(shí)點(diǎn)照顧完全零基礎(chǔ)的朋友)
按照?qǐng)D中的代碼鍵入,右鍵 run'ooxx',下方就會(huì)顯示
<Response [200]>
來看第8行黍衙,等號(hào)右邊的表示調(diào)用requests庫的get方法泥畅,中間的參數(shù)填入我們所要訪問的網(wǎng)址(也就是上一步我們所賦值的url),然后將其整體賦予左邊的wb_data琅翻,打印wb_data柑贞,返回狀態(tài)碼200凌外,可以說只要狀態(tài)碼不是200的都不算正常訪問涛浙。
例如當(dāng)網(wǎng)站識(shí)別出你為爬蟲訪問,就會(huì)返回404或者其他狀態(tài)碼轿亮,那么你就得不到想要的數(shù)據(jù)我注。所以這里我們會(huì)先介紹一種最初級(jí)的隱匿措施,將我們利用Python的訪問變得更像瀏覽器訪問励七。
User - Agent
按照GIF中的操作我們可以獲取到Chrome瀏覽器訪問時(shí)的UA奔缠,我們將UA復(fù)制下來,加入到代碼中两波,
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
wb_data = requests.get('http://jandan.net/ooxx',headers = headers)
這樣我們?cè)L問網(wǎng)頁時(shí)的UA就是瀏覽器啦腰奋,然后抱怔,我們就得解析網(wǎng)頁,因?yàn)轫撁嬷械脑厝慷际谴娣旁诰W(wǎng)頁的源代碼之間的(可以右鍵>查看網(wǎng)頁源代碼試試看)
解析網(wǎng)頁
解析網(wǎng)頁這里我們用的是BeautifulSoup讼稚,這是比較常用也很方便的庫绕沈,在原來的代碼下加上
soup = BeautifulSoup(wb_data.text, 'lxml')
這時(shí)打印soup帮寻,我們就可以看見比較美觀的網(wǎng)頁源碼了。
重點(diǎn)到啦~
這時(shí)候我們需要找到我們需要下載的圖片在網(wǎng)頁中的位置固逗!
首先添加兩行代碼
img = soup.select(' ') # select中填入的selector就是我們需要找的
print(img)
了解一點(diǎn)html的同學(xué)(不了解也沒事)都知道,網(wǎng)頁是有結(jié)構(gòu)的惜傲,
但是我們需要的是Python自己去匹配而不是我們?nèi)フ铱停晕覀冞@樣做邪财。
如gif中所示,我們所復(fù)制的selector
#comment-3535468 > div > div > div.text > p > img:nth-child(3)
就是這個(gè)元素所獨(dú)有的地址糠馆,根據(jù)這個(gè)我們肯定是不能找到所有的圖片鏈接的弥奸,所以我們需要做適當(dāng)?shù)恼{(diào)整盛霎,以匹配所有的圖片鏈接,前面的comment-數(shù)字代表不同的用戶期揪,所以肯定不能要规个,后方的nth-child(3)表示img中第3個(gè)所以也不能要,就是說我們需要去除所有表示唯一的標(biāo)識(shí)才能匹配所有的元素缤苫,
最終我所找到的能匹配到所有圖片的selector為div > div > div.text > p > img
,將其加入剛才select.右鍵運(yùn)行墅拭。
可以看到我們已經(jīng)匹配了當(dāng)前頁面的所有img元素,然后我們需要獲取其中的圖片鏈接舒憾,但并不規(guī)范镀迂,而且也無法使用,所以用一個(gè)for循環(huán)獲取所有的鏈接的"src"部分
其中i.get('src')就是獲取內(nèi)部src處的文本
這里我們獲取的鏈接沒有頭部窟赏,所以我們需要自行在循環(huán)中添加
接下來就是最激動(dòng)人心的下載環(huán)節(jié)了饰序,我們有兩種方式规哪,一種是獲取所有的鏈接存放在列表中完成后依次下載,另一種就是獲取一個(gè)鏈接就開始下載蝠嘉,這里我們選擇第二種杯巨,
urllib.request.urlretrieve
方法如圖服爷,第一個(gè)參數(shù)是圖片鏈接,第二個(gè)是存放位置以及名字,其他的我們不管心褐。這里選擇E盤picture為例笼踩。并且加入計(jì)數(shù)器方便給圖片命名。
urllib.request.urlretrieve(pic_link, folder_path + '\\' + str(n) + pic_link[-4:])
這里的文件名是以文件夾加上\\然后文件名并且以鏈接的最后4個(gè)字符(用作后綴)給圖片命名掘而,就保證不會(huì)重名等問題袍睡。
最后的調(diào)整
現(xiàn)在肋僧!我們已經(jīng)能夠下載一頁圖片了持舆,當(dāng)然這還不夠,我們的目標(biāo)是星辰大海~~
首先點(diǎn)擊其他頁居兆,會(huì)發(fā)現(xiàn)地址欄有變化(加上了頁碼)
地址欄帶上了后綴泥栖,所以這里我們的思路是將上面的全部代碼打包成一個(gè)函數(shù),將地址欄用format和range函數(shù)寫成
urls = ['http://jandan.net/ooxx/page-{}'.format(str(i)) for i in range(起始頁碼,終止頁碼)]
的形式魏割,再利用for循環(huán)遍歷其中就可以下載我們所需頁碼的圖片啦~說干就干钢颂,這里我直接上最終的代碼
import requests
import urllib.request
import time
from bs4 import BeautifulSoup
# url = 'http://jandan.net/ooxx'
urls = ['http://jandan.net/ooxx/page-{}'.format(str(i)) for i in range(256,258)] # 鏈接列表
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
n = 0 # 計(jì)數(shù)器
def pic_download(url):
time.sleep(2) # 每次運(yùn)行暫停2秒
global n # 將n變?yōu)槿肿兞糠奖忝? wb_data = requests.get(url,headers = headers)
soup = BeautifulSoup(wb_data.text, 'lxml') # 解析網(wǎng)頁
img = soup.select('div > div.row > div.text > p > img') # 尋找img元素
folder_path = r'E:\Picture' # 存放文件夾所在位置(此處需先創(chuàng)建文件夾)
for i in img:
pic_link = ('http:' + i.get('src')) # 將所獲得的鏈接加上頭部
urllib.request.urlretrieve(pic_link, folder_path + '\\' + str(n) + pic_link[-4:]) # 開始下載
n = n + 1 # 每運(yùn)行一次n+1
print('download:'+pic_link)
print('===========下一頁================')
for i in urls: # 將鏈接列表循環(huán)
pic_download(i)
最終效果圖
結(jié)束語
1.這個(gè)教程適合的對(duì)象為零基礎(chǔ)或者有一點(diǎn)點(diǎn)基礎(chǔ)的想學(xué)爬蟲無從下手的同學(xué)遭垛,所以用到的方法盡量少且簡(jiǎn)單操灿,希望大佬們輕噴,有錯(cuò)誤可以指正
2.有點(diǎn)矛盾的是說是零基礎(chǔ)庶喜,但也得掌握點(diǎn)比如print,=賦值救鲤,for循環(huán),字符串的方法這些最最基礎(chǔ)的東西瘸羡,這里如果再一一講解那本文就太臃腫了搓茬,廖雪峰老師的教程,小甲魚的視頻都是很不錯(cuò)的自學(xué)教材峻村。
3.爬蟲涉及到的知識(shí)點(diǎn)非常非常多锡凝,一篇文章遠(yuǎn)遠(yuǎn)說不夠,例如說你會(huì)爬蟲张肾,那么網(wǎng)站就有反爬蟲,當(dāng)然高手還有反反爬蟲馁启,這之間的斗爭(zhēng)就像武林競(jìng)爭(zhēng)一般芍秆,你有一劍我有一式來來往往真的非常酷炫霉颠,所以這篇文章更多的我想是激發(fā)各位學(xué)爬蟲的熱情荆虱。
4.我知道肯定文中有很多地方對(duì)于新手來說還是不太好理解克伊,比如pic_link[-4:]是什么意思,selector到底怎么選等等問題愿吹,但我要說的是希望大家碰到問題應(yīng)該學(xué)會(huì)使用搜索引擎(即使是百度也可以)犁跪,學(xué)會(huì)檢索信息就能解決很多問題,并且收獲地更多寝优,還有比如說debug枫耳,幫助文檔,Python Console的使用等等钻心。
5.我也是個(gè)新手铅协,爬蟲之路也許才剛走到門檻上面,希望和大家共同進(jìn)步痒给!