Python3中級玩家:淘寶天貓商品搜索爬蟲自動化工具(第二篇)

查看·Githubhtml

請見第一篇:Python3中級玩家:淘寶天貓商品搜索爬蟲自動化工具(第一篇mysql

說完核心函數,咱們接下來看其餘函數。git

認真看完這些函數以後,咱們就能夠開始工做了。github

1、開始的介紹函數

def begin():
    sangjin = '''
        -----------------------------------------
        | 歡迎使用自動抓取手機淘寶關鍵字程序       |
        | 時間:2015年12月23日                  |
        | 新浪微博:一隻尼瑪                    |
        | 微信/QQ:null                    |
        -----------------------------------------
    '''
    print(sangjin)

一開始是自我介紹,爲了展現主權嘛~~~~正則表達式

2、符合中國人思惟的運行時間函數

接下來是測試運行了多長時間,對於爬數據來講,測試時間多久是必須的。sql

def timetochina(longtime,formats='{}天{}小時{}分鐘{}秒'):
    day=0
    hour=0
    minutue=0
    second=0
    try:
        if longtime>60:
            second=longtime%60
            minutue=longtime//60
        else:
            second=longtime
        if minutue>60:
            hour=minutue//60
            minutue=minutue%60
        if hour>24:
            day=hour//24
            hour=hour%24
        return formats.format(day,hour,minutue,second)
    except:
        raise Exception('時間非法')

咱們傳入了一個longtime是一個時間長度,默認是秒,如10000秒,若是小於60秒,那麼不用轉成分鐘。不然先%,取餘數則是秒數,//整除則是分鐘。數據庫

分鐘一樣若是小於60,那麼不用轉化爲小時,以此類推。。。微信

return formats.format(day,hour,minutue,second)

咱們傳入了一個formats的字符串,進行字符串格式化便可獲得符合中國人的時間!!cookie

3、遞歸建立目錄函數

遞歸建立文件夾

def createjia(path):
    try:
        os.makedirs(path)
    except:
        print('目錄已經存在:'+path)

你們知道makedir多一個s便是遞歸建立目錄,只是由於爬蟲生成的Excel和圖片,要根據今天的日期進行存儲,天然要生成新的目錄,app

這個函數直接解決找不到目錄報錯的bug!!

你們請注意,一個爬蟲程序,都是鬥智鬥勇,動歪腦筋寫出來的~~

4、去掉非法字符函數

去除標題中的非法字符 (Windows)

def validateTitle(title):
    rstr = r"[\/\\\:\*\?\"\<\>\|]"  # '/\:*?"<>|'
    new_title = re.sub(rstr, "", title)
    return new_title

保存的圖片須要命名,直接根據店鋪名和商品名直接拼接就是不錯,可是保存文件的時候,你是否會莫名出錯。

沒錯,就是由於Window文件命名不容許什麼/ : * ?這些字符,咱們直接用正則表達式re.sub給替換掉,傳入title,而後根據rstr中的字符替換爲空字符。

rstr = r"[\/\\\:\*\?\"\<\>\|]"

正則表達式[]表示裏面任意一個字符,字符串外面的r表示裏面數據要是原始的,這樣出來才符合正則表達式的規則。

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
>>> rstr = r"[\/\\\:\*\?\"\<\>\|]"
>>> print(rstr)
[\/\\\:\*\?\"\<\>\|]
>>> rstr = "[\/\\\:\*\?\"\<\>\|]"
>>> print(rstr)
[\/\\:\*\?"\<\>\|]

注意到加r和不加r的區別麼,正則表達式要轉義再轉義哦~~

5、找出某文件夾下指定後綴的所有文件函數(不遞歸)

找出文件夾下全部html後綴的文件

def listfiles(rootdir, prefix='.xml'):
    file = []
    for parent, dirnames, filenames in os.walk(rootdir):
        if parent == rootdir:
            for filename in filenames:
                if filename.endswith(prefix):
                    file.append(rootdir + '/' + filename)
            return file
        else:
            pass

以上函數難點在於os.walk(rootdir),深層遍歷遞歸文件夾,但是我只須要某目錄下的文件就能夠了,不須要目錄下目錄的文件。

那好來說解,將下面源碼放在test.py中

import os
for parent, dirnames, filenames in os.walk('./'):
    print(parent,dirnames,filenames,'\n');

運行上述語句,遍歷本文件夾夾,可得:

./ ['sss'] ['cookie.txt', 'help.py', 'mtaobao.py', 'setup.py', 'test.py'] 

./sss [] ['help.py']

固然目錄結構以下

圖片描述

原來parent就是遍歷到的文件夾,dirnames就是遍歷到的文件夾下面的文件夾,filenames就是遍歷到的文件夾下面的文件,瞬間懂了!繼續看原來的代碼:

if parent == rootdir:
            for filename in filenames:
                if filename.endswith(prefix):
                    file.append(rootdir + '/' + filename)
            return file
else:
            pass

若是遍歷到的文件夾就是咱們要找的那個文件夾,那麼就開始solo該文件夾下的文件,若是endswith指定後綴,那麼把它加入列表file。

file.append(rootdir + '/' + filename)

列表掃描了所有文件後,返回一個列表,咱們要處理的就是這個列表裏面的文件。

6、寫入Excel文件函數

def writeexcel(path,dealcontent):
    workbook = wx.Workbook(path)
    top = workbook.add_format({'border':1,'align':'center','bg_color':'white','font_size':11,'font_name': '微軟雅黑'})
    red = workbook.add_format({'font_color':'white','border':1,'align':'center','bg_color':'800000','font_size':11,'font_name': '微軟雅黑','bold':True})
    image = workbook.add_format({'border':1,'align':'center','bg_color':'white','font_size':11,'font_name': '微軟雅黑'})
    formatt=top
    formatt.set_align('vcenter') #設置單元格垂直對齊
    worksheet = workbook.add_worksheet()        #建立一個工做表對象
    width=len(dealcontent[0])
    worksheet.set_column(0,width,38.5)            #設定列的寬度爲22像素
    for i in range(0,len(dealcontent)):
        if i==0:
            formatt=red
        else:
            formatt=top
        for j in range(0,len(dealcontent[i])):
            if i!=0 and j==len(dealcontent[i])-1:
                if dealcontent[i][j]=='':
                    worksheet.write(i,j,' ',formatt)
                else:
                    try:
                        worksheet.insert_image(i,j,dealcontent[i][j])
                    except:
                        worksheet.write(i,j,' ',formatt)
            else:
                if dealcontent[i][j]:
                    worksheet.write(i,j,dealcontent[i][j].replace(' ',''),formatt)
                else:
                    worksheet.write(i,j,'無',formatt)
    workbook.close()

咱們一行行來說解,其中有的語句可能沒用到哦,這個庫也要本身安裝,參見上篇:

def writeexcel(path,dealcontent):

將內容delcontent保存名爲path的文件,path是路徑的意思哦

workbook = wx.Workbook(path)

初始化對象,該EXCEL的保存路徑爲path。

top = workbook.add_format({'border':1,'align':'center','bg_color':'white','font_size':11,'font_name': '微軟雅黑'})
red = workbook.add_format({'font_color':'white','border':1,'align':'center','bg_color':'800000','font_size':11,'font_name': '微軟雅黑','bold':True})
image = workbook.add_format({'border':1,'align':'center','bg_color':'white','font_size':11,'font_name': '微軟雅黑'})
formatt=top
formatt.set_align('vcenter') #設置單元格垂直對齊

格式化處理,這些變量top,red任意取名哈,僅僅格式化爲Excel的樣式。

worksheet = workbook.add_worksheet()        #建立一個工做表對象

加一個表,Excel是有不少表的。

width=len(dealcontent[0])
worksheet.set_column(0,width,38.5)            #設定列的寬度爲22像素

判斷要寫入多少列,每列寬度22像素.

下面邏輯十分曲折,請人腦跑一遍:

for i in range(0,len(dealcontent)):
    if i==0:
        formatt=red
    else:
        formatt=top
    for j in range(0,len(dealcontent[i])):
        if i!=0 and j==len(dealcontent[i])-1:
            if dealcontent[i][j]=='':
                worksheet.write(i,j,' ',formatt)
            else:
                try:
                    worksheet.insert_image(i,j,dealcontent[i][j])
                except:
                    worksheet.write(i,j,' ',formatt)
        else:
            if dealcontent[i][j]:
                worksheet.write(i,j,dealcontent[i][j].replace(' ',''),formatt)
            else:
                worksheet.write(i,j,'無',formatt)

主要是如下語句重要,寫入字符串到一格還有插入一圖到一格:

try:
                    worksheet.insert_image(i,j,dealcontent[i][j])
                except:
                    worksheet.write(i,j,' ',formatt)

好了,接下來再講一個高級函數就能夠結束,開始第三篇了。

7、驗證函數

由於你不想讓全部人均可以自由訪問,你想受權,那麼看下面:

def password():
    print('請輸入你的帳號和密碼')
    user=input('帳號:')
    pwd=input('密碼:')
    if user=='jinhan' and pwd=='6833066':
        print('歡迎你:'+user)
        return
    try:
        mysql = pymysql.connect(host="192.168.1.177", user="dataman", passwd="123456",db='qingmu', charset="utf8")
        cur = mysql.cursor()
        isuser="SELECT * FROM mtaobao where user='{0}' and pwd='{1}'".format(user,pwd)
        cur.execute(isuser)
        mysql.commit()
        if cur.fetchall():
            print('歡迎你:'+user)
            localIP = socket.gethostbyname(socket.gethostname())#這個獲得本地ip
            ipList = socket.gethostbyname_ex(socket.gethostname())
            s=''
            for i in ipList:
                if i != localIP and i!=[]:
                    s=s+(str)(i)
            timesss=time.strftime('%Y%m%d-%H%M%S', time.localtime())
            update="UPDATE mtaobao SET `times` = `times`+1,`dates`='{0}',`ip` ='{1}' where user='{2}'".format(timesss,s.replace("'",''),user)
            #print(update)
            cur.execute(update)
            mysql.commit()
            cur.close()
            mysql.close()
            return
        else:
            raise
    except Exception as e:
        #print(e)
        mysql.rollback()
        cur.close()
        mysql.close()
        print('密碼錯誤')
        password()

先埋後門,若是是後門,那麼不查數據庫,返回。

print('請輸入你的帳號和密碼')
user=input('帳號:')
pwd=input('密碼:')
if user=='jinhan' and pwd=='6833066':
    print('歡迎你:'+user)
    return

不然,鏈接數據庫,查找用戶和密碼是否匹配到。

mysql = pymysql.connect(host="192.168.1.177", user="dataman", passwd="123456",db='qingmu', charset="utf8")
    cur = mysql.cursor()
    isuser="SELECT * FROM mtaobao where user='{0}' and pwd='{1}'".format(user,pwd)
    cur.execute(isuser)
    mysql.commit()

若是匹配到

if cur.fetchall():
        print('歡迎你:'+user)
        localIP = socket.gethostbyname(socket.gethostname())#這個獲得本地ip
        ipList = socket.gethostbyname_ex(socket.gethostname())
        s=''
        for i in ipList:
            if i != localIP and i!=[]:
                s=s+(str)(i)
        timesss=time.strftime('%Y%m%d-%H%M%S', time.localtime())
        update="UPDATE mtaobao SET `times` = `times`+1,`dates`='{0}',`ip` ='{1}' where user='{2}'".format(timesss,s.replace("'",''),user)

獲得IP,獲得時間,更新數據庫,爲了方便得知哪一個人哪一個時間使用了這個工具。

固然數據庫要關閉什麼的,若是密碼出錯,那麼異常後還使用了遞歸,看到password吧,錯誤,重來!!

except Exception as e:
    #print(e)
    mysql.rollback()
    cur.close()
    mysql.close()
    print('密碼錯誤')
    password()

歡迎看了這麼多函數。

下一篇將把全部函數鏈接在一塊兒,進行咱們爬蟲工具的組裝!!上面只是作預熱準備~

持續第三篇:Python3中級玩家:淘寶天貓商品搜索爬蟲自動化工具(第三篇)

等不及就上github:

git clone https://github.com/hunterhug/taobaoscrapy.git

相關文章
相關標籤/搜索