Python爬蟲(前言):有趣的一個爬蟲例項(爬取段子,笑話,情感句子)
阿新 • • 發佈:2019-02-07
這次準備介紹Python爬蟲爬取網頁資料、解析並應用於實踐,打算寫幾篇文章,從最基礎的Python爬蟲語法開始介紹爬蟲,步步深入,最終實現一個較完整的例項。
這一系列文章包括:
request庫介紹及應用。
beautifulsoup庫介紹及應用。
正則表示式匹配及應用。
對話機器人例項。
tkinter庫製作介面以及Python程式打包成可執行exe檔案
本篇文章主要給出我最後做出來的一個可執行exe應用的展示,主要的目的是提高閱讀者學習的興趣。
最後做出來的聊天機器人可以根據使用者輸入的指令在指定網站爬取資訊,並在後臺解析,返回結果輸出到介面。
我將這個exe應用放在了最後,可直接在電腦執行的檔案,大家可以下載自己玩或者發給好友秀一下。
執行截圖入下:
使用者可以輸入指令,例如:“給我講個笑話”,“給我講個段子”,“在網上給我找句晚安的話”等。如下:
我用的開發工具是Spyder,在後續的文章中我會逐漸深入的講解這個例子的原理以及實現方法。
下面附上程式碼,感興趣的同學可以拷貝自己執行試一下。
from tkinter import * import time import requests from bs4 import BeautifulSoup import bs4 import random import re def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() #r.encoding = r.apparent_encoding return r.text except: print("faile") return "" def fillUnivList(ulist, html): soup = BeautifulSoup(html, "html.parser") for tr in soup.find_all('article'): if isinstance(tr, bs4.element.Tag): tds = tr('a') ulist.append([tds[0].string, tds[1].string, tds[2].string]) def printUnivList(ulist,k): return ulist[k][0] def getduanzi(): uinfo = [] k=1 u = 'http://duanziwang.com/category/%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%AE%B5%E5%AD%90/' i=random.randint(1,49) url=u+str(i)+'/' html = getHTMLText(url) fillUnivList(uinfo, html) k=random.randint(0,9) return printUnivList(uinfo,k) def fill2(ulist,html): soup = BeautifulSoup(html, "html.parser") for tr in soup.find_all('div','article block untagged mb15 typs_hot'): if isinstance(tr, bs4.element.Tag): tds = tr.find('div','content') tdss=tds('span') reg = re.compile('<[^>]*>') text=reg.sub('',str(tdss)) regg = re.compile('\\[|\\]|\\n') text=regg.sub('',text) ulist.append(text) def getjoke(): ulist=[] u='https://www.qiushibaike.com/text/page/' i=random.randint(1,13) url=u+str(i)+'/' html=getHTMLText(url) fill2(ulist,html) k=random.randint(0,16) #print(str(ulist[k])) return str(ulist[k]) def getHTMLText2(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def geturl(url,text): html=getHTMLText2(url) soup = BeautifulSoup(html, "html.parser") for tds in soup.find_all('a'): #print(tds.string) if str(tds.string) in text: #print(tds.attrs['href']) return tds.attrs['href'] return '' def getmoreurl(url): html=getHTMLText2(url) soup = BeautifulSoup(html, "html.parser") try: li=soup.find_all('li',attrs={'class':'articleTitle fl'}) k=random.randint(0,len(li)-1) return li[k]('a')[0].attrs['href'] except: return '' def getsen(url): html=getHTMLText2(url) soup = BeautifulSoup(html, "html.parser") try: li=soup.find('p') reg = re.compile('<p>.*') l=reg.findall(str(li)) #print(l) k=random.randint(0,len(l)-1) text=re.findall('[\u4e00-\u9fa5]+',l[k]) x='' if len(text): for t in text[:-2]: x=x+t+',' return x+text[-1]+'。' else: return "不好意思,出了點小問題,請重試!" except: return "抱歉,沒找到你想要的" def getsentance(text): start_url = 'http://www.siandian.com' urll='http://www.siandian.com/tags.html' end1=geturl(urll,text) if end1=='': return "抱歉,沒有找到你想要的。" else: end2=getmoreurl(start_url+end1) if end2=='': return "抱歉,沒有找到你想要的。" else: #print(start_url+end2) return getsen(start_url+end2) def xiaotang(s): sign=1; while(sign): if '段子' in s: while('段子' in s or '繼續' in s or '再來' in s or s==''): return getduanzi() elif '笑話' in s: while('笑話' in s or '繼續' in s or '再來' in s or s==''): return getjoke() elif '句' in s or '話' in s: return getsentance(s) elif '傻子' in s or '草' in s or '日' in s: return '這是髒話不可以說哦' elif '二' in s or '垃圾' in s or '傻逼' in s: t='你是魔鬼嗎?' x='' for i in range(10): x=x+t+' !'+'\n' return x else: return "我好像不明白\n" def main(): def start(): strMsg = '小糖:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '\n ' txtget.insert(END, strMsg, 'redcolor') txtget.insert(END, '你好,請問有什麼可以幫忙的?') def sendMsg():#傳送訊息 t=txtMsg.get('0.0', END) txtMsg.delete('0.0', END) strMsg = '我:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '\n ' for i in range(int(txtget.index(END).split(".")[0])-int(txtMsgList.index(END).split(".")[0])+1): txtMsgList.insert(END, '\n') txtMsgList.insert(END, strMsg, 'greencolor') txtMsgList.insert(END, t) txtMsgList.see(END) for i in range(int(txtMsgList.index(END).split(".")[0])-int(txtget.index(END).split(".")[0])+1): txtget.insert(END, '\n') txtget.see(END) strMsg = '小糖:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '\n ' for i in range(int(txtMsgList.index(END).split(".")[0])-int(txtget.index(END).split(".")[0])+1): txtget.insert(END, '\n') txtget.insert(END, strMsg, 'redcolor') txtget.insert(END, xiaotang(t)) txtget.see(END) for i in range(int(txtget.index(END).split(".")[0])-int(txtMsgList.index(END).split(".")[0])+1): txtMsgList.insert(END, '\n') txtMsgList.see(END) def cancelMsg():#取消訊息 txtMsg.delete('0.0', END) def sendMsgEvent(event): #傳送訊息事件 sendMsg() #建立視窗 t = Tk() t.title('小糖助手') #建立frame容器 frmLT = Frame(width=500, height=320, bg='#F19C8B') frmLC = Frame(width=500, height=150, bg='#F19C8B') frmLB = Frame(width=500, height=30,bg='white') frmRT = Frame(width=200, height=500,bg='#F19C8B') #建立控制元件 txtMsgList = Text(frmLT,width=40,bd=0) txtMsgList.tag_config('greencolor', foreground='#008C00')#建立tag txtMsg = Text(frmLC) txtget = Text(frmLT,width=40,bd=0) txtget.tag_config('redcolor', foreground='#DC143C')#建立tag start() #txtMsg.bind("", sendMsgEvent) txtMsg.bind('<Return>',sendMsgEvent) btnSend = Button(frmLB, text='發 送', width = 8, command=sendMsg,bg='#E88384',bd=0) btnCancel = Button(frmLB, text='取消', width = 8, command=cancelMsg,bg='#F3ADA0',bd=0) scollor=Scrollbar(bg='white') scollor.config(command=txtget.yview) scollor.config(command=txtMsgList.yview) txtget.config(yscrollcommand=scollor.set) txtMsgList.config(yscrollcommand=scollor.set) imgInfo = PhotoImage(file = "aa.png") lblImage = Label(frmRT, image = imgInfo) lblImage.image = imgInfo #窗口布局 frmLT.grid(row=0, column=0, columnspan=2, padx=0, pady=0) frmLC.grid(row=1, column=0, columnspan=2, padx=0, pady=0) frmLB.grid(row=2, column=0, columnspan=2,padx=0) scollor.grid(row=0,column=2,sticky=N+S) frmRT.grid(row=0, column=3, rowspan=3, padx=0, pady=0) #固定大小 frmLT.grid_propagate(0) frmLC.grid_propagate(0) frmLB.grid_propagate(0) frmRT.grid_propagate(0) btnSend.grid(row=2, column=0) btnCancel.grid(row=2, column=1) lblImage.grid() txtget.grid(row=0,column=0) txtMsgList.grid(row=0,column=1) txtMsg.grid() #主事件迴圈 t.mainloop() if __name__ == '__main__': main()
以及可直接執行的exe檔案:
喜歡的朋友可以點個贊鼓勵鼓勵呀~
感興趣或者想要學習Python的朋友們可以點關注或收藏,後面會更新具體介紹及實現過程
謝謝大家~