python的介紹這里不再贅述,雖說(shuō)用很多語(yǔ)言都能寫(xiě)出爬蟲(chóng)(哪怕是oc或者swift),但python毫無(wú)疑問(wèn)是當(dāng)前寫(xiě)爬蟲(chóng)最為優(yōu)秀的語(yǔ)言之一。
雖說(shuō)很久之前就下載了python3,PyCharm,但真正意義的學(xué)習(xí)是昨天開(kāi)始的。
而且,學(xué)習(xí)python的初衷,也是為了寫(xiě)一手爬蟲(chóng)出去裝逼,所以那些基礎(chǔ)語(yǔ)法也就是大概看看,抱著用到時(shí)去谷歌的心態(tài)跳過(guò)了基礎(chǔ)學(xué)習(xí)這一相當(dāng)重要的過(guò)程(先整出一手爬蟲(chóng)再說(shuō))。
爬蟲(chóng)我個(gè)人認(rèn)為上手很簡(jiǎn)單,主要有三點(diǎn):網(wǎng)絡(luò)請(qǐng)求,文件操作,正則表達(dá)
抱著借鑒一手的心態(tài),去網(wǎng)上各種找源碼。然而,本來(lái)python3的源碼就相對(duì)較少,而且下過(guò)來(lái)大部分運(yùn)行不了,各種報(bào)錯(cuò)。少數(shù)運(yùn)行成功也沒(méi)有成功爬取數(shù)據(jù),看來(lái)還是要靠自己啊(之所以爬不出數(shù)據(jù),原因很多,大多和爬取頁(yè)面格式改變有關(guān))。
首先確定爬取數(shù)據(jù)的目標(biāo):某個(gè)運(yùn)行失敗的源碼中的目標(biāo):煎蛋妹子圖(這就很舒服了。。。)
引用一些模塊
import urllib.request 網(wǎng)絡(luò)請(qǐng)求相關(guān)
import os 文件操作相關(guān)
import re 正則表達(dá)相關(guān)
import random 單純的獲取隨機(jī)數(shù)
作為初學(xué)者,沒(méi)有用框架的經(jīng)驗(yàn),什么scrapy的I don't care。
下面是主要代碼(多為拷貝后修改)
首先,先寫(xiě)網(wǎng)絡(luò)請(qǐng)求的代碼
def url_open(url):
req = urllib.request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20170522 Firefox/36.0')
response = urllib.request.urlopen(req)
return response.read()
然后去創(chuàng)建文件夾
def download_mm_img (folder='default',pages=10):
if not os.path.exists(folder):#判斷是否存在該文件夾
os.mkdir(folder) #新建文件夾
os.chdir(folder) #跳轉(zhuǎn)到文件夾
folder_top = os.getcwd() #獲取當(dāng)前工作目錄
for i in range(pages):
page_num -= i #遞減下載幾個(gè)網(wǎng)頁(yè)
page_url = url + 'page-' + str(page_num) + '#comments' #組合網(wǎng)頁(yè)地址
img_addrs = find_imgs(page_url) #獲取圖片地址
save_imgs(img_addrs,page_num,folder) #保存圖片
os.chdir(folder_top) #修改當(dāng)前目錄,也就是返回上一層
獲取網(wǎng)頁(yè)最新的地址
def get_page(url):
html = url_open(url).decode('utf-8')
pattern = r'<span class="current-comment-page">\[(\d{2})\]</span>' # 正則表達(dá)式尋找頁(yè)面地址,這里要去看網(wǎng)頁(yè)源代碼,然后根據(jù)代碼確定
result = re.findall(pattern,html)
page = int(result[0])
return page
獲取圖片地址
def find_imgs(page_url):
pattern = r'<img src="(.*?\.jpg)"'
html = url_open(page_url).decode('utf-8')
img_addrs = re.findall(pattern,html)
return img_addrs
保存每個(gè)頁(yè)面的圖片
def save_imgs(img_addrs,page_num,folder):
if not os.path.exists(str(page_num)):#判斷是否存在該文件夾
os.mkdir(str(page_num))
os.chdir(str(page_num))
count = 0;
for i in img_addrs:
count += 1
if not i.startswith('http:'):
i = 'http:' + i
filename = str(count) + 'wylog' + str(int(random.random()*1000)) + 'wylog' + i.split('/')[-1]
print('wylog',filename,i)
image = url_open(i)
with open(filename,'wb') as f:
f.write(image)
f.close()
下載過(guò)來(lái)的圖片:
