零基礎(chǔ)寫(xiě)python爬蟲(chóng)之抓取糗事百科代碼分享
項(xiàng)目?jī)?nèi)容:
用Python寫(xiě)的糗事百科的網(wǎng)絡(luò)爬蟲(chóng)。
使用方法:
新建一個(gè)Bug.py文件,然后將代碼復(fù)制到里面后,雙擊運(yùn)行。
程序功能:
在命令提示行中瀏覽糗事百科。
原理解釋?zhuān)?br />
首先,先瀏覽一下糗事百科的主頁(yè):http://www.qiushibaike.com/hot/page/1
可以看出來(lái),鏈接中page/后面的數(shù)字就是對(duì)應(yīng)的頁(yè)碼,記住這一點(diǎn)為以后的編寫(xiě)做準(zhǔn)備。
然后,右擊查看頁(yè)面源碼:
觀察發(fā)現(xiàn),每一個(gè)段子都用div標(biāo)記,其中class必為content,title是發(fā)帖時(shí)間,我們只需要用正則表達(dá)式將其“扣”出來(lái)就可以了。
明白了原理之后,剩下的就是正則表達(dá)式的內(nèi)容了,可以參照這篇文章:
http://chabaoo.cn/article/57150.htm
運(yùn)行效果:
# -*- coding: utf-8 -*-
import urllib2
import urllib
import re
import thread
import time
#----------- 加載處理糗事百科 -----------
class Spider_Model:
def __init__(self):
self.page = 1
self.pages = []
self.enable = False
# 將所有的段子都扣出來(lái),添加到列表中并且返回列表
def GetPage(self,page):
myUrl = " 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 中第一個(gè)是div的標(biāo)題,也就是時(shí)間
# item 中第二個(gè)是div的內(nèi)容,也就是內(nèi)容
items.append([item[0].replace("\n",""),item[1].replace("\n","")])
return items
# 用于加載新的段子
def LoadPage(self):
# 如果用戶(hù)未輸入quit則一直運(yùn)行
while self.enable:
# 如果pages數(shù)組中的內(nèi)容小于2個(gè)
if len(self.pages) < 2:
try:
# 獲取新的頁(yè)面中的段子們
myPage = self.GetPage(str(self.page))
self.page += 1
self.pages.append(myPage)
except:
print '無(wú)法鏈接糗事百科!'
else:
time.sleep(1)
def ShowPage(self,nowPage,page):
for items in nowPage:
print u'第%d頁(yè)' % 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'正在加載中請(qǐng)稍候......'
# 新建一個(gè)線程在后臺(tái)加載段子并存儲(chǔ)
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"""
---------------------------------------
程序:糗百爬蟲(chóng)
版本:0.3
作者:why
日期:2014-06-03
語(yǔ)言:Python 2.7
操作:輸入quit退出閱讀糗事百科
功能:按下回車(chē)依次瀏覽今日的糗百熱點(diǎn)
---------------------------------------
"""
print u'請(qǐng)按下回車(chē)瀏覽今日的糗百內(nèi)容:'
raw_input(' ')
myModel = Spider_Model()
myModel.Start()
Q&A:
1.為什么有段時(shí)間顯示糗事百科不可用?
答:前段時(shí)間因?yàn)轸苁掳倏铺砑恿薍eader的檢驗(yàn),導(dǎo)致無(wú)法爬取,需要在代碼中模擬Header?,F(xiàn)在代碼已經(jīng)作了修改,可以正常使用。
2.為什么需要單獨(dú)新建個(gè)線程?
答:基本流程是這樣的:爬蟲(chóng)在后臺(tái)新起一個(gè)線程,一直爬取兩頁(yè)的糗事百科,如果剩余不足兩頁(yè),則再爬一頁(yè)。用戶(hù)按下回車(chē)只是從庫(kù)存中獲取最新的內(nèi)容,而不是上網(wǎng)獲取,所以瀏覽更順暢。也可以把加載放在主線程,不過(guò)這樣會(huì)導(dǎo)致爬取過(guò)程中等待時(shí)間過(guò)長(zhǎng)的問(wèn)題。
相關(guān)文章
Python持續(xù)監(jiān)聽(tīng)文件變化代碼實(shí)例
這篇文章主要介紹了Python持續(xù)監(jiān)聽(tīng)文件變化代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Python腳本在Appium庫(kù)上對(duì)移動(dòng)應(yīng)用實(shí)現(xiàn)自動(dòng)化測(cè)試
這篇文章主要介紹了使用Python的Appium庫(kù)對(duì)移動(dòng)應(yīng)用實(shí)現(xiàn)自動(dòng)化測(cè)試的教程,屬于Python腳本的一個(gè)自動(dòng)化應(yīng)用,需要的朋友可以參考下2015-04-04Python爬蟲(chóng)實(shí)戰(zhàn)之批量下載快手平臺(tái)視頻數(shù)據(jù)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你批量下載快手平臺(tái)視頻數(shù)據(jù),大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10python實(shí)現(xiàn)QQ定時(shí)發(fā)送新年祝福信息
大家好,本篇文章主要講的是python實(shí)現(xiàn)QQ定時(shí)發(fā)送新年祝福信息,感興趣的同學(xué)感快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02500行代碼使用python寫(xiě)個(gè)微信小游戲飛機(jī)大戰(zhàn)游戲
這篇文章主要介紹了500行代碼使用python寫(xiě)個(gè)微信小游戲飛機(jī)大戰(zhàn)游戲,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10python 將列表里的字典元素合并為一個(gè)字典實(shí)例
這篇文章主要介紹了python 將列表里的字典元素合并為一個(gè)字典實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09wxpython多線程防假死與線程間傳遞消息實(shí)例詳解
今天小編就為大家分享一篇wxpython多線程防假死與線程間傳遞消息實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python使用requests模塊實(shí)現(xiàn)爬取電影天堂最新電影信息
這篇文章主要介紹了python使用requests模塊實(shí)現(xiàn)爬取電影天堂最新電影信息,本文通過(guò)實(shí)例代碼給大家介紹了str/list/tuple三者之間怎么相互轉(zhuǎn)換,需要的朋友可以參考下2019-04-04