練習爬取糗事百科段子,直接上代碼洛,有注釋哦。。。
__author__="a958832776"
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import thread
import time
class qiushibaikeclass:
#初始化方法,定義一些變量
def __init__(self):
self.pageIndex=
self.user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
#初始化headers
self.headers= { 'User-Agent' : self.user_agent }
#存放段子的變量,每一個元素是每一頁的段子們
self.stories=[]
#程式是否繼續
self.enable=False
#傳入某一頁的索引獲得頁面代碼
def getPage(self,pageIndex):
try:
url='http://www.qiushibaike.com/' + str(pageIndex)
#建構請求request
request=urllib2.Request(url,headers=self.headers)
#利用urlopen擷取頁面代碼
response=urllib2.urlopen(request)
#将頁面代碼轉換成utf-8編碼
pageCode=response.read().decode('utf-8')
return pageCode
except urllib2.URLError,e:
if hasattr(e,"reason"):
print u"連接配接糗事百科失敗,錯誤原因:"+e.reason
return None
#傳入某一頁代碼,傳回本頁不帶圖檔的段子清單
def getPageItems(self,pageIndex):
pageCode=self.getPage(pageIndex)
if not pageCode:
print "頁面加載失敗"
return None
#pattern= re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class'+
# '="content".*?title="(.*?)">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
pattern=re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div class="content">(.*?)</div>.*?<div class="stats".*?i class="number">(.*?)</i>(.*?)</span>.*?<span class="dash".*?i class="number">(.*?)</i>(.*?)</a>',re.S)
items = re.findall(pattern,pageCode)
#用來存儲每頁的段子們
pageStories = []
#周遊正規表達式比對的資訊
for item in items:
#haveImg = re.search("img",item[3])
#if not haveImg:
#item[0]是一個段子的釋出者,item[1]是釋出時間,item[2]是内容,item[4]是點贊數
pageStories.append([item[].strip(),item[].strip(),item[].strip(),item[].strip()])
return pageStories
#加載并提取頁面的内容,加入到清單中
def loadPage(self):
#如果目前未看的頁數少于2頁,則加載新一頁
if self.enable == True:
if len(self.stories) < :
#擷取新一頁
pageStories = self.getPageItems(self.pageIndex)
#将該頁的段子存放到全局list中
if pageStories:
self.stories.append(pageStories)
#擷取完之後頁碼索引加一,表示下次讀取下一頁
self.pageIndex +=
#每次回車列印輸出一個段子
def printOneStory(self,pageStories,page):
#周遊一頁的段子
for story in pageStories:
#等待使用者輸入
input = raw_input()
self.loadPage();
#如果輸入Q則結束
if input=="Q":
self.enable=False
return
print u"%d%s%s%s%s\n" %(page,story[],story[],story[],story[])
#開始方法
def start(self):
print u"enter contiune q exit"
#使變量為True,程式可以正常運作
self.enable = True
#先加載一頁内容
self.loadPage()
#局部變量,控制目前讀到了第幾頁
nowPage =
while self.enable:
if len(self.stories)>:
#從全局list中擷取一頁的段子
pageStories = self.stories[]
#目前讀到的頁數加一
nowPage +=
#将全局list中第一個元素删除,因為已經取出
del self.stories[]
#輸出該頁的段子
self.printOneStory(pageStories,nowPage)
#執行個體化類
spider=qiushibaikeclass()
#開始抓取
spider.start()
代碼中的正規表達式和輸出可以任意更換成自己想要的格式,不明白的地方歡迎留言交流。