[Python爬蟲]爬蟲例項:爬取酷狗TOP500的資料
阿新 • • 發佈:2018-11-16
根據書籍《從零開始學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.將資料存入資料庫,然後進行相關的數學分析和統計等…