Python 爬蟲入門(一)——爬取糗百

爬取糗百內(nèi)容

GitHub 代碼地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py

微信公眾號(hào):【智能制造社區(qū)】室囊,歡迎關(guān)注镰吵。

本文目標(biāo)

  • 掌握爬蟲的基本概念
  • Requests 及 Beautiful Soup 兩個(gè) Python 庫(kù)的基本使用
  • 通過(guò)以上知識(shí)完成糗百段子抓取

爬蟲基本概念

爬蟲也稱網(wǎng)頁(yè)蜘蛛,主要用于抓取網(wǎng)頁(yè)上的特定信息剧罩。這在我們需要獲取一些信息時(shí)非常有用袜腥,比如我們可以批量到美圖網(wǎng)站下載圖片,批量下載段子。省去手工操作的大量時(shí)間槐沼。爬蟲程序一般是通過(guò)模擬瀏覽器對(duì)相應(yīng)URL發(fā)出請(qǐng)求,獲取數(shù)據(jù)捌治,并通過(guò)正則等手段匹配出頁(yè)面中我們所需的數(shù)據(jù)岗钩。

在學(xué)習(xí)爬蟲之前,最好到 w3school 去了解一下 HTML 標(biāo)簽的概念以及基本的 CSS 的概念肖油。這會(huì)讓我們更容易的理解如何獲取頁(yè)面中某個(gè)內(nèi)容兼吓。

Requests 庫(kù)基本介紹

Requests 是學(xué)習(xí)爬蟲的一大利器。是一個(gè)優(yōu)雅簡(jiǎn)單的 HTTP庫(kù)森枪。官網(wǎng)介紹如下:

Requests: HTTP for Humans

專門為人類使用的 HTTP 庫(kù)视搏。使用起來(lái)非常簡(jiǎn)單明了。
我們平時(shí)瀏覽網(wǎng)頁(yè)的步驟是輸入網(wǎng)址县袱,打開浑娜。在 Requests 中是如下這樣的,我們可以在 Python 交互式解釋器中輸入以下代碼:

import requests
r = requests.get('https://www.qiushibaike.com/text/') # 打開網(wǎng)址显拳,一般我們會(huì)設(shè)置 請(qǐng)求頭棚愤,來(lái)更逼真的模擬瀏覽器,下文有介紹
r.text
requests訪問(wèn)url

我門看到下面一堆的代碼杂数,其實(shí)就是網(wǎng)頁(yè)的源代碼(也可以在瀏覽器上右鍵查看頁(yè)面源代碼)宛畦。通過(guò)這幾行代碼我們就拿到了頁(yè)面的所有信息,剩下的就是從頁(yè)面中找到我們所需要的信息揍移。

Beautiful Soup 庫(kù)介紹

拿到網(wǎng)頁(yè)信息后次和,我們要解析頁(yè)面,通常來(lái)說(shuō)我們有以下幾種方式來(lái)解析頁(yè)面那伐,獲取我們所需的信息踏施。

  1. 正則表達(dá)式
    • 適用于簡(jiǎn)單數(shù)據(jù)的匹配,如果匹配內(nèi)容較復(fù)雜罕邀,正則表達(dá)式寫起來(lái)會(huì)很繞畅形,同時(shí)頁(yè)面內(nèi)容稍微變化,正則就會(huì)失效
  2. Lxml
    • Lxml 是專門用來(lái)解析 XML 格式文件的庫(kù)诉探,該模塊用 C 語(yǔ)言編寫日熬,解析速度很快,和正則表達(dá)式速度差不多肾胯,但是提供了 XPath 和 CSS 選擇器等定位元素的方法
  3. Beautiful Soup
    • 這是一個(gè) Python 實(shí)現(xiàn)的解析庫(kù)竖席,相比較于前兩種來(lái)說(shuō)耘纱,語(yǔ)法會(huì)更簡(jiǎn)單明了一點(diǎn),文檔也比較詳細(xì)毕荐。唯一的一點(diǎn)就是運(yùn)行速度比前兩種方式慢幾倍束析,當(dāng)數(shù)據(jù)量非常大時(shí)相差會(huì)更多。

本文作為入門教程憎亚,就從 Beautiful Soup 入手员寇,來(lái)學(xué)習(xí)一下匹配頁(yè)面所需元素的方法。
假如有以下 HTML 內(nèi)容 example.html

<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
</head>
<body>
    <div class='main-page'>
        <ul class='menu-list'>
                <li>首頁(yè)</li>
                <li>新聞</li>
                <li>影視</li>
        </ul>
    </div>
</body>
</html>

我們通過(guò) Beautiful Soup 來(lái)解析這個(gè) html. 首先我們pip install beautifulsoup4安裝這個(gè)庫(kù)虽填,并看一下簡(jiǎn)單使用丁恭。

>>>from bs4 import BeautifulSoup
>>>soup = BeautifulSoup('example.html', 'html.parser') #加載我們的html文件
>>>soup.find('div') # 找到 div 標(biāo)簽
'<div class="main-page">
<ul class="menu-list">
<li>首頁(yè)</li>
<li>新聞</li>
<li>影視</li>
</ul>
</div>'

>>>soup.find_all('li') # 找到所有 li 標(biāo)簽
'[<li>首頁(yè)</li>, <li>新聞</li>, <li>影視</li>]'

>>>for i in li:
    print(i.text)    #獲取每個(gè) li 標(biāo)簽的內(nèi)容
'
首頁(yè)
新聞
影視
'

詳細(xì)的操作可以去看一下文檔,文檔非常詳細(xì)斋日,例子也很多牲览,簡(jiǎn)單明了。

糗百爬蟲代碼

我們先爬取純文本的內(nèi)容 https://www.qiushibaike.com/text/ 爬取這個(gè)鏈接下的內(nèi)容恶守。我們把頁(yè)面結(jié)構(gòu)截圖如下第献,我們要獲取的信息,我用紅色的方框進(jìn)行了標(biāo)注兔港。
圖一:

圖一

圖二:
圖二

import requests
from bs4 import BeautifulSoup


def download_page(url):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
    r = requests.get(url, headers=headers)  # 增加headers, 模擬瀏覽器
    return r.text


def get_content(html, page):
    output = """第{}頁(yè) 作者:{} 性別:{} 年齡:{} 點(diǎn)贊:{} 評(píng)論:{}\n{}\n------------\n""" # 最終輸出格式
    soup = BeautifulSoup(html, 'html.parser')
    con = soup.find(id='content-left')  # 如圖一紅色方框
    con_list = con.find_all('div', class_="article")  # 找到文章列表
    for i in con_list:
        author = i.find('h2').string  # 獲取作者名字
        content = i.find('div', class_='content').find('span').get_text()  # 獲取內(nèi)容
        stats = i.find('div', class_='stats')
        vote = stats.find('span', class_='stats-vote').find('i', class_='number').string
        comment = stats.find('span', class_='stats-comments').find('i', class_='number').string
        author_info = i.find('div', class_='articleGender')  # 獲取作者 年齡庸毫,性別
        if author_info is not None:  # 非匿名用戶
            class_list = author_info['class']
            if "womenIcon" in class_list:
                gender = '女'
            elif "manIcon" in class_list:
                gender = '男'
            else:
                gender = ''
            age = author_info.string   # 獲取年齡
        else:  # 匿名用戶
            gender = ''
            age = ''

        save_txt(output.format(page, author, gender, age, vote, comment, content))


def save_txt(*args):
    for i in args:
        with open('qiubai.txt', 'a', encoding='utf-8') as f:
            f.write(i)


def main():
    # 我們點(diǎn)擊下面鏈接,在頁(yè)面下方可以看到共有13頁(yè)衫樊,可以構(gòu)造如下 url飒赃,
    # 當(dāng)然我們最好是用 Beautiful Soup找到頁(yè)面底部有多少頁(yè)。
    for i in range(1, 14):
        url = 'https://qiushibaike.com/text/page/{}'.format(i)
        html = download_page(url)
        get_content(html, i)

if __name__ == '__main__':
    main()

運(yùn)行代碼后科侈,我們會(huì)得到 'qiubai.txt'文件载佳,打開后如下所示


qiubai
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臀栈,隨后出現(xiàn)的幾起案子蔫慧,更是在濱河造成了極大的恐慌,老刑警劉巖权薯,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姑躲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盟蚣,警方通過(guò)查閱死者的電腦和手機(jī)黍析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屎开,“玉大人橄仍,你說(shuō)我怎么就攤上這事。” “怎么了侮繁?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)如孝。 經(jīng)常有香客問(wèn)我宪哩,道長(zhǎng),這世上最難降的妖魔是什么第晰? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任锁孟,我火速辦了婚禮,結(jié)果婚禮上茁瘦,老公的妹妹穿的比我還像新娘品抽。我一直安慰自己,他們只是感情好甜熔,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布圆恤。 她就那樣靜靜地躺著,像睡著了一般腔稀。 火紅的嫁衣襯著肌膚如雪盆昙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天焊虏,我揣著相機(jī)與錄音淡喜,去河邊找鬼。 笑死诵闭,一個(gè)胖子當(dāng)著我的面吹牛炼团,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疏尿,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼瘟芝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了润歉?” 一聲冷哼從身側(cè)響起模狭,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踩衩,沒(méi)想到半個(gè)月后嚼鹉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驱富,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年锚赤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐鸥。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡线脚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浑侥,我是刑警寧澤姊舵,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站寓落,受9級(jí)特大地震影響括丁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伶选,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一史飞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仰税,春花似錦构资、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至塞帐,卻和暖如春拦赠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葵姥。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工荷鼠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榔幸。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓允乐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親削咆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牍疏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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