運維學python之爬蟲基礎篇實戰(七)爬取伯樂在線面向對象圖片

自己寫爬蟲主要是用來學習python,請大家不要過分的爬取別人的站點,給瀏覽網站造成影響

上篇講了如何爬去百度貼吧內容,今天講一講圖片保存的例子,伯樂在線有個面向對象(就是相親哦)的網頁,裏面有很多妹子的個人介紹,我們主要爬取圖片,按照編號名稱創建文件夾存儲在文件夾中。

1 分析url

伯樂在線打開詳細頁面後的網址爲http://date.jobbole.com/4767/
其中4767爲個人id,每個人的id是對應的不同頁面,好我們就把url分成2部分
baseurl = http://date.jobbole.com/
pn = 4767

2 頁面分析

方法是一樣的,還是用火狐瀏覽器F12,打開調試頁面
運維學python之爬蟲基礎篇實戰(七)爬取伯樂在線面向對象圖片

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)

最終效果:
運維學python之爬蟲基礎篇實戰(七)爬取伯樂在線面向對象圖片

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章