生活随笔
收集整理的這篇文章主要介紹了
糗事百科的网络爬虫(v0.2)源码及解析 .
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目內容:
用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 = 1self.pages = []self.myTool = HTML_Tool()self.enable = False# 將所有的段子都扣出來,添加到列表中并且返回列表def GetPage(self,page):myUrl = "http://m.qiushibaike.com/hot/page/" + pagemyResponse = 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 += 1self.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 = Falsebreakdef Start(self):self.enable = Truepage = self.pageprint 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()
總結
以上是生活随笔為你收集整理的糗事百科的网络爬虫(v0.2)源码及解析 .的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。