好久沒寫東西了榜配,開始是因為準備畢設否纬,畢業(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ù)懒浮,改改頁碼,遍歷一下即可。