date: 2016-10-14 20:42:22
主要使用python自帶的urllib2進(jìn)行爬蟲實驗。
寫在前面的蠢事:
本來新建了一個urllib2.py便于好認(rèn)識這是urllib2的實驗,結(jié)果始終編譯不通過,錯誤錯誤。不能用Python的關(guān)鍵字(保留字)來命名py文件,改了就好了。
正則表達(dá)式與re
Python 通過 re 模塊提供對正則表達(dá)式的支持。使用 re 的一般步驟是:
Step1:先將正則表達(dá)式的字符串形式編譯為Pattern實例。
Step2:然后使用Pattern實例處理文本并獲得匹配結(jié)果(一個Match實例)。
Step3:最后使用Match實例獲得信息,進(jìn)行其他的操作。
<pre>
!/usr/bin/env python
-- coding: utf-8 --
@Date : 2016-10-14 21:16:25
@Author : Nicolo (1241251168@qq.com)
@Link : http://www.xiaosablog.cf/
@Version : $Id$
一個簡單的re實例,匹配字符串中的hello字符串
導(dǎo)入re模塊
import re
將正則表達(dá)式編譯成Pattern對象,注意hello前面的r的意思是“原生字符串”
pattern = re.compile(r'hello')
使用Pattern匹配文本,獲得匹配結(jié)果,無法匹配時將返回None
match1 = pattern.match('hello world!')
match2 = pattern.match('helloo world!')
match3 = pattern.match('helllo world!')
如果match1匹配成功
if match1:
使用Match獲得分組信息
print match1.group()
else:
print 'match1匹配失??!'
如果match2匹配成功
if match2:
使用Match獲得分組信息
print match2.group()
else:
print 'match2匹配失??!'
如果match3匹配成功
if match3:
使用Match獲得分組信息
print match3.group()
else:
print 'match3匹配失??!'
</pre>
編譯結(jié)果:
<pre>
hello
hello
match3匹配失敗!
</pre>
糗事百科的網(wǎng)絡(luò)爬蟲
<pre>
import urllib2
import urllib
import re
import thread
import time
----------- 加載處理糗事百科 -----------
class Spider_Model:
def __init__(self):
self.page = 1
self.pages = []
self.enable = False
# 將所有的段子都扣出來,添加到列表中并且返回列表
def GetPage(self,page):
myUrl = "http://m.qiushibaike.com/hot/page/" + page
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(myUrl, headers = headers)
myResponse = urllib2.urlopen(req)
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則一直運行
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,nowPage,page):
for items in nowPage:
print u'第%d頁' % page , items[0] , 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"""
程序:糗百爬蟲
操作:輸入quit退出閱讀糗事百科
功能:按下回車依次瀏覽今日的糗百熱點
"""
print u'請按下回車瀏覽今日的糗百內(nèi)容:'
raw_input(' ')
myModel = Spider_Model()
myModel.Start()
</pre>