python使用requests爬取資料(酷狗hot500案例)(講解細緻)
關於使用requests爬取酷狗hot500的案例
1. 案例環境:
python版本:python3.x;
IDE:anaconda-spider;(已安裝好需要的requests,bs4庫等)
資料庫:mysql.5.7
工具包:pymsql(安裝將補充)、requests,beautifulsoup
2. 思路分析:
2.1 確定待爬取的url:
http://www.kugou.com/yy/rank/home/1-8888.html?from=homepage
說明:其頁數的變化是修改1-8888中的1,即第n頁為n-8888
使用火狐瀏覽器檢視網頁的程式碼:ctrl+shift+i,先點選如圖紅框中按鈕,再在網頁上點選需要檢視內容就會定位到對應的程式碼,如圖1:
圖1
2.2 確定爬取的資料
確定爬取的歌曲排名的標籤class類名:pc_temp_songnum,如圖2:
圖2
確定爬取的歌曲名稱和歌手的標籤class類名:pc_temp_songname,如圖3:
圖3
確定爬取的歌曲時間的標籤class類名:pc_temp_time;如圖4:
圖4
3. 程式碼分析:
-
# -*- coding: utf-8 -*-
-
"""
-
Created on Sat Feb 24 21:00:31 2018
-
@author: piqia
-
"""
-
# 匯入時間模組 可以呼叫sleep方法,避免頻繁地爬去資訊而被遮蔽
-
import time
-
#使用requests庫獲取爬取的頁面
-
import requests
-
#從bs4中匯入BeautifulSoup,用於解析html頁面
-
from bs4
import BeautifulSoup
-
#這是使用mysql資料庫,將爬取的資料寫到mysql資料中
-
import pymysql
-
#初始化連線物件、執行物件
-
connection=
None
-
cursor=
None
-
#設定訪問的頭,偽裝瀏覽器,註釋1
-
headers={
-
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0'
-
}
-
#爬取的函式,獲取酷狗音樂TOP500的資訊,引數為一個連線地址,一個數據操作物件
-
def get_info(url,mysqlHelper):
-
#使用requests獲取,並設定headers引數
-
wb_data=requests.get(url, params=headers)
-
#對爬取到的資料使用text獲取,進行解析
-
soup = BeautifulSoup(wb_data.text,
'lxml')
-
# 獲取排名
-
ranks = soup.select(
'.pc_temp_num')
-
# 獲取歌名和歌手
-
titles = soup.select(
'.pc_temp_songname')
-
# 歌曲時長list
-
song_times = soup.select(
'.pc_temp_time')
-
#排名,歌名。歌手,時間都是一一對應的列表格式,用for迴圈進行遍歷,寫入data字典中,可寫入mongodb,也可寫到mysql,這是寫到mysql中
-
for rank,title,song_time
in zip(ranks,titles,song_times):
-
data={
-
'rank': rank.get_text().strip(),
#獲取標籤的中的內容,並把附近的空格、換行刪除
-
'singer':title.get_text().split(
'-')[
0].strip(),
#將字串切割出一個列表獲取第一個
-
'song':title.get_text().split(
'-')[
1].strip(),
#將字串切割出一個列表獲取第二個
-
'time':song_time.get_text().strip()
#獲取時間值
-
}
-
#根據獲取的資料,寫出插入資料
-
sql=
'''insert into songs values("{0}","{1}","{2}","{3}")'''.format(data[
'rank'],data[
'singer'],data[
'song'],data[
'time'])
-
#列印驗證
-
print(sql)
-
print(
"-"*
20)
-
#呼叫物件這的方法寫入方法
-
mysqlHelper.insert(sql)
-
#建立一個數據庫操作物件
-
class mysqlHelper():
-
#初始化,類似於java中的資料的定義
-
def __init__(self):
-
self.connection=
None
-
self.cursor=
None
-
#關閉資料方法
-
def close(self):
-
if self.cursor:
-
self.cursor.close()
-
if self.connection:
-
self.connection.close()
-
#操作mysql語句
-
def insert(self,sql):
-
#使用try except,處理異常
-
try:
-
#使出pymysql獲取mysql資料庫連線
-
self.connection=pymysql.connect(host=
'localhost',user=
'root',passwd=
'root',db=
'myproject',charset=
'utf8')
-
#獲取資料操作物件
-
self.cursor=self.connection.cursor()
-
#執行sql語句
-
self.cursor.execute(sql)
-
#事務提交
-
self.connection.commit()
-
except Exception
as ex:
-
#異常資料回滾,不進行mysql資料的執行
-
self.connection.rollback()
-
#列印異常資訊
-
print(ex)
-
finally:
-
#關閉資源
-
self.close()
-
#如果直接使用本檔案就執行
-
if __name__==
'__main__':
-
#初始化資料庫
-
sql0=
"DROP TABLE IF EXISTS `songs`"
-
sql1 =
"CREATE TABLE `songs` (`rank` varchar(5),`songer` varchar(100),`song` varchar(50),`time` varchar(10))ENGINE=InnoDB DEFAULT CHARSET=utf8;"
-
#建立物件
-
mysqlHelper=mysqlHelper()
-
#清空資料庫中songs的表格
-
mysqlHelper.insert(sql0)
-
#建立表格,經過測試,不可以同時執行這兩條語句
-
mysqlHelper.insert(sql1)
-
#生成要遍歷成的url,使用列表生成器的方式
-
urls=[
'http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i))
for i
in range(
1,
24)]
-
for url
in urls:
-
#呼叫get_info方法進行爬取
-
get_info(url,mysqlHelper)
-
#推遲1s
-
time.sleep(
1)
4. 執行結果
如圖5為spider執行結果片段,圖6是將爬取的資料寫到資料的結果。
圖5
圖6
5. 補充
5.1 Headers的獲取
開啟火狐-->crtl+shift+i-->網路(圖7)-->訊息頭(圖8)即可找到。
圖7
圖8
5.2 注意
由於歌曲名,歌手長度不定在建立資料庫的時候要考慮各個列的長度。
5.3 pymysql工具包的安裝
方式比較多,這裡我使用anaconda中便捷的安裝方式:開啟anaconda --> envirments(圖9)選擇All-->搜尋pymysql(圖10)安裝即可。
圖9
圖10
閱讀更多關於使用requests爬取酷狗hot500的案例
1. 案例環境:
python版本:python3.x;
IDE:anaconda-spider;(已安裝好需要的requests,bs4庫等)
資料庫:mysql.5.7
工具包:pymsql(安裝將補充)、requests,beautifulsoup
2. 思路分析:
2.1 確定待爬取的url:
http://www.kugou.com/yy/rank/home/1-8888.html?from=homepage
說明:其頁數的變化是修改1-8888中的1,即第n頁為n-8888
使用火狐瀏覽器檢視網頁的程式碼:ctrl+shift+i,先點選如圖紅框中按鈕,再在網頁上點選需要檢視內容就會定位到對應的程式碼,如圖1:
圖1
2.2 確定爬取的資料
確定爬取的歌曲排名的標籤class類名:pc_temp_songnum,如圖2:
圖2
確定爬取的歌曲名稱和歌手的標籤class類名:pc_temp_songname,如圖3:
圖3
確定爬取的歌曲時間的標籤class類名:pc_temp_time;如圖4:
圖4
3. 程式碼分析:
-
# -*- coding: utf-8 -*-
-
"""
-
Created on Sat Feb 24 21:00:31 2018
-
@author: piqia
-
"""
-
# 匯入時間模組 可以呼叫sleep方法,避免頻繁地爬去資訊而被遮蔽
-
import time
-
#使用requests庫獲取爬取的頁面
-
import requests
-
#從bs4中匯入BeautifulSoup,用於解析html頁面
-
from bs4
import BeautifulSoup
-
#這是使用mysql資料庫,將爬取的資料寫到mysql資料中
-
import pymysql
-
#初始化連線物件、執行物件
-
connection=
None
-
cursor=
None
-
#設定訪問的頭,偽裝瀏覽器,註釋1
-
headers={
-
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0'
-
}
-
#爬取的函式,獲取酷狗音樂TOP500的資訊,引數為一個連線地址,一個數據操作物件
-
def get_info(url,mysqlHelper):
-
#使用requests獲取,並設定headers引數
-
wb_data=requests.get(url, params=headers)
-
#對爬取到的資料使用text獲取,進行解析
-
soup = BeautifulSoup(wb_data.text,
'lxml')
-
# 獲取排名
-
ranks = soup.select(
'.pc_temp_num')
-
# 獲取歌名和歌手
-
titles = soup.select(
'.pc_temp_songname')
-
# 歌曲時長list
-
song_times = soup.select(
'.pc_temp_time')
-
#排名,歌名。歌手,時間都是一一對應的列表格式,用for迴圈進行遍歷,寫入data字典中,可寫入mongodb,也可寫到mysql,這是寫到mysql中
-
for rank,title,song_time
in zip(ranks,titles,song_times):
-
data={
-
'rank': rank.get_text().strip(),
#獲取標籤的中的內容,並把附近的空格、換行刪除
-
'singer':title.get_text().split(
'-')[
0].strip(),
#將字串切割出一個列表獲取第一個
-
'song':title.get_text().split(
'-')[
1].strip(),
#將字串切割出一個列表獲取第二個
-
'time':song_time.get_text().strip()
#獲取時間值
-
}
-
#根據獲取的資料,寫出插入資料
-
sql=
'''insert into songs values("{0}","{1}","{2}","{3}")'''.format(data[
'rank'],data[
'singer'],data[
'song'],data[
'time'])
-
#列印驗證
-
print(sql)
-
print(
"-"*
20)
-
#呼叫物件這的方法寫入方法
-
mysqlHelper.insert(sql)
-
#建立一個數據庫操作物件
-
class mysqlHelper():
-
#初始化,類似於java中的資料的定義
-
def __init__(self):
-
self.connection=
None
-
self.cursor=
None
-
#關閉資料方法
-
def close(self):
-
if self.cursor:
-
self.cursor.close()
-
if self.connection:
-
self.connection.close()
-
#操作mysql語句
-
def insert(self,sql):
-
#使用try except,處理異常
-
try:
-
#使出pymysql獲取mysql資料庫連線
-
self.connection=pymysql.connect(host=
'localhost',user=
'root',passwd=
'root',db=
'myproject',charset=
'utf8')
-
#獲取資料操作物件
-
self.cursor=self.connection.cursor()
-
#執行sql語句
-
self.cursor.execute(sql)
-
#事務提交
-
self.connection.commit()
-
except Exception
as ex:
-
#異常資料回滾,不進行mysql資料的執行
-
self.connection.rollback()
-
#列印異常資訊
-
print(ex)
-
finally:
-
#關閉資源
-
self.close()
-
#如果直接使用本檔案就執行
-
if __name__==
'__main__':
-
#初始化資料庫
-
sql0=
"DROP TABLE IF EXISTS `songs`"
-
sql1 =
"CREATE TABLE `songs` (`rank` varchar(5),`songer` varchar(100),`song` varchar(50),`time` varchar(10))ENGINE=InnoDB DEFAULT CHARSET=utf8;"
-
#建立物件
-
mysqlHelper=mysqlHelper()
-
#清空資料庫中songs的表格
-
mysqlHelper.insert(sql0)
-
#建立表格,經過測試,不可以同時執行這兩條語句
-
mysqlHelper.insert(sql1)
-
#生成要遍歷成的url,使用列表生成器的方式
-
urls=[
'http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i))
for i
in range(
1,
24)]
-
for url
in urls:
-
#呼叫get_info方法進行爬取
-
get_info(url,mysqlHelper)
-
#推遲1s
-
time.sleep(
1)
4. 執行結果