0 前言
最近看完Python基本知識與正則表達式,嘗試寫下爬蟲,發現不知怎么入手,就上網查了下,看到了一片文章,感覺還不錯,根據上面的代碼嘗試寫了下,雖然是別人的代碼(代碼并不是完全可以運行,有點問題),自己敲一遍也算練習了下,中間也嘗試改動了一些。
參考文章:(http://www.lxweimin.com/p/384bfb49cdd6)
1 功能與實現
1.1 功能:
爬取一個網站( url = 'http://jandan.net/ooxx/',爬完發現是個***網站)的圖片,實現多頁爬取,把爬取的圖片按照1,2,3...編號
1.2 代碼實現
首先貼出主程序:
def main():
if not os.path.exists('folder'):#判斷是否存在‘folder’文件夾
os.mkdir('folder') #不存在則建立
os.chdir('folder') #改變工作目錄
pages = 3 #選擇爬取頁數,也可以用imput,在程序運行時輸入
url = 'http://jandan.net/ooxx/'
page_num = int(get_page(url)) #通過get_page(url)函數得到初始頁碼,便于爬取其他頁碼
num = 0 # num是圖片編碼,在save_imgs函數中用到
for i in range(pages): #逐一爬取每個網頁
page_num -= i #改變頁碼,選擇上一網頁
page_url = url + 'page-' + str(page_num) + '#comments' #獲取該網頁的URL
img_addrs = find_images(page_url) #獲取該網頁所有圖片地址
save_imgs(num, img_addrs) #保存圖片
num += len(img_addrs) #num作為圖片編碼,每次加上本次網頁的圖片數
if __name__ == '__main__':
main()
接下來,逐一寫出子函數
首先寫出常用獲取頁面內容的函數(獲取 text),可作為常用函數
#獲取URL返回網頁的text,圖片的信息存在content中
def getHTMLText(url):
try:
r = requests.get(url) #request get命令
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
獲取首頁頁碼值
def get_page(url):
html = getHTMLText(url) #獲取網頁內容
page = re.search(r'page-[0-9]{3}#', html).group() #找出含有本頁網址的那一段字符串
page_number = re.search(r'[0-9]{3}', page).group() #從這一段字符串提取出頁碼
return page_number #返回頁碼
獲取網頁的所有圖片地址
def find_images(url):
html = getHTMLText(url) #獲取網頁內容
img_src1 = []
img_src0 = re.findall(r'<img\ssrc=\".*?(?:\.jpg|\.png|\.gif)', html) #獲取該頁面所有包含圖片源地址的字符串
for img_src in img_src0:
img_src1.append(img_src[10:]) #獲取該頁面所有圖片地址
return img_src1
保存圖片
def save_imgs(num, img_addrs):
for img_addr in img_addrs: #圖片網址循環
num += 1 #每次加1 實現編碼
filename = str(num) + '.' + img_addr.split('.')[-1] #圖片名稱,img_addr.split('.')[-1]是用于獲取jpg,png,gif等格式,例如,名稱為1.jpg
img = requests.get('http:{}'.format(img_addr)).content #獲取圖片網址的內容,以二進制內容保存圖片內容
with open(filename, 'wb') as f:
f.write(img)
3 問題:
編寫過程中,存在一個問題
正則表達式,r'<img\ssrc=\".*?(?:\.jpg|\.png|\.gif)'
可以實現獲取源地址,若去掉?:
改為r'<img\ssrc=\".*?(\.jpg|\.png|\.gif)'
,則獲取的字符串是.jpg,不包含源地址
4 總結
- 開始時,學習別人的代碼,自己嘗試修改,可以盡快熟悉
- 入門后,盡快多寫代碼,爬不同的網站
- 有時候,一個小錯誤,查找了半天,編程要仔細
- 待續。。。。。。。。。。。。。。。。。。。。