Python 爬蟲(正則匹配爬取百思不得姐)

好久沒寫東西了榜配,開始是因為準備畢設否纬,畢業(yè)了有點散漫,后來公司任務有點繁重蛋褥,再后來國慶中秋玩了 8 天……總之就是一個字 -- 太懶了×偃迹現(xiàn)在我得把這些東西撿起來,盡量每周都能總結一些東西。
因為公司人手不夠膜廊,我又搞了點 Python 的東西乏沸。人生苦短,我學 Python溃论。這篇文章就是寫如何應用 Python 編寫一個簡單的爬蟲
  • 陸續(xù)會有幾篇爬蟲相關的文章:
    • 應用正則匹配爬取 “百思不得姐”
    • 應用 selenium 爬取 “糗事百科”
    • 爬取 “36kr” 首頁新聞
    • 爬取 “騰訊新聞”

不多廢話屎蜓,開始

一痘昌、分析網(wǎng)頁代碼

我們要爬取的是 “百思不得姐” 的視頻模塊钥勋,首先打開百思不得姐看一下網(wǎng)頁結構。

百思不得姐視頻模塊

我們看到網(wǎng)頁左部分即需要爬取的搞笑視頻辆苔,右部分是一些標簽算灸、廣告等。然后我們 command + alt + u 來看下網(wǎng)頁的源代碼驻啤。

源代碼

可以找到我們要爬取的視頻標題菲驴、地址在代碼中的位置,所以我們只要獲取該位置的代碼即可骑冗。

二赊瞬、獲取網(wǎng)頁代碼

  • 很多網(wǎng)站做了反爬處理,我們可以模擬瀏覽器訪問贼涩,拿到 User-Agent
  • 下載 requests 模塊并導入該模塊

代碼如下

#!/usr/bin/env python
#coding:utf-8

import requests

page = 1
def getData():
    global page
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    url = 'http://www.budejie.com/video/' + str(page)
    html = requests.get(url, headers = headers).text
    print html

getData()

運行即可獲取 “百思不得姐” 的 HTML 代碼巧涧。

三、正則匹配視頻和標題

第一步中我們已經(jīng)得到網(wǎng)頁的代碼結構遥倦,我們需要通過正則匹配對應部分的代碼谤绳。

此部分代碼如下:

#!/usr/bin/env python
#coding:utf-8

import requests
import re

data = []
page = 1
def getData():
    global page
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    url = 'http://www.budejie.com/video/' + str(page)
    html = requests.get(url, headers = headers).text

    match_obj = re.compile(r'<div class="j-r-list-c">.*?</div>.*?</div>', re.S)
    results = re.findall(match_obj, html)

    for item in results:
        match_video = r'data-mp4="(.*?)">'
        video = re.findall(match_video, item)
        # print video
        if video:
            match_title = re.compile(r'<a href="/detail-.{8}?.html">(.*?)</a>', re.S)
            title = re.findall(match_title, item)
            # print title
            for i, j in zip(title, video):
                data.append([i, j])
                print i, j

getData()

match_obj 是匹配了每個視頻的最外層的 <div class="j-r-list-c">,和后面兩個 </div>
match_video 是匹配對應視頻的地址
match_title 是匹配對應視頻的標題

四袒哥、下載視頻

最后把爬取的視頻下載到本地缩筛,需要用到 urllib、os 模塊堡称。

首先應用 os 模塊判斷當前文件目錄下是否存在名為 video 的文件夾瞎抛,沒有則創(chuàng)建一個

def initFile():
    dir = os.getcwd()
    list =  os.listdir(dir)
    flag = False
    for i in list:
        if i == 'video':
            flag == True
            break
    if flag == False:
        os.mkdir('video') 

然后應用 urllib 的 urlretrieve 方法進行下載。

num = 1
def saveData():
    global num
    while num <= 10:
        data = getData()
        for i in data:
            urllib.urlretrieve(i[1], './video/%s.mp4' %(i[0]))
            data.pop(0)
            num += 1

num 用來控制視頻下載個數(shù)却紧,我這里以 10 個為例演示桐臊。
./video/%s.mp4 為保存的路徑,若不寫 initFile 方法啄寡,也可以直接寫成完整路徑豪硅,如:

/Users/JackieQu/Desktop/Crawler/video/%s.mp4

五、完整代碼與演示

#!/usr/bin/env python
#coding:utf-8

import requests
import re
import urllib
import os

data = []
page = 1
def getData():
    global page
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    url = 'http://www.budejie.com/video/' + str(page)
    html = requests.get(url, headers = headers).text
    match_obj = re.compile(r'<div class="j-r-list-c">.*?</div>.*?</div>', re.S)
    results = re.findall(match_obj, html)
    for item in results:
        match_video = r'data-mp4="(.*?)">'
        video = re.findall(match_video, item)
        if video:
            match_title = re.compile(r'<a href="/detail-.{8}?.html">(.*?)</a>', re.S)
            title = re.findall(match_title, item)
            for i, j in zip(title, video):
                data.append([i, j])
    return data

num = 1
def saveData():
    global num
    while num <= 10:
        data = getData()
        for i in data:
            urllib.urlretrieve(i[1], './video/%s.mp4' %(i[0]))
            data.pop(0)
            num += 1

def initFile():
    dir = os.getcwd()
    list =  os.listdir(dir)
    flag = False
    for i in list:
        if i == 'video':
            flag = True
            break
    if flag == False:
        os.mkdir('video') 

initFile()
saveData()
效果演示

哦了挺物,要想爬取多頁數(shù)據(jù)懒浮,改改頁碼,遍歷一下即可。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砚著,一起剝皮案震驚了整個濱河市次伶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稽穆,老刑警劉巖冠王,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舌镶,居然都是意外死亡柱彻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門餐胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哟楷,“玉大人,你說我怎么就攤上這事否灾÷羯茫” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵墨技,是天一觀的道長惩阶。 經(jīng)常有香客問我,道長扣汪,這世上最難降的妖魔是什么断楷? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮私痹,結果婚禮上脐嫂,老公的妹妹穿的比我還像新娘。我一直安慰自己紊遵,他們只是感情好账千,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暗膜,像睡著了一般匀奏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上学搜,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天娃善,我揣著相機與錄音,去河邊找鬼瑞佩。 笑死聚磺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的炬丸。 我是一名探鬼主播瘫寝,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蜒蕾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焕阿?” 一聲冷哼從身側響起咪啡,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暮屡,沒想到半個月后撤摸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡褒纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年准夷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片外厂。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡冕象,死狀恐怖代承,靈堂內(nèi)的尸體忽然破棺而出汁蝶,到底是詐尸還是另有隱情,我是刑警寧澤论悴,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布掖棉,位于F島的核電站,受9級特大地震影響膀估,放射性物質(zhì)發(fā)生泄漏幔亥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一察纯、第九天 我趴在偏房一處隱蔽的房頂上張望帕棉。 院中可真熱鬧,春花似錦饼记、人聲如沸香伴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽即纲。三九已至,卻和暖如春博肋,著一層夾襖步出監(jiān)牢的瞬間低斋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工匪凡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膊畴,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓病游,卻偏偏與公主長得像唇跨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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