文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html
做者:番茄哈哈正則表達式
PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取網絡
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cefapp
此次準備介紹Python爬蟲爬取網頁數據、解析並應用於實踐,打算寫幾篇文章,從最基礎的Python爬蟲語法開始介紹爬蟲,步步深刻,最終實現一個較完整的實例。dom
這一系列文章包括:工具
request庫介紹及應用oop
beautifulsoup庫介紹及應用佈局
正則表達式匹配及應用學習
對話機器人實例開發工具
tkinter庫製做界面以及Python程序打包成可執行exe文件
本篇文章主要給出我最後作出來的一個可運行exe應用的展現,主要的目的是提升閱讀者學習的興趣。
最後作出來的聊天機器人能夠根據用戶輸入的指令在指定網站爬取信息,並在後臺解析,返回結果輸出到界面。
我將這個exe應用放在了最後,可直接在電腦運行的文件,你們能夠下載本身玩或者發給好友秀一下。
運行截圖入下:
用戶能夠輸入指令,例如:「給我講個笑話」,「給我講個段子」,「在網上給我找句晚安的話」等。以下:
我用的開發工具是Spyder,在後續的文章中我會逐漸深刻的講解這個例子的原理以及實現方法。
下面附上代碼,感興趣的同窗能夠拷貝本身運行試一下。
1 from tkinter import * 2 import time 3 import requests 4 from bs4 import BeautifulSoup 5 import bs4 6 import random 7 import re 8 def getHTMLText(url): 9 try: 10 r = requests.get(url, timeout=30) 11 r.raise_for_status() 12 #r.encoding = r.apparent_encoding 13 return r.text 14 except: 15 print("faile") 16 return "" 17 18 def fillUnivList(ulist, html): 19 soup = BeautifulSoup(html, "html.parser") 20 for tr in soup.find_all('article'): 21 if isinstance(tr, bs4.element.Tag): 22 tds = tr('a') 23 ulist.append([tds[0].string, tds[1].string, tds[2].string]) 24 def printUnivList(ulist,k): 25 return ulist[k][0] 26 27 def getduanzi(): 28 uinfo = [] 29 k=1 30 u = 'http://duanziwang.com/category/%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%AE%B5%E5%AD%90/' 31 i=random.randint(1,49) 32 url=u+str(i)+'/' 33 html = getHTMLText(url) 34 fillUnivList(uinfo, html) 35 k=random.randint(0,9) 36 return printUnivList(uinfo,k) 37 def fill2(ulist,html): 38 soup = BeautifulSoup(html, "html.parser") 39 for tr in soup.find_all('div','article block untagged mb15 typs_hot'): 40 if isinstance(tr, bs4.element.Tag): 41 tds = tr.find('div','content') 42 tdss=tds('span') 43 reg = re.compile('<[^>]*>') 44 text=reg.sub('',str(tdss)) 45 regg = re.compile('\\[|\\]|\\n') 46 text=regg.sub('',text) 47 ulist.append(text) 48 def getjoke(): 49 ulist=[] 50 u='https://www.qiushibaike.com/text/page/' 51 i=random.randint(1,13) 52 url=u+str(i)+'/' 53 html=getHTMLText(url) 54 fill2(ulist,html) 55 k=random.randint(0,16) 56 #print(str(ulist[k])) 57 return str(ulist[k]) 58 def getHTMLText2(url): 59 try: 60 r = requests.get(url, timeout=30) 61 r.raise_for_status() 62 r.encoding = r.apparent_encoding 63 return r.text 64 except: 65 return "" 66 def geturl(url,text): 67 html=getHTMLText2(url) 68 soup = BeautifulSoup(html, "html.parser") 69 for tds in soup.find_all('a'): 70 #print(tds.string) 71 if str(tds.string) in text: 72 #print(tds.attrs['href']) 73 return tds.attrs['href'] 74 return '' 75 def getmoreurl(url): 76 html=getHTMLText2(url) 77 soup = BeautifulSoup(html, "html.parser") 78 try: 79 li=soup.find_all('li',attrs={'class':'articleTitle fl'}) 80 k=random.randint(0,len(li)-1) 81 return li[k]('a')[0].attrs['href'] 82 except: 83 return '' 84 def getsen(url): 85 html=getHTMLText2(url) 86 soup = BeautifulSoup(html, "html.parser") 87 try: 88 li=soup.find('p') 89 reg = re.compile('<p>.*') 90 l=reg.findall(str(li)) 91 #print(l) 92 k=random.randint(0,len(l)-1) 93 text=re.findall('[\u4e00-\u9fa5]+',l[k]) 94 x='' 95 if len(text): 96 for t in text[:-2]: 97 x=x+t+',' 98 return x+text[-1]+'。' 99 else: 100 return "很差意思,出了點小問題,請重試!" 101 except: 102 return "抱歉,沒找到你想要的" 103 def getsentance(text): 104 start_url = 'http://www.siandian.com' 105 urll='http://www.siandian.com/tags.html' 106 end1=geturl(urll,text) 107 if end1=='': 108 return "抱歉,沒有找到你想要的。" 109 else: 110 end2=getmoreurl(start_url+end1) 111 if end2=='': 112 return "抱歉,沒有找到你想要的。" 113 else: 114 #print(start_url+end2) 115 return getsen(start_url+end2) 116 def xiaotang(s): 117 sign=1; 118 while(sign): 119 if '段子' in s: 120 while('段子' in s or '繼續' in s or '再來' in s or s==''): 121 return getduanzi() 122 elif '笑話' in s: 123 while('笑話' in s or '繼續' in s or '再來' in s or s==''): 124 return getjoke() 125 elif '句' in s or '話' in s: 126 return getsentance(s) 127 elif '傻子' in s or '草' in s or '日' in s: 128 return '這是髒話不能夠說哦' 129 elif '二' in s or '垃圾' in s or '傻逼' in s: 130 t='你是魔鬼嗎?' 131 x='' 132 for i in range(10): 133 x=x+t+' !'+'\n' 134 return x 135 else: 136 return "我好像不明白\n" 137 def main(): 138 def start(): 139 strMsg = '小糖:' + time.strftime("%Y-%m-%d %H:%M:%S", 140 time.localtime()) + '\n ' 141 txtget.insert(END, strMsg, 'redcolor') 142 txtget.insert(END, '你好,請問有什麼能夠幫忙的?') 143 def sendMsg():#發送消息 144 t=txtMsg.get('0.0', END) 145 txtMsg.delete('0.0', END) 146 strMsg = '我:' + time.strftime("%Y-%m-%d %H:%M:%S", 147 time.localtime()) + '\n ' 148 for i in range(int(txtget.index(END).split(".")[0])-int(txtMsgList.index(END).split(".")[0])+1): 149 txtMsgList.insert(END, '\n') 150 txtMsgList.insert(END, strMsg, 'greencolor') 151 txtMsgList.insert(END, t) 152 txtMsgList.see(END) 153 for i in range(int(txtMsgList.index(END).split(".")[0])-int(txtget.index(END).split(".")[0])+1): 154 txtget.insert(END, '\n') 155 txtget.see(END) 156 157 158 159 strMsg = '小糖:' + time.strftime("%Y-%m-%d %H:%M:%S", 160 time.localtime()) + '\n ' 161 for i in range(int(txtMsgList.index(END).split(".")[0])-int(txtget.index(END).split(".")[0])+1): 162 txtget.insert(END, '\n') 163 txtget.insert(END, strMsg, 'redcolor') 164 txtget.insert(END, xiaotang(t)) 165 txtget.see(END) 166 for i in range(int(txtget.index(END).split(".")[0])-int(txtMsgList.index(END).split(".")[0])+1): 167 txtMsgList.insert(END, '\n') 168 txtMsgList.see(END) 169 170 171 def cancelMsg():#取消消息 172 txtMsg.delete('0.0', END) 173 174 def sendMsgEvent(event): #發送消息事件 175 sendMsg() 176 177 #建立窗口 178 t = Tk() 179 t.title('小糖助手') 180 181 #建立frame容器 182 frmLT = Frame(width=500, height=320, bg='#F19C8B') 183 frmLC = Frame(width=500, height=150, bg='#F19C8B') 184 frmLB = Frame(width=500, height=30,bg='white') 185 frmRT = Frame(width=200, height=500,bg='#F19C8B') 186 187 #建立控件 188 txtMsgList = Text(frmLT,width=40,bd=0) 189 txtMsgList.tag_config('greencolor', foreground='#008C00')#建立tag 190 txtMsg = Text(frmLC) 191 txtget = Text(frmLT,width=40,bd=0) 192 txtget.tag_config('redcolor', foreground='#DC143C')#建立tag 193 start() 194 #txtMsg.bind("", sendMsgEvent) 195 txtMsg.bind('<Return>',sendMsgEvent) 196 btnSend = Button(frmLB, text='發 送', width = 8, command=sendMsg,bg='#E88384',bd=0) 197 btnCancel = Button(frmLB, text='取消', width = 8, command=cancelMsg,bg='#F3ADA0',bd=0) 198 scollor=Scrollbar(bg='white') 199 scollor.config(command=txtget.yview) 200 scollor.config(command=txtMsgList.yview) 201 txtget.config(yscrollcommand=scollor.set) 202 txtMsgList.config(yscrollcommand=scollor.set) 203 imgInfo = PhotoImage(file = "aa.png") 204 lblImage = Label(frmRT, image = imgInfo) 205 lblImage.image = imgInfo 206 207 #窗口布局 208 frmLT.grid(row=0, column=0, columnspan=2, padx=0, pady=0) 209 frmLC.grid(row=1, column=0, columnspan=2, padx=0, pady=0) 210 frmLB.grid(row=2, column=0, columnspan=2,padx=0) 211 scollor.grid(row=0,column=2,sticky=N+S) 212 frmRT.grid(row=0, column=3, rowspan=3, padx=0, pady=0) 213 #固定大小 214 frmLT.grid_propagate(0) 215 frmLC.grid_propagate(0) 216 frmLB.grid_propagate(0) 217 frmRT.grid_propagate(0) 218 219 btnSend.grid(row=2, column=0) 220 btnCancel.grid(row=2, column=1) 221 lblImage.grid() 222 txtget.grid(row=0,column=0) 223 224 txtMsgList.grid(row=0,column=1) 225 226 txtMsg.grid() 227 228 #主事件循環 229 t.mainloop() 230 231 if __name__ == '__main__': 232 main()