項目內容:
用Python寫的糗事百科的網絡爬蟲。
使用方法:
新建一個Bug.py文件,然后將代碼復制到里面后,雙擊運行。
程序功能:
在命令提示行中瀏覽糗事百科。
原理解釋:
首先,先瀏覽一下糗事百科的主頁: http://www.qiushibaike.com/hot/page/1
可以看出來,鏈接中page/后面的數字就是對應的頁碼,記住這一點為以后的編寫做準備。
然后,右擊查看頁面源碼:
觀察發現,每一個段子都用div標記,其中class必為content,title是發帖時間,我們只需要用正則表達式將其“扣”出來就可以了。
明白了原理之后,剩下的就是正則表達式的內容了,可以參照這篇博文:
http://blog.csdn.net/wxg694175346/article/details/8929576
運行效果 :
# -*- coding: utf-8 -*- #--------------------------------------- # 程序:糗百爬蟲 # 版本:0.2 # 作者:why # 日期:2013-05-15 # 語言:Python 2.7 # 操作:輸入quit退出閱讀糗事百科 # 功能:按下回車依次瀏覽今日的糗百熱點 # 更新:解決了命令提示行下亂碼的問題 #--------------------------------------- import urllib2 import urllib import re import thread import time #----------- 處理頁面上的各種標簽 ----------- class HTML_Tool: # 用非 貪婪模式 匹配 \t 或者 \n 或者 空格 或者 超鏈接 或者 圖片 BgnCharToNoneRex = re.compile("(\t|\n| |<a.*?>|<img.*?>)") # 用非 貪婪模式 匹配 任意<>標簽 EndCharToNoneRex = re.compile("<.*?>") # 用非 貪婪模式 匹配 任意<p>標簽 BgnPartRex = re.compile("<p.*?>") CharToNewLineRex = re.compile("(<br/>|</p>|<tr>|<div>|</div>)") CharToNextTabRex = re.compile("<td>") # 將一些html的符號實體轉變為原始符號 replaceTab = [("<","<"),(">",">"),("&","&"),("&","\""),(""," ")] def Replace_Char(self,x): x = self.BgnCharToNoneRex.sub("",x) x = self.BgnPartRex.sub("\n ",x) x = self.CharToNewLineRex.sub("\n",x) x = self.CharToNextTabRex.sub("\t",x) x = self.EndCharToNoneRex.sub("",x) for t in self.replaceTab: x = x.replace(t[0],t[1]) return x #----------- 處理頁面上的各種標簽 ----------- #----------- 加載處理糗事百科 ----------- class HTML_Model: def __init__(self): self.page = 1 self.pages = [] self.myTool = HTML_Tool() self.enable = False # 將所有的段子都扣出來,添加到列表中并且返回列表 def GetPage(self,page): myUrl = "http://m.qiushibaike.com/hot/page/" + page myResponse = urllib2.urlopen(myUrl) myPage = myResponse.read() #encode的作用是將unicode編碼轉換成其他編碼的字符串 #decode的作用是將其他編碼的字符串轉換成unicode編碼 unicodePage = myPage.decode("utf-8") # 找出所有class="content"的div標記 #re.S是任意匹配模式,也就是.可以匹配換行符 myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S) items = [] for item in myItems: # item 中第一個是div的標題,也就是時間 # item 中第二個是div的內容,也就是內容 items.append([item[0].replace("\n",""),item[1].replace("\n","")]) return items # 用于加載新的段子 def LoadPage(self): # 如果用戶未輸入quit則一直運行 while self.enable: # 如果pages數組中的內容小于2個 if len(self.pages) < 2: try: # 獲取新的頁面中的段子們 myPage = self.GetPage(str(self.page)) self.page += 1 self.pages.append(myPage) except: print '無法鏈接糗事百科!' else: time.sleep(1) def ShowPage(self,q,page): for items in q: print u'第%d頁' % page , items[0] print self.myTool.Replace_Char(items[1]) myInput = raw_input() if myInput == "quit": self.enable = False break def Start(self): self.enable = True page = self.page print u'正在加載中請稍候......' # 新建一個線程在后臺加載段子并存儲 thread.start_new_thread(self.LoadPage,()) #----------- 加載處理糗事百科 ----------- while self.enable: # 如果self的page數組中存有元素 if self.pages: nowPage = self.pages[0] del self.pages[0] self.ShowPage(nowPage,page) page += 1 #----------- 程序的入口處 ----------- print u""" --------------------------------------- 程序:糗百爬蟲 版本:0.1 作者:why 日期:2013-05-15 語言:Python 2.7 操作:輸入quit退出閱讀糗事百科 功能:按下回車依次瀏覽今日的糗百熱點 --------------------------------------- """ print u'請按下回車瀏覽今日的糗百內容:' raw_input(' ') myModel = HTML_Model() myModel.Start()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
