項目內(nèi)容:
用Python寫的糗事百科的網(wǎng)絡(luò)爬蟲。
使用方法:
新建一個Bug.py文件,然后將代碼復(fù)制到里面后,雙擊運(yùn)行。
程序功能:
在命令提示行中瀏覽糗事百科。
原理解釋:
首先,先瀏覽一下糗事百科的主頁: http://www.qiushibaike.com/hot/page/1
可以看出來,鏈接中page/后面的數(shù)字就是對應(yīng)的頁碼,記住這一點為以后的編寫做準(zhǔn)備。
然后,右擊查看頁面源碼:
觀察發(fā)現(xiàn),每一個段子都用div標(biāo)記,其中class必為content,title是發(fā)帖時間,我們只需要用正則表達(dá)式將其“扣”出來就可以了。
明白了原理之后,剩下的就是正則表達(dá)式的內(nèi)容了,可以參照這篇博文:
http://blog.csdn.net/wxg694175346/article/details/8929576
運(yùn)行效果 :
# -*- coding: utf-8 -*-
#---------------------------------------
# 程序:糗百爬蟲
# 版本:0.2
# 作者:why
# 日期:2013-05-15
# 語言:Python 2.7
# 操作:輸入quit退出閱讀糗事百科
# 功能:按下回車依次瀏覽今日的糗百熱點
# 更新:解決了命令提示行下亂碼的問題
#---------------------------------------
import urllib2
import urllib
import re
import thread
import time
#----------- 處理頁面上的各種標(biāo)簽 -----------
class HTML_Tool:
# 用非 貪婪模式 匹配 \t 或者 \n 或者 空格 或者 超鏈接 或者 圖片
BgnCharToNoneRex = re.compile("(\t|\n| |<a.*?>|<img.*?>)")
# 用非 貪婪模式 匹配 任意<>標(biāo)簽
EndCharToNoneRex = re.compile("<.*?>")
# 用非 貪婪模式 匹配 任意<p>標(biāo)簽
BgnPartRex = re.compile("<p.*?>")
CharToNewLineRex = re.compile("(<br/>|</p>|<tr>|<div>|</div>)")
CharToNextTabRex = re.compile("<td>")
# 將一些html的符號實體轉(zhuǎn)變?yōu)樵挤? 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
#----------- 處理頁面上的各種標(biāo)簽 -----------
#----------- 加載處理糗事百科 -----------
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編碼轉(zhuǎn)換成其他編碼的字符串
#decode的作用是將其他編碼的字符串轉(zhuǎn)換成unicode編碼
unicodePage = myPage.decode("utf-8")
# 找出所有class="content"的div標(biāo)記
#re.S是任意匹配模式,也就是.可以匹配換行符
myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)
items = []
for item in myItems:
# item 中第一個是div的標(biāo)題,也就是時間
# item 中第二個是div的內(nèi)容,也就是內(nèi)容
items.append([item[0].replace("\n",""),item[1].replace("\n","")])
return items
# 用于加載新的段子
def LoadPage(self):
# 如果用戶未輸入quit則一直運(yùn)行
while self.enable:
# 如果pages數(shù)組中的內(nèi)容小于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數(shù)組中存有元素
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'請按下回車瀏覽今日的糗百內(nèi)容:'
raw_input(' ')
myModel = HTML_Model()
myModel.Start()
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

