用Python爬取百度貼吧帖子

一杏瞻、介紹

前前后后拖了很久的一個(gè)爬蟲純?cè)瓌?chuàng)我心中的NBA2014-2015賽季現(xiàn)役50大,一般的抓取信息還是蠻簡(jiǎn)單的,但這個(gè)爬蟲在于有些樓層是含圖片的,這樣我們抓取下來(lái)就會(huì)有<img.*?>之類的東西饺藤,很難受;還有就是這個(gè)爬蟲告訴我們當(dāng)正則走投無(wú)路時(shí)BeautifulSoup或許是個(gè)不錯(cuò)的選擇流礁,在匹配數(shù)據(jù)的時(shí)候很好用

二涕俗、流程

  • 目標(biāo)站點(diǎn)分析
    用瀏覽器打開純?cè)瓌?chuàng)我心中的NBA2014-2015賽季現(xiàn)役50大,開始審查元素崇棠,沒(méi)什么特別的咽袜,很基礎(chǔ)的網(wǎng)頁(yè)結(jié)構(gòu),但在抓取樓層號(hào)和時(shí)間的我們發(fā)現(xiàn)問(wèn)題了——我(艸皿艸 )這讓我怎么寫正則枕稀,還有天理嗎?谜嫉?萎坷?
    1.0
2.0
  • 客官莫慌,我們有標(biāo)簽選擇器
    標(biāo)簽選擇器的寫法也有很多種沐兰,我這里是參考大鄧的寫法哆档,還蠻好理解的

  • 開啟循環(huán),批量抓取

  • 保存數(shù)據(jù)至文本

三住闯、代碼

import requests
from requests.exceptions import RequestException
import re
import json
from bs4 import BeautifulSoup   #都是基本的幾個(gè)庫(kù)

def get_one_page(url):
    try:
        response=requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def get_the_number():
    a = input("是否只獲取樓主發(fā)言瓜浸,是輸入1,否輸入0:")
    a = int(a)
    if a == 1 or a == 0:
        if a == 1:
            print("只看樓主模式>>>")
            write_to_file("只看樓主模式>>>")
        else:
            print('普通模式>>>')
            write_to_file("普通模式>>>")   #這部分我還是比較滿意的
    pattern = re.compile('<h3 class="core_title_txt.*?>(.*?)</h3>.*?'
                         +'<span class="red".*?>(.*?)</span>.*?<span '
                          +'class="red">(.*?)</span>.*?</div>', re.S)   #為了匹配準(zhǔn)確我把正則寫的不那么“正則”
    html=requests.get('https://tieba.baidu.com/p/3138733512?see_lz='+str(a)).text
    result=re.search(pattern,str(html))
    if result:
        print('標(biāo)題:', result.group(1))
        print('回復(fù)數(shù):',result.group(2))
        b= result.group(3)
        print('頁(yè)數(shù):',b)
    else:
        print('獲取頁(yè)數(shù)信息失敗')
    return a,b   #return多個(gè)對(duì)象比原,沒(méi)毛病

def get_the_floor_time(html):   #把樓層號(hào)和時(shí)間的信息搞出來(lái)
    soup = BeautifulSoup(html, 'lxml')
    items=soup.find_all('span',{'class':'tail-info'})   #嗯插佛,這里就用標(biāo)簽選擇器來(lái)選擇樓層號(hào)和時(shí)間
    pattern = re.compile('<span class="tail-info">(\d.*?)</span>', re.S)   #再用正則匹配,這個(gè)時(shí)候一定要細(xì)心量窘,一開始我寫的是'<span class="tail-info">(\d.*?)</span>雇寇,'結(jié)果最后一個(gè)日期就匹配不到,具體原因看items蚌铜,仔細(xì)看锨侯!
    items = re.findall(pattern, str(items))
    return items   #這里得到的items是一個(gè)列表,返回它就好冬殃,之后再輸出

def get_the_content(html):   #輸出帖子的樓層內(nèi)容并且把<img....>之類的刪了
    soup = BeautifulSoup(html, 'lxml')
    contents=soup.find_all('div',{'class':'d_post_content j_d_post_content '})
    if contents:
        items=get_the_floor_time(html)
        i=-1
        for content in contents:
            content=content.get_text().strip()   #得到樓層內(nèi)容的純文本
            i=i+1
            print(items[2 * i])
            write_to_file(items[2 * i])   #寫入數(shù)據(jù)
            print(items[2 * i + 1])
            write_to_file(items[2 * i + 1])
            print(content)
            write_to_file(content)
            print('----------------------------------------------------------------------------------------------------')
            write_to_file('-------------------------------------------------------------------------------------------')
    else:
        print("獲取帖子內(nèi)容失敗")

def write_to_file(content):   #這基本是標(biāo)配了
    with open('bdtb_result.text','a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
        f.close()

def main():
    c = get_the_number()   #得到的是get_the_number()的返回值囚痴,一個(gè)列表
    a=(c[0])
    b=int(c[1])   #這里要int,b代表的是頁(yè)數(shù)审葬,得到b深滚,我們就知道要循環(huán)多少次了
    for b in range(1,b+1):
        url = 'https://tieba.baidu.com/p/3138733512?see_lz='+str(a)+'&pn='+str(b)
        get_one_page(url)
        html=get_one_page(url)
        get_the_content(html)
        
if __name__=='__main__':
        main()

四骂束、最后得到的數(shù)據(jù)視圖和文件

3.0

五、總結(jié)

1.要好好利用工具成箫,遇到問(wèn)題多問(wèn)度娘
2.在這里最初的想法是把每個(gè)樓層的用戶名也打印出來(lái)的展箱,運(yùn)行到300多層的時(shí)候總是報(bào)錯(cuò),等我找到好的解決辦法再po上來(lái)
3.未完待續(xù).....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹬昌,一起剝皮案震驚了整個(gè)濱河市混驰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌皂贩,老刑警劉巖栖榨,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異明刷,居然都是意外死亡婴栽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門辈末,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)愚争,“玉大人,你說(shuō)我怎么就攤上這事挤聘『渲Γ” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵组去,是天一觀的道長(zhǎng)鞍陨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)从隆,這世上最難降的妖魔是什么诚撵? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮键闺,結(jié)果婚禮上寿烟,老公的妹妹穿的比我還像新娘。我一直安慰自己艾杏,他們只是感情好韧衣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著购桑,像睡著了一般畅铭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勃蜘,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天硕噩,我揣著相機(jī)與錄音,去河邊找鬼缭贡。 笑死炉擅,一個(gè)胖子當(dāng)著我的面吹牛辉懒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谍失,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眶俩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了快鱼?” 一聲冷哼從身側(cè)響起颠印,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抹竹,沒(méi)想到半個(gè)月后线罕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窃判,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年钞楼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袄琳。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡询件,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跨蟹,到底是詐尸還是另有隱情雳殊,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布窗轩,位于F島的核電站,受9級(jí)特大地震影響座咆,放射性物質(zhì)發(fā)生泄漏痢艺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一介陶、第九天 我趴在偏房一處隱蔽的房頂上張望堤舒。 院中可真熱鬧,春花似錦哺呜、人聲如沸舌缤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)国撵。三九已至,卻和暖如春玻墅,著一層夾襖步出監(jiān)牢的瞬間介牙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工澳厢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留环础,地道東北人囚似。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像线得,于是被迫代替她去往敵國(guó)和親饶唤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容