自己寫爬蟲主要是用來學習python,請大家不要過分的爬取別人的站點,給瀏覽網站造成影響
上篇講了如何爬去百度貼吧內容,今天講一講圖片保存的例子,伯樂在線有個面向對象(就是相親哦)的網頁,裏面有很多妹子的個人介紹,我們主要爬取圖片,按照編號名稱創建文件夾存儲在文件夾中。
1 分析url
伯樂在線打開詳細頁面後的網址爲http://date.jobbole.com/4767/
其中4767爲個人id,每個人的id是對應的不同頁面,好我們就把url分成2部分
baseurl = http://date.jobbole.com/
pn = 4767
2 頁面分析
方法是一樣的,還是用火狐瀏覽器F12,打開調試頁面
3 寫正則過濾規則
pattern = re.compile('<p.?<img class="alignnone" src="(.?)" width.*?></p>', re.S)
關於正則匹配的問題,沒有辦法,只能是多找網頁多練習,我也剛接觸,也不敢說自己的是最好的,但能實現獲取圖片的鏈接就行了。
4 代碼實現
代碼內容中只是增加了request.urlretrieve的使用,通過這個模塊將圖片保存下來。
# -*- coding: utf-8 -*-
# 爬取伯樂在線相親妹子圖片程序
import re
import os
import time
from urllib import request
class BoLe:
"""
定義爬取伯樂在線程序的類
"""
def __init__(self, baseurl):
"""
初始化參數
"""
self.baseurl = baseurl
def getpage(self, pn):
"""
定義獲取頁面圖片方法
"""
try:
url = self.baseurl + str(pn)
time.sleep(1)
req = request.Request(url)
response = request.urlopen(req)
return response.read().decode('utf-8')
except request.URLError as e:
if hasattr(e, 'reason'):
print(e.reason)
elif hasattr(e, 'code'):
print(e.code)
def getimg(self, page, pn):
"""
獲取當前頁面圖片
"""
# 定義正則,獲取內容
pattern = re.compile('<p.*?<img class="alignnone" src="(.*?)" width.*?></p>', re.S)
items = re.findall(pattern, page)
for item in items:
# print(item)
# print(pn)
# 通過urlretrieve模塊將圖片保存下來,圖片名稱用time.time()生成當前時間,防止重名覆蓋
request.urlretrieve(str(item), 'E:\\' + str(pn) + "\\" + '% s' % time.time() + '.jpg')
def mkdir(self, pn):
"""
創建文件夾方法,將獲取的個人id作爲文件夾名稱創建文件,圖片保存在這個文件夾下
pn指的是每個妹子的個人id
"""
# 定義路徑變量
path = 'E:\\' + str(pn)
# 通過os模塊的exists方法判斷目錄是否存在,存在返回False,不存在則創建
if os.path.exists(path):
return False
else:
# 通過mkdir創建文件夾
os.mkdir(path)
# print(path + '*****************')
return True
def start(self, start, end):
"""
啓動方法,通過傳入的start,end參數獲取這個斷內的所有號碼作爲用戶id
爬取每個id的主頁圖片
"""
# 通過for循環方式執行,pn爲start和end+1之間的數字,也就是個人id
for pn in range(start, end+1):
page = self.getpage(pn)
# 通過判斷,如果不存在就打印網頁不存在,存在就保存再相應的id目錄中
if page is None:
print("編號%s的網頁不存在" % pn)
continue
else:
self.mkdir(pn)
self.getimg(page, pn)
if __name__ == '__main__':
baseurl = 'http://date.jobbole.com/'
bole = BoLe(baseurl)
bole.start(4750, 4850)
最終效果: