soda學python---簡單爬糗百

在知乎上看過很多爬蟲相關,一直沒有動手,現在開始get my hand dirty.
本篇在學習知乎大神xzld的Web crawler with Python - 03.豆瓣電影TOP250基礎上,簡單爬取了糗百上的笑話。

結果.png

任務目標

利用python爬取糗事百科上的笑話。

任務理解

在做任何爬蟲之前,我們首先需要了解一下想要爬取的對象

  • 打開:用火狐瀏覽器打開糗事百科,打開開發者工具(F12)
  • 查看 :選中任意一條笑話,鼠標右鍵后點擊查看,我們就可以看到該條笑話在HTML中位于的位置
  • 觀察 :仔細觀察其標簽,因為之后我們將根據其標簽來定位。

通過觀察我們發現,笑話內容位于<div class=content>的<span>標簽下。
那么我們的任務即轉變為:
在糗事百科的HTML中找到<.div class=content>的<span>標簽的文本內容。

源代碼截圖.png

因此,我們將任務即可分為三部分:

  • 下載:將糗事百科頁面的HTML內容下載下來,這部分我們將使用requests包
  • 解析:根據標簽查找到文本內容并存儲,這部分使用BeautifulSoup包。
  • 輸出:將文本內容格式化輸出,這部分我們將使用codecs包。

任務進行

環境準備

import warnings 
warnings.filterwarnings('ignore')

import requests
from bs4 import BeautifulSoup
import codecs

引入requests,BeautifulSoup,codecs及warnings包。warnings包主要用來忽略編碼過程中的警告提示,我常喜歡把它寫在編碼前

下載頁面

我們使用requests中的get方法來獲取頁面,

URL="https://www.qiushibaike.com/"
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0'}
html=requests.get(URL,headers=header).content

簡單介紹代碼內容

  1. 第一行代碼指定網頁
  2. 第二行代碼指定請求頭User-Agent(表示瀏覽器類型),用來將爬蟲偽裝成瀏覽器。
  3. 第三行利用requests.get().content 獲取指定網頁源代碼。

注意reuqests.get(URL,headers=header)中headers不能省略

網頁源代碼.png

一般,瀏覽器在向服務器發送請求的時候,會有一個請求頭——User-Agent,它用來標識瀏覽器的類型.當我們使用requests來發送請求的時候,默認的User-Agent是python-requests/2.8.1(后面的數字可能不同,表示版本號),通常我們需要要將User-Agent偽裝成瀏覽器的,來解決某些網頁反爬蟲的問題。這是一種簡單的反爬蟲機制

解析頁面

通過上部我們的得到網頁源代碼,但是看起來非常的亂,毫無頭緒,就像一鍋東北亂燉。然后通過BeautifulSoup,包如其名,總能把亂糟糟的菜熬成很漂亮的一鍋湯,讓你很方便的找到需要的內容。

  • 熬湯:通過BeautifulSoup命令間html內容轉換為beautifulsoup格式
soup=BeautifulSoup(html)
soup.png

如上圖,BeautifulSoup將源代碼很好的處理為了標簽加內容的格式,非常利于我們來查找內容。

  • 找菜:湯熬好,就可以根據我們給出的標簽來找菜了
    joks=soup.find_all('div',attrs={'class':'content'})
    jok_list=[]
    for joks in jokss:
        jok=joks.find('span').getText()
        jok_list.append(jok)
  1. 第一行利用find_all找到所有標簽為<div class=content>內容
    圖片.png
  2. 第二行創建一個空列表jok_list,用來存儲之后找到的笑話
  3. 第三行建立一個循環,利用find依次查找每一個<div class=content>中的<span>標簽并獲取其中的文本內容,利用append函數存儲到jok_list
  • 加菜:當然我們注意到,糗百涉及到翻頁。我們還需要解決翻頁的問題,這個問題最簡單的方法就是找到下一頁的鏈接,再重復之前的步驟即可。
next_page=soup.find('ul',{'class':'pagination'}).find_all('a')[-1]['href']
next_page=URL[:-1]+next_page
next_page.png

點擊下一頁,查看元素。我們發現下一頁的鏈接再<ul,class=pagination>的最后一個標簽<'a'>下。因為使用find只能返回匹配的第一個對象,因此這里我們使用find_all找到所有匹配對象的列表。再通過soup.find('ul',{'class':'pagination'}).find_all('a')[-1]定位到最后一個對象,即包含下一頁信息的對象.

注意
以第一頁為例得到的結果為* '/8hr/page/2/' ,需要與 URL='https://www.qiushibaike.com/'拼接。但是如果直接連在一起得到結果為
'https://www.qiushibaike.com//8hr/page/2多了一條‘/’因此,使用URL[-1]+next_page才能得到正確的鏈接。 'https://www.qiushibaike.com/8hr/page/2 *

存儲

 codecs.open('joks','wb',encoding='utf-8') as fp:
 fp.write(u'{jok_list}\n'.format(jok_list='\n'.join(jok_llist)))

任務總結

import requests
from bs4 import BeautifulSoup
import warnings 
import codecs
warnings.filterwarnings('ignore')

def download_page(url):
    header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0'}
    html=requests.get(URL,headers=header).content
    return html

def parsel_html(html):
    soup=BeautifulSoup(html)
    joks=soup.find_all('div',{'class':'content'})
    jok_list=[]
    for joks in jokss:
        jok=joks.find('span').getText()
        jok_list.append(jok)
    next_page=soup.find('ul',{'class':'pagination'}).find_all('a')[-1]['href']
    if next_page:
        return jok_list,URL[:-1]+next_page
    return jok_list,None
def main():
    URL="https://www.qiushibaike.com/"
    with codecs.open('joks','wb',encoding='utf-8') as fp:
        while URL:
            HTML=download_page(URL)
            JOK,URL=parsel_html(HTML)
            fp.write(u'{JOK}\n'.format(JOK='\n'.join(JOK)))
                               
if __name__ == '__main__':
    main()                               
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容