網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱爲網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。(來自百度百科)
網絡爬蟲按照系統結構和實現技術,大致可以分爲以下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。 實際的網絡爬蟲系統通常是幾種爬蟲技術相結合實現的。
下面我們的實例是根據聚焦網絡爬蟲技術:
前段時間,有人給我推薦一本書有關時間管理的,聽的時候,我也順手把他爬下來。
1、使用的python編程語言:python3.6
所使用的庫:requests,json,os
其中requests爲第三方庫,需要下載安裝(安裝步驟略)pip install requests
2、確定搜索的網址和內容
2.1 打開瀏覽器,在喜馬拉雅音頻官網找到時間管理100講
2.2 打開開發者工具或按F12,打開network查看請求信息
2.3 然後點擊【播放全部】會出現新的請求
2.3 分析數據
User-Agent:
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36
Request URL1:
https://www.ximalaya.com/revision/play/album?albumId=4264862&pageNum=1&sort=-1&pageSize=30
我們可以發現這裏是請求的獲取音頻的列表,打開Respose欄可以看到:一個json樣式的返回結果
{"ret":200,"msg":"聲音播放數據","data"....
下面的wKgJJVe7B6fBZr00ABqiOS5YkyA154是獲取音頻:
Request URL2:
http://audio.xmcdn.com/group18/M06/AE/D7/wKgJJVe7B6fBZr00ABqiOS5YkyA154.m4a
2.4 下面我們就從Request URL1中的response中獲取類似Request URL2的url和對應的名稱
在Preview中點開
albumId:4264862 --書的id
albumName:"葉武濱說時間管理" -- 書名
src:"http://audio.xmcdn.com/group18/M06/AE/D7/wKgJJVe7B6fBZr00ABqiOS5YkyA154.m4a" --音頻url
trackName:"01【緣起】葉武濱說時間管理" --音頻的名稱
3.代碼實現
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import json
import os
class ShiJianGuanLi(object):
def __init__(self, book_name="", book_id=None):
if book_id is None:
print("book_id不能爲空")
return
#模擬瀏覽器 瀏覽器的登陸模式
self.headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36",
}
self.bookid = book_id
self.start_url = "https://www.ximalaya.com/revision/play/album?albumId=%s&pageNum={}&sort=-1&pageSize=30" % self.bookid
self.book_name = book_name
self.book_url = []
#獲取頁數 頁面有8頁 其實100講 每頁30 獲取四頁就足夠了
for i in range(8):
url = self.start_url.format(i+1)
self.book_url.append(url)
def get_book_msg(self):
"""獲取書的音頻和名稱"""
#存放所有書名和地址
all_list = []
# 打印請求的地址頁數
print(self.book_url)
#獲取相應的頁面數據
for url in self.book_url:
r = requests.get(url, headers = self.headers)
py_dict = json.loads(r.content.decode())
# print(py_dict)
#獲取首頁的數據信息
book_list = py_dict['data']['tracksAudioPlay']
# 打印字典的key values 值
# self.printDict(book_list)
for book in book_list:
#獲取每段音頻的名稱和地址
list ={}
list['name'] = book['trackName']
list['bookname'] = book['albumName']
list['src'] = book['src']
#打印list
# print(list)
all_list.append(list)
# 打印list
# print(all_list)
return all_list
def save(self, all_list):
"""保存音頻"""
for i in all_list:#i實際就是每個音頻的名字和url
#喜馬拉雅/{}.m4a 通過format() 把() 裏的數據替換{} 中
#print(i)
#書名自定義
if not self.book_name:
self.book_name = i['bookname']
dir = "喜馬拉雅/{}/".format(self.book_name)
#檢查是否有相應的文件夾並創建目錄
if not os.path.exists(dir):
print("創建書名目錄:.%s"%dir)
os.makedirs(dir)
#os中“?”會報錯將其換爲""
i['name'] = i['name'].replace("?","").replace('"',"")
#在目錄下創建一個喜馬拉雅的文件夾
with open(r'{}/{}.m4a'.format(dir, i['name']),'ab')as f:
r = requests.get(i['src'], headers = self.headers)
print("正在下載:{}...".format(i['name']),end="")
f.write(r.content)
print("\t下載完成!")
def run(self):
#獲取所有的音頻名稱和地址
all_list = self.get_book_msg()
self.save(all_list)
def printDict(self,dict):
#輔助工具,用於打印節點模塊
if type(dict) is dict:
# 打印字典的key values 值
for key, value in dict.items():
print(key, ":", value)
elif type(dict) is list:
for d in dict:
for key, value in d.items():
print(key, ":", value)
if __name__=='__main__':
sjgl = ShiJianGuanLi("時間管理","4264862")
sjgl.run()
4、運行後需要等待一段時間。可以查看運行目錄進行查看下載進度。