查看·Githubhtml
請見第一篇:Python3中級玩家:淘寶天貓商品搜索爬蟲自動化工具(第一篇mysql
說完核心函數,咱們接下來看其餘函數。git
認真看完這些函數以後,咱們就能夠開始工做了。github
def begin(): sangjin = ''' ----------------------------------------- | 歡迎使用自動抓取手機淘寶關鍵字程序 | | 時間:2015年12月23日 | | 新浪微博:一隻尼瑪 | | 微信/QQ:null | ----------------------------------------- ''' print(sangjin)
一開始是自我介紹,爲了展現主權嘛~~~~正則表達式
接下來是測試運行了多長時間,對於爬數據來講,測試時間多久是必須的。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
def createjia(path): try: os.makedirs(path) except: print('目錄已經存在:'+path)
你們知道makedir多一個s便是遞歸建立目錄,只是由於爬蟲生成的Excel和圖片,要根據今天的日期進行存儲,天然要生成新的目錄,app
這個函數直接解決找不到目錄報錯的bug!!
你們請注意,一個爬蟲程序,都是鬥智鬥勇,動歪腦筋寫出來的~~
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的區別麼,正則表達式要轉義再轉義哦~~
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)
列表掃描了所有文件後,返回一個列表,咱們要處理的就是這個列表裏面的文件。
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)
好了,接下來再講一個高級函數就能夠結束,開始第三篇了。
由於你不想讓全部人均可以自由訪問,你想受權,那麼看下面:
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: