零基礎(chǔ)寫python爬蟲之抓取糗事百科代碼分享
項(xiàng)目?jī)?nèi)容:
用Python寫的糗事百科的網(wǎng)絡(luò)爬蟲。
使用方法:
新建一個(gè)Bug.py文件,然后將代碼復(fù)制到里面后,雙擊運(yùn)行。
程序功能:
在命令提示行中瀏覽糗事百科。
原理解釋:
首先,先瀏覽一下糗事百科的主頁:http://www.qiushibaike.com/hot/page/1
可以看出來,鏈接中page/后面的數(shù)字就是對(duì)應(yīng)的頁碼,記住這一點(diǎn)為以后的編寫做準(zhǔn)備。
然后,右擊查看頁面源碼:

觀察發(fā)現(xiàn),每一個(gè)段子都用div標(biāo)記,其中class必為content,title是發(fā)帖時(shí)間,我們只需要用正則表達(dá)式將其“扣”出來就可以了。
明白了原理之后,剩下的就是正則表達(dá)式的內(nèi)容了,可以參照這篇文章:
http://www.dhdzp.com/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
# 將所有的段子都扣出來,添加到列表中并且返回列表
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):
# 如果用戶未輸入quit則一直運(yùn)行
while self.enable:
# 如果pages數(shù)組中的內(nèi)容小于2個(gè)
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'正在加載中請(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"""
---------------------------------------
程序:糗百爬蟲
版本:0.3
作者:why
日期:2014-06-03
語言:Python 2.7
操作:輸入quit退出閱讀糗事百科
功能:按下回車依次瀏覽今日的糗百熱點(diǎn)
---------------------------------------
"""
print u'請(qǐng)按下回車瀏覽今日的糗百內(nèi)容:'
raw_input(' ')
myModel = Spider_Model()
myModel.Start()
Q&A:
1.為什么有段時(shí)間顯示糗事百科不可用?
答:前段時(shí)間因?yàn)轸苁掳倏铺砑恿薍eader的檢驗(yàn),導(dǎo)致無法爬取,需要在代碼中模擬Header?,F(xiàn)在代碼已經(jīng)作了修改,可以正常使用。
2.為什么需要單獨(dú)新建個(gè)線程?
答:基本流程是這樣的:爬蟲在后臺(tái)新起一個(gè)線程,一直爬取兩頁的糗事百科,如果剩余不足兩頁,則再爬一頁。用戶按下回車只是從庫存中獲取最新的內(nèi)容,而不是上網(wǎng)獲取,所以瀏覽更順暢。也可以把加載放在主線程,不過這樣會(huì)導(dǎo)致爬取過程中等待時(shí)間過長(zhǎng)的問題。
相關(guān)文章
前女友發(fā)來加密的"520快樂.pdf",我用python破解開之后,卻發(fā)現(xiàn)
520收到前女友發(fā)來的加密PDF文件,說打開之后有驚喜,難道是要復(fù)合?我用python破解開之后,卻發(fā)現(xiàn)...python干貨+劇情滿滿收藏收藏2021-08-08
Python中日志模塊logging的使用技巧和應(yīng)用詳解
在Python開發(fā)中,日志記錄是一個(gè)非常重要的環(huán)節(jié),它不僅有助于開發(fā)者追蹤程序的執(zhí)行流程,還能在出現(xiàn)問題時(shí)提供關(guān)鍵信息,幫助快速定位并解決問題,本文將結(jié)合實(shí)際案例,詳細(xì)介紹logging模塊的基礎(chǔ)用法和高級(jí)特性,需要的朋友可以參考下2024-08-08
Python使用中文正則表達(dá)式匹配指定中文字符串的方法示例
這篇文章主要介紹了Python使用中文正則表達(dá)式匹配指定中文字符串的方法,結(jié)合實(shí)例形式分析了Python正則匹配及字符編碼相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
Python調(diào)用ChatGPT?API接口的用法詳解
ChatGPT可以實(shí)現(xiàn)chat,生成圖片,識(shí)別關(guān)鍵,改錯(cuò)等等功能,本文簡(jiǎn)單的給大家介紹一下如何使用python調(diào)用ChatGPT?API接口,感興趣的小伙伴可以參考一下2023-05-05
python中l(wèi)ist循環(huán)語句用法實(shí)例
這篇文章主要介紹了python中l(wèi)ist循環(huán)語句用法,以實(shí)例形式詳細(xì)介紹了Python針對(duì)list的解析,包含各種常見的遍歷操作及原理分析,需要的朋友可以參考下2014-11-11
詳解OpenCV執(zhí)行連通分量標(biāo)記的方法和分析
在本教程中,您將學(xué)習(xí)如何使用?OpenCV?執(zhí)行連通分量標(biāo)記和分析。具體來說,我們將重點(diǎn)介紹?OpenCV?最常用的連通分量標(biāo)記函數(shù):cv2.connectedComponentsWithStats,感興趣的可以了解一下2022-08-08
python執(zhí)行子進(jìn)程實(shí)現(xiàn)進(jìn)程間通信的方法
這篇文章主要介紹了python執(zhí)行子進(jìn)程實(shí)現(xiàn)進(jìn)程間通信的方法,涉及Python使用subprocess模塊操作進(jìn)程的相關(guān)技巧,需要的朋友可以參考下2015-06-06
如何在Django中設(shè)置定時(shí)任務(wù)的方法示例
這篇文章主要介紹了如何在Django中設(shè)置定時(shí)任務(wù)的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01

