1. 程式人生 > >[Python爬蟲]爬蟲例項:爬取酷狗TOP500的資料

[Python爬蟲]爬蟲例項:爬取酷狗TOP500的資料

根據書籍《從零開始學Python網路爬蟲》P41,綜合案例2—爬取酷狗TOP500的資料修改而來.
使用模組requests和模組BeautifukSoup進行爬取.
不得不說,酷狗拿來跑爬蟲真是好,不ban不限制IP~

要爬取的頁面資訊

酷狗TOP500
在這裡插入圖片描述
需要爬取的資訊很少:1.排名 2.標題(歌名-歌手) 3.時長
每頁22條資訊,需要爬取500/22≈23頁
雖然沒有手動翻頁下一步瀏覽,但是隻要修改網頁:
http://www.kugou.com/yy/rank/home/1-8888.html?from=rank
http://www.kugou.com/yy/rank/home/2-8888.html?from=rank


就得到第二頁的資訊.
使用瀏覽器中審查元素功能,得到: 資訊對應的標籤屬性,使用soup.select()獲取標籤,再使用tag.get_text()獲取文字即可
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

程式碼實現

知道了要爬的標籤,寫起來就很輕鬆了,確定流程如下:
1.設定Headers的User-Agent偽裝瀏覽器訪問
2.獲取酷狗主站的編碼格式<meta charset=xxx>,並設定到request中res.encoding,對應的res.text就會重新編碼.這樣soup在使用lxml解析器時就不會出現亂碼了.
3.開啟檔案kugou_500.txt,設定為寫入方式,f.encoding=res.encoding

,統一編碼格式
4.對23個網頁中,每個網頁執行一次get_info()獲取資訊,然後按格式寫入到檔案kugou_500.txt中.
5.等待爬蟲結束,然後檢視爬取結果.

from bs4 import BeautifulSoup
import requests
import time
import re

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}


def get_info
(url, file): res = requests.get(url, headers=headers) res.encoding = file.encoding # 同樣讀取和寫入的編碼格式 soup = BeautifulSoup(res.text, 'lxml') ranks = soup.select('span.pc_temp_num') titles = soup.select('a.pc_temp_songname') times = soup.select('span.pc_temp_time') for rank, title, time in zip(ranks, titles, times): data = { 'rank': rank.get_text().strip(), 'title': title.get_text().strip(), 'time': time.get_text().strip() } string="{: <10}{: <30}{: <10}\n".format(data['rank'],data['title'],data['time'])#格式化輸出 file.write(string) def get_website_encoding(url): # 一般每個網站自己的網頁編碼都是一致的,所以只需要搜尋一次主頁確定 res = requests.get(url, headers=headers) charset = re.search("charset=(.*?)>", res.text) if charset is not None: blocked = ['\'', ' ', '\"', '/'] filter = [c for c in charset.group(1) if c not in blocked] return ''.join(filter) # 修改res編碼格式為源網頁的格式,防止出現亂碼 else: return res.encoding # 沒有找到編碼格式,返回res的預設編碼 if __name__ == '__main__': encoding = get_website_encoding('http://www.kugou.com') urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1, 23)] with open(r'd:\kugou_500.txt', 'w', encoding=encoding) as f: f.write("排名 歌手 歌名 長度\n") for url in urls: get_info(url, f) time.sleep(1) #緩衝一秒,防止請求頻率過快

資料展示

在這裡插入圖片描述

在這裡插入圖片描述

寫在後面

這裡只是展示一個基本的爬蟲例項作為練手,就不做改進了.
可改進如下:
1.儲存和顯示的格式可以更美觀
2.將標題分割為歌手和歌名
3.將資料存入資料庫,然後進行相關的數學分析和統計等…