-
哈羅又見面了呆躲,我就是那個(gè)菜鳥异逐。
- 這次我看著知乎大佬爬嗅事百科的案例,自己爬了下挖段子網(wǎng)插掂,來分享一下应役。
- 代碼敲累了?爬幾個(gè)段子了一下,段子五分鐘代碼兩小時(shí)箩祥。
'''
根據(jù)知乎大神
代碼作者:高佳樂
'''
import re ##導(dǎo)入re庫
import requests ##導(dǎo)入requests
import time ##導(dǎo)入time
#from bs4 import BeautifulSoup ##導(dǎo)入bs4
##定義一個(gè)去空格的類
class Tool(): ##定義一個(gè)類院崇,這個(gè)類是去除空格
def replace(self,html): ##方法,有兩個(gè)參數(shù)
html = re.sub(re.compile('<br/>|<br />','',html)) ##html=re.sub是替換函數(shù)袍祖,re.compile是換成正則表達(dá)式底瓣。
return html
class Spider(object): ##定義一個(gè)類,名字叫爬蟲的類
##初始化方法
def __init__(self): ##初始化
self.url = 'http://www.waduanzi.com/' ##他的url是首頁蕉陋,因?yàn)楹筮叺亩际鞘醉摷訑?shù)字了
self.tool = Tool() ##他的tool是清理后空格
##定義一個(gè)發(fā)送請(qǐng)求的方法
def Request(self,getUrl): ##定義request方法捐凭,參數(shù)是geturl
html = requests.get(getUrl) ##html是請(qǐng)求參數(shù)的地址
html_text = html.text ##html_text是html的text后
return html_text ##返回他的text格式
##定義一個(gè)獲取準(zhǔn)確字節(jié)的方法
def Obtain(self,obtain): ##定義Obtain方法,有兩個(gè)參數(shù)
html_text = self.Request(obtain) ##html_text是他的參數(shù)凳鬓,用上個(gè)方法返回來的text
##下邊是定義一個(gè)正則表達(dá)式可以這么說了茁肠,好吧我承認(rèn),我不熟練缩举,這個(gè)表達(dá)式我配了一陣垦梆,我看著谷歌配成功的,別的瀏覽器屬性會(huì)跑仅孩。
regular = re.compile('<div.*?post-box.*?post-author.*?<img target.*?>.*?<a.*?_blank".*?>(.*?)</a>.*?item-detail.*?item-title.*?item-content">(.*?)</div>.*?item-toolbar.*?fleft.*?<a.*?>(.*?)</a>.*?fleft.*?<a.*?>(.*?)</a>.*?</li>',re.S)
itmes = re.findall(regular,html_text) ##items 獲取到findall所有符合到的冲呢,不過格式是一個(gè)列表础芍,每項(xiàng)是元組
number = 1 ##number=1就是計(jì)數(shù)器
for itme in itmes: ##因?yàn)槭橇斜碡遗福檬裁淳ń迹瑢?duì)遍歷
print('第%d個(gè)\n樓主:%s\n正文:%s\n點(diǎn)贊:%s\n踩:%s'%(number,itme[0],itme[1],itme[2],itme[3]))##輸出格式是這樣額
print() ##這個(gè)是換行輸出
number+=1 ##計(jì)數(shù)器就要+1
return itmes ##返回那個(gè)集合
##保存文件
def save(self,data,name): ##定義save方法兩個(gè)參數(shù)
filName = 'page'+name+'.txt' ##定義一個(gè)名字
f = open(filName,'wb') ##f = 定義的名字和能讀寫模式
f.write(data.encode('utf-8')) ##寫入data的utf8模式
f.close() ##關(guān)閉文件,隨開隨關(guān)才是好孩子
##操作打開保存
def onesave(self,url,save): ##定義一個(gè)方法溅蛉,就是打開后保存
html = self.Obtain(url) ##html是運(yùn)用上一個(gè)方法獲取列表
self.save(str(html),str(save)) ##保存(str(html),str(save))第一個(gè)str是轉(zhuǎn)換成字符串公浪,第二個(gè)也是因?yàn)榈诙€(gè)要+連接的
##第幾頁
def page(self,star,end): ##定義第幾頁的方法,兩個(gè)參數(shù)船侧,開始和結(jié)束
if star == 1: ##如果輸入的1
print('正在讀取第1頁') ##正在讀取第一頁
self.onesave(self.url,star) ##就是打開保存第一頁欠气,url是初始化的首頁
print('第一頁獲取結(jié)束') ##第一頁獲取結(jié)束
number = 2 ##然后number=2是要計(jì)數(shù),因?yàn)榈谝豁撘呀?jīng)開始的所以從第二個(gè)
for i in range(number,end+1): ##然后循環(huán)勺爱,從第二個(gè)開始,到end+1結(jié)束讯检,為什么琐鲁,因?yàn)閒or取頭不取尾
print('正在讀取%s頁'%i) ##正在讀取i
page = self.url+'/page/'+str(i) ##page是頁數(shù),因?yàn)樵诰W(wǎng)頁得知幾頁幾頁是人灼,主頁+/page/幾頁的
self.onesave(page,i) ##然后打開保存
print('%s頁結(jié)束'%i) ##輸出結(jié)束
time.sleep(2) ##等待時(shí)間围段,爬蟲嘛,要有禮貌的爬
number+=1 ##計(jì)數(shù)器
if number == end+1: ##上邊循環(huán)完了判斷投放,計(jì)數(shù)器是不是=end+1了奈泪。不出意外就會(huì)
print('加載結(jié)束') ##加載結(jié)束
return False ##返回False
elif star>1: ##如果開始是大于一的
number = star ##就讓計(jì)數(shù)器=輸入的
for i in range(star,end+1): ##循環(huán)從輸入的和結(jié)束+1循環(huán)
print("正在讀取%s頁"%i) ##正在讀取
page = self.url+'/page/'+str(i) ##就是獲取網(wǎng)址的
self.onesave(page,i) ##打開,保存
print('%s讀取結(jié)束'%i) ##讀取結(jié)束
time.sleep(2) ##禮貌,要禮貌涝桅,論爬蟲的素養(yǎng)
number+=1 ##計(jì)數(shù)器不+1還有什么意義
if number == end+1: ##循環(huán)結(jié)束了等于end+1
print('加載已結(jié)束') ##循環(huán)結(jié)束
return False ##返回False
duqu = Spider() ##實(shí)例化
duqu.page(star=(int(input('請(qǐng)輸入你要獲取的開始'))),end=int(input('請(qǐng)輸入結(jié)束頁數(shù)'))) ##實(shí)例的page獲取的開始拜姿,結(jié)束
- 我怕縮進(jìn)出問題我就復(fù)制粘貼了我的代碼。就是這么懶冯遂,打我啊蕊肥。
-
代碼完成是這樣子滴。
搜狗截圖20180527151549.png
- 好了我的代碼就是這些蛤肌。我類也是剛剛學(xué)的壁却,所以就用了類
- 可能是我總是試一試,網(wǎng)站好像emmm裸准,把我攔截了展东,我沒有用代理,不太熟就沒做炒俱。
- 爬蟲嘛盐肃,要禮貌,禮貌向胡。