Python爬去貼吧圖片

韓大帥666發表於2018-01-09
# tieba_xpath.py
#coding=utf-8

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import urllib
import urllib2
from lxml import etree

class Spider:
    def __init__(self):
        self.tiebaName = raw_input("請需要訪問的貼吧:")
        self.beginPage = int(raw_input("請輸入起始頁:"))
        self.endPage = int(raw_input("請輸入終止頁:"))

        self.url = 'http://tieba.baidu.com/f'
        self.ua_header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;"}

        # 圖片編號
        self.userName = 1

    def tiebaSpider(self):
        for page in range(self.beginPage, self.endPage + 1):
            pn = (page - 1) * 50 # page number
            word = {'pn': pn, 'kw': self.tiebaName}

            word = urllib.urlencode(word) #轉換成url編碼格式(字串)
            myUrl = self.url + "?" + word

            # 示例:http://tieba.baidu.com/f? kw=%E7%BE%8E%E5%A5%B3 & pn=50
            # 呼叫 頁面處理函式 load_Page
            # 並且獲取頁面所有帖子連結,
            links = self.loadPage(myUrl)  # urllib2_test3.py

    # 讀取頁面內容
    def loadPage(self, url):
        req = urllib2.Request(url, headers = self.ua_header)
        html = urllib2.urlopen(req).read()

        # 解析html 為 HTML 文件
        selector=etree.HTML(html)

        #抓取當前頁面的所有帖子的url的後半部分,也就是帖子編號
        # http://tieba.baidu.com/p/4884069807裡的 “p/4884069807”
        links = selector.xpath('//div[@class="threadlist_lz clearfix"]/div/a/@href')

        # 驗證儲存的資料夾是否存在
        self.mkdir('C:/Users/Administrator/PycharmProjects/python/images/')
        # links 型別為 etreeElementString 列表
        # 遍歷列表,並且合併成一個帖子地址,呼叫 圖片處理函式 loadImage
        for link in links:
            link = "http://tieba.baidu.com" + link
            self.loadImages(link)

    # 獲取圖片
    def loadImages(self, link):
        req = urllib2.Request(link, headers = self.ua_header)
        html = urllib2.urlopen(req).read()

        selector = etree.HTML(html)

        # 獲取這個帖子裡所有圖片的src路徑
        imagesLinks = selector.xpath('//img[@class="BDE_Image"]/@src')

        # 依次取出圖片路徑,下載儲存
        for imagesLink in imagesLinks:
            self.writeImages(imagesLink)

    # 儲存頁面內容
    def writeImages(self, imagesLink):
        '''
            將 images 裡的二進位制內容存入到 userNname 檔案中
        '''

        print imagesLink
        print "正在儲存檔案 %d ..." % self.userName
        # 1. 開啟檔案,返回一個檔案物件
        file = open('C:/Users/Administrator/PycharmProjects/python/images/' + str(self.userName)  + '.png', 'wb')

        # 2. 獲取圖片裡的內容
        images = urllib2.urlopen(imagesLink).read()

        # 3. 呼叫檔案物件write() 方法,將page_html的內容寫入到檔案裡
        file.write(images)

        # 4. 最後關閉檔案
        file.close()

        # 計數器自增1
        self.userName += 1

    def mkdir(self,path):
        # 去除首位空格
        path = path.strip()
        # 去除尾部 \ 符號
        path = path.rstrip("/")

        # 判斷路徑是否存在
        # 存在     True
        # 不存在   False
        isExists = os.path.exists(path)

        # 判斷結果
        if not isExists:
            # 如果不存在則建立目錄
             # 建立目錄操作函式
            os.makedirs(path)

            print path + ' 建立成功'
            return True
        else:
            # 如果目錄存在則不建立,並提示目錄已存在
            print path + ' 目錄已存在'
            return False


# 模擬 main 函式
if __name__ == "__main__":

    # 首先建立爬蟲物件
    mySpider = Spider()
    # 呼叫爬蟲物件的方法,開始工作
    mySpider.tiebaSpider()

相關文章