鍍金池/ 教程/ Python/ 抓取淘寶 MM 照片
綜述
Cookie 的使用
爬蟲基礎(chǔ)了解
計(jì)算大學(xué)本學(xué)期績(jī)點(diǎn)
抓取淘寶 MM 照片
爬蟲框架 Scrapy 安裝配置
模擬登錄淘寶并獲取所有訂單
Urllib 庫(kù)的高級(jí)用法
URLError 異常處理
正則表達(dá)式
Beautiful Soup 的用法
爬取糗事百科段子
爬取百度貼吧帖子
Urllib 庫(kù)的基本使用

抓取淘寶 MM 照片

福利啊福利,本次為大家?guī)淼捻?xiàng)目是抓取淘寶 MM 照片并保存起來,大家有沒有很激動(dòng)呢?

本篇目標(biāo)

  1. 抓取淘寶 MM 的姓名,頭像,年齡

  2. 抓取每一個(gè)MM的資料簡(jiǎn)介以及寫真圖片

  3. 把每一個(gè)MM的寫真圖片按照文件夾保存到本地

  4. 熟悉文件保存的過程

URL 的格式

在這里我們用到的URL是 http://mm.taobao.com/json/request_top_list.htm?page=1,問號(hào)前面是基地址,后面的參數(shù)page是代表第幾頁(yè),可以隨意更換地址。點(diǎn)擊開之后,會(huì)發(fā)現(xiàn)有一些淘寶MM的簡(jiǎn)介,并附有超鏈接鏈接到個(gè)人詳情頁(yè)面。

我們需要抓取本頁(yè)面的頭像地址,MM 姓名,MM 年齡,MM 居住地,以及 MM 的個(gè)人詳情頁(yè)面地址。

抓取簡(jiǎn)要信息

相信大家經(jīng)過上幾次的實(shí)戰(zhàn),對(duì)抓取和提取頁(yè)面的地址已經(jīng)非常熟悉了,這里沒有什么難度了,我們首先抓取本頁(yè)面的MM詳情頁(yè)面地址,姓名,年齡等等的信息打印出來,直接貼代碼如下

__author__ = 'CQC'
\# -*- coding:utf-8 -*-

import urllib
import urllib2
import re

class Spider:

    def __init__(self):
        self.siteURL = 'http://mm.taobao.com/json/request_top_list.htm'

    def getPage(self,pageIndex):
        url = self.siteURL + "?page=" + str(pageIndex)
        print url
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        return response.read().decode('gbk')

    def getContents(self,pageIndex):
        page = self.getPage(pageIndex)
        pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>',re.S)
        items = re.findall(pattern,page)
        for item in items:
            print item[0],item[1],item[2],item[3],item[4]

spider = Spider()
spider.getContents(1)  

運(yùn)行結(jié)果如下

http://wiki.jikexueyuan.com/project/python-crawler-guide/images/20.png" alt="" />

文件寫入簡(jiǎn)介

在這里,我們有寫入圖片和寫入文本兩種方式

寫入圖片

\#傳入圖片地址,文件名,保存單張圖片
def saveImg(self,imageURL,fileName):
     u = urllib.urlopen(imageURL)
     data = u.read()
     f = open(fileName, 'wb')
     f.write(data)
     f.close()  

寫入文本

def saveBrief(self,content,name):
    fileName = name + "/" + name + ".txt"
    f = open(fileName,"w+")
    print u"正在偷偷保存她的個(gè)人信息為",fileName
    f.write(content.encode('utf-8'))  

創(chuàng)建新目錄

\#創(chuàng)建新目錄
def mkdir(self,path):
    path = path.strip()
    \# 判斷路徑是否存在
    \# 存在     True
    \# 不存在   False
    isExists=os.path.exists(path)
    \# 判斷結(jié)果
    if not isExists:
        \# 如果不存在則創(chuàng)建目錄
        \# 創(chuàng)建目錄操作函數(shù)
        os.makedirs(path)
        return True
    else:
        \# 如果目錄存在則不創(chuàng)建,并提示目錄已存在
        return False  

代碼完善

主要的知識(shí)點(diǎn)已經(jīng)在前面都涉及到了,如果大家前面的章節(jié)都已經(jīng)看了,完成這個(gè)爬蟲不在話下,具體的詳情在此不再贅述,直接帖代碼啦。

spider.py
__author__ = 'CQC'
\# -*- coding:utf-8 -*-

import urllib
import urllib2
import re
import tool
import os

\#抓取MM
class Spider:

    \#頁(yè)面初始化
    def __init__(self):
        self.siteURL = 'http://mm.taobao.com/json/request_top_list.htm'
        self.tool = tool.Tool()

    \#獲取索引頁(yè)面的內(nèi)容
    def getPage(self,pageIndex):
        url = self.siteURL + "?page=" + str(pageIndex)
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        return response.read().decode('gbk')

    \#獲取索引界面所有MM的信息,list格式
    def getContents(self,pageIndex):
        page = self.getPage(pageIndex)
        pattern = re.compile('<div class="list-item".*?pic-word.*?<a href="(.*?)".*?<img src="(.*?)".*?<a class="lady-name.*?>(.*?)</a>.*?<strong>(.*?)</strong>.*?<span>(.*?)</span>',re.S)
        items = re.findall(pattern,page)
        contents = []
        for item in items:
            contents.append([item[0],item[1],item[2],item[3],item[4]])
        return contents

   \#獲取MM個(gè)人詳情頁(yè)面
    def getDetailPage(self,infoURL):
        response = urllib2.urlopen(infoURL)
        return response.read().decode('gbk')

    \#獲取個(gè)人文字簡(jiǎn)介
    def getBrief(self,page):
        pattern = re.compile('<div class="mm-aixiu-content".*?>(.*?)<!--',re.S)
        result = re.search(pattern,page)
        return self.tool.replace(result.group(1))

    \#獲取頁(yè)面所有圖片
    def getAllImg(self,page):
        pattern = re.compile('<div class="mm-aixiu-content".*?>(.*?)<!--',re.S)
        \#個(gè)人信息頁(yè)面所有代碼
        content = re.search(pattern,page)
        \#從代碼中提取圖片
        patternImg = re.compile('<img.*?src="(.*?)"',re.S)
        images = re.findall(patternImg,content.group(1))
        return images

    \#保存多張寫真圖片
    def saveImgs(self,images,name):
        number = 1
        print u"發(fā)現(xiàn)",name,u"共有",len(images),u"張照片"
        for imageURL in images:
            splitPath = imageURL.split('.')
            fTail = splitPath.pop()
            if len(fTail) > 3:
                fTail = "jpg"
            fileName = name + "/" + str(number) + "." + fTail
            self.saveImg(imageURL,fileName)
            number += 1

    \# 保存頭像
    def saveIcon(self,iconURL,name):
        splitPath = iconURL.split('.')
        fTail = splitPath.pop()
        fileName = name + "/icon." + fTail
        self.saveImg(iconURL,fileName)

    \#保存?zhèn)€人簡(jiǎn)介
    def saveBrief(self,content,name):
        fileName = name + "/" + name + ".txt"
        f = open(fileName,"w+")
        print u"正在偷偷保存她的個(gè)人信息為",fileName
        f.write(content.encode('utf-8'))

    \#傳入圖片地址,文件名,保存單張圖片
    def saveImg(self,imageURL,fileName):
         u = urllib.urlopen(imageURL)
         data = u.read()
         f = open(fileName, 'wb')
         f.write(data)
         print u"正在悄悄保存她的一張圖片為",fileName
         f.close()

    \#創(chuàng)建新目錄
    def mkdir(self,path):
        path = path.strip()
        \# 判斷路徑是否存在
        \# 存在     True
        \# 不存在   False
        isExists=os.path.exists(path)
        \# 判斷結(jié)果
        if not isExists:
            \# 如果不存在則創(chuàng)建目錄
            print u"偷偷新建了名字叫做",path,u'的文件夾'
            \# 創(chuàng)建目錄操作函數(shù)
            os.makedirs(path)
            return True
        else:
            \# 如果目錄存在則不創(chuàng)建,并提示目錄已存在
            print u"名為",path,'的文件夾已經(jīng)創(chuàng)建成功'
            return False

    \#將一頁(yè)淘寶MM的信息保存起來
    def savePageInfo(self,pageIndex):
        \#獲取第一頁(yè)淘寶MM列表
        contents = self.getContents(pageIndex)
        for item in contents:
            #item[0]個(gè)人詳情URL,item[1]頭像URL,item[2]姓名,item[3]年齡,item[4]居住地
            print u"發(fā)現(xiàn)一位模特,名字叫",item[2],u"芳齡",item[3],u",她在",item[4]
            print u"正在偷偷地保存",item[2],"的信息"
            print u"又意外地發(fā)現(xiàn)她的個(gè)人地址是",item[0]
            \#個(gè)人詳情頁(yè)面的URL
            detailURL = item[0]
            \#得到個(gè)人詳情頁(yè)面代碼
            detailPage = self.getDetailPage(detailURL)
            \#獲取個(gè)人簡(jiǎn)介
            brief = self.getBrief(detailPage)
            \#獲取所有圖片列表
            images = self.getAllImg(detailPage)
            self.mkdir(item[2])
            \#保存?zhèn)€人簡(jiǎn)介
            self.saveBrief(brief,item[2])
            \#保存頭像
            self.saveIcon(item[1],item[2])
            \#保存圖片
            self.saveImgs(images,item[2])

    \#傳入起止頁(yè)碼,獲取MM圖片
    def savePagesInfo(self,start,end):
        for i in range(start,end+1):
            print u"正在偷偷尋找第",i,u"個(gè)地方,看看MM們?cè)诓辉?
            self.savePageInfo(i)

\#傳入起止頁(yè)碼即可,在此傳入了2,10,表示抓取第2到10頁(yè)的MM
spider = Spider()
spider.savePagesInfo(2,10)  
tool.py
__author__ = 'CQC'
\#-*- coding:utf-8 -*-
import re

\#處理頁(yè)面標(biāo)簽類
class Tool:
    \#去除img標(biāo)簽,1-7位空格,&nbsp;
    removeImg = re.compile('<img.*?>| {1,7}|&nbsp;')
    \#刪除超鏈接標(biāo)簽
    removeAddr = re.compile('<a.*?>|</a>')
    \#把換行的標(biāo)簽換為\n
    replaceLine = re.compile('<tr>|<div>|</div>|</p>')
    \#將表格制表<td>替換為\t
    replaceTD= re.compile('<td>')
    \#將換行符或雙換行符替換為\n
    replaceBR = re.compile('<br><br>|<br>')
    \#將其余標(biāo)簽剔除
    removeExtraTag = re.compile('<.*?>')
    \#將多行空行刪除
    removeNoneLine = re.compile('\n+')
    def replace(self,x):
        x = re.sub(self.removeImg,"",x)
        x = re.sub(self.removeAddr,"",x)
        x = re.sub(self.replaceLine,"\n",x)
        x = re.sub(self.replaceTD,"\t",x)
        x = re.sub(self.replaceBR,"\n",x)
        x = re.sub(self.removeExtraTag,"",x)
        x = re.sub(self.removeNoneLine,"\n",x)
        #strip()將前后多余內(nèi)容刪除
        return x.strip()  

以上兩個(gè)文件就是所有的代碼內(nèi)容,運(yùn)行一下試試看,那叫一個(gè)酸爽啊

http://wiki.jikexueyuan.com/project/python-crawler-guide/images21.png" alt="" />

看看文件夾里面有什么變化

http://wiki.jikexueyuan.com/project/python-crawler-guide/images/22.png" alt="" />

http://wiki.jikexueyuan.com/project/python-crawler-guide/images/23.png" alt="" />

不知不覺,海量的MM圖片已經(jīng)進(jìn)入了你的電腦,還不快快去試試看?。?/p>