1. 程式人生 > >python使用requests爬取資料(酷狗hot500案例)(講解細緻)

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.  程式碼分析:


     
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sat Feb 24 21:00:31 2018
  4. @author: piqia
  5. """
  6. # 匯入時間模組 可以呼叫sleep方法,避免頻繁地爬去資訊而被遮蔽
  7. import time
  8. #使用requests庫獲取爬取的頁面
  9. import requests
  10. #從bs4中匯入BeautifulSoup,用於解析html頁面
  11. from bs4 import BeautifulSoup
  12. #這是使用mysql資料庫,將爬取的資料寫到mysql資料中
  13. import pymysql
  14. #初始化連線物件、執行物件
  15. connection= None
  16. cursor= None
  17. #設定訪問的頭,偽裝瀏覽器,註釋1
  18. headers={
  19. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0'
  20. }
  21. #爬取的函式,獲取酷狗音樂TOP500的資訊,引數為一個連線地址,一個數據操作物件
  22. def get_info(url,mysqlHelper):
  23. #使用requests獲取,並設定headers引數
  24. wb_data=requests.get(url, params=headers)
  25. #對爬取到的資料使用text獲取,進行解析
  26. soup = BeautifulSoup(wb_data.text, 'lxml')
  27. # 獲取排名
  28. ranks = soup.select( '.pc_temp_num')
  29. # 獲取歌名和歌手
  30. titles = soup.select( '.pc_temp_songname')
  31. # 歌曲時長list
  32. song_times = soup.select( '.pc_temp_time')
  33. #排名,歌名。歌手,時間都是一一對應的列表格式,用for迴圈進行遍歷,寫入data字典中,可寫入mongodb,也可寫到mysql,這是寫到mysql中
  34. for rank,title,song_time in zip(ranks,titles,song_times):
  35. data={
  36. 'rank': rank.get_text().strip(), #獲取標籤的中的內容,並把附近的空格、換行刪除
  37. 'singer':title.get_text().split( '-')[ 0].strip(), #將字串切割出一個列表獲取第一個
  38. 'song':title.get_text().split( '-')[ 1].strip(), #將字串切割出一個列表獲取第二個
  39. 'time':song_time.get_text().strip() #獲取時間值
  40. }
  41. #根據獲取的資料,寫出插入資料
  42. sql= '''insert into songs values("{0}","{1}","{2}","{3}")'''.format(data[ 'rank'],data[ 'singer'],data[ 'song'],data[ 'time'])
  43. #列印驗證
  44. print(sql)
  45. print( "-"* 20)
  46. #呼叫物件這的方法寫入方法
  47. mysqlHelper.insert(sql)
  48. #建立一個數據庫操作物件
  49. class mysqlHelper():
  50. #初始化,類似於java中的資料的定義
  51. def __init__(self):
  52. self.connection= None
  53. self.cursor= None
  54. #關閉資料方法
  55. def close(self):
  56. if self.cursor:
  57. self.cursor.close()
  58. if self.connection:
  59. self.connection.close()
  60. #操作mysql語句
  61. def insert(self,sql):
  62. #使用try except,處理異常
  63. try:
  64. #使出pymysql獲取mysql資料庫連線
  65. self.connection=pymysql.connect(host= 'localhost',user= 'root',passwd= 'root',db= 'myproject',charset= 'utf8')
  66. #獲取資料操作物件
  67. self.cursor=self.connection.cursor()
  68. #執行sql語句
  69. self.cursor.execute(sql)
  70. #事務提交
  71. self.connection.commit()
  72. except Exception as ex:
  73. #異常資料回滾,不進行mysql資料的執行
  74. self.connection.rollback()
  75. #列印異常資訊
  76. print(ex)
  77. finally:
  78. #關閉資源
  79. self.close()
  80. #如果直接使用本檔案就執行
  81. if __name__== '__main__':
  82. #初始化資料庫
  83. sql0= "DROP TABLE IF EXISTS `songs`"
  84. sql1 = "CREATE TABLE `songs` (`rank` varchar(5),`songer` varchar(100),`song` varchar(50),`time` varchar(10))ENGINE=InnoDB DEFAULT CHARSET=utf8;"
  85. #建立物件
  86. mysqlHelper=mysqlHelper()
  87. #清空資料庫中songs的表格
  88. mysqlHelper.insert(sql0)
  89. #建立表格,經過測試,不可以同時執行這兩條語句
  90. mysqlHelper.insert(sql1)
  91. #生成要遍歷成的url,使用列表生成器的方式
  92. urls=[ 'http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range( 1, 24)]
  93. for url in urls:
  94. #呼叫get_info方法進行爬取
  95. get_info(url,mysqlHelper)
  96. #推遲1s
  97. 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.  程式碼分析:


  
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sat Feb 24 21:00:31 2018
  4. @author: piqia
  5. """
  6. # 匯入時間模組 可以呼叫sleep方法,避免頻繁地爬去資訊而被遮蔽
  7. import time
  8. #使用requests庫獲取爬取的頁面
  9. import requests
  10. #從bs4中匯入BeautifulSoup,用於解析html頁面
  11. from bs4 import BeautifulSoup
  12. #這是使用mysql資料庫,將爬取的資料寫到mysql資料中
  13. import pymysql
  14. #初始化連線物件、執行物件
  15. connection= None
  16. cursor= None
  17. #設定訪問的頭,偽裝瀏覽器,註釋1
  18. headers={
  19. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0'
  20. }
  21. #爬取的函式,獲取酷狗音樂TOP500的資訊,引數為一個連線地址,一個數據操作物件
  22. def get_info(url,mysqlHelper):
  23. #使用requests獲取,並設定headers引數
  24. wb_data=requests.get(url, params=headers)
  25. #對爬取到的資料使用text獲取,進行解析
  26. soup = BeautifulSoup(wb_data.text, 'lxml')
  27. # 獲取排名
  28. ranks = soup.select( '.pc_temp_num')
  29. # 獲取歌名和歌手
  30. titles = soup.select( '.pc_temp_songname')
  31. # 歌曲時長list
  32. song_times = soup.select( '.pc_temp_time')
  33. #排名,歌名。歌手,時間都是一一對應的列表格式,用for迴圈進行遍歷,寫入data字典中,可寫入mongodb,也可寫到mysql,這是寫到mysql中
  34. for rank,title,song_time in zip(ranks,titles,song_times):
  35. data={
  36. 'rank': rank.get_text().strip(), #獲取標籤的中的內容,並把附近的空格、換行刪除
  37. 'singer':title.get_text().split( '-')[ 0].strip(), #將字串切割出一個列表獲取第一個
  38. 'song':title.get_text().split( '-')[ 1].strip(), #將字串切割出一個列表獲取第二個
  39. 'time':song_time.get_text().strip() #獲取時間值
  40. }
  41. #根據獲取的資料,寫出插入資料
  42. sql= '''insert into songs values("{0}","{1}","{2}","{3}")'''.format(data[ 'rank'],data[ 'singer'],data[ 'song'],data[ 'time'])
  43. #列印驗證
  44. print(sql)
  45. print( "-"* 20)
  46. #呼叫物件這的方法寫入方法
  47. mysqlHelper.insert(sql)
  48. #建立一個數據庫操作物件
  49. class mysqlHelper():
  50. #初始化,類似於java中的資料的定義
  51. def __init__(self):
  52. self.connection= None
  53. self.cursor= None
  54. #關閉資料方法
  55. def close(self):
  56. if self.cursor:
  57. self.cursor.close()
  58. if self.connection:
  59. self.connection.close()
  60. #操作mysql語句
  61. def insert(self,sql):
  62. #使用try except,處理異常
  63. try:
  64. #使出pymysql獲取mysql資料庫連線
  65. self.connection=pymysql.connect(host= 'localhost',user= 'root',passwd= 'root',db= 'myproject',charset= 'utf8')
  66. #獲取資料操作物件
  67. self.cursor=self.connection.cursor()
  68. #執行sql語句
  69. self.cursor.execute(sql)
  70. #事務提交
  71. self.connection.commit()
  72. except Exception as ex:
  73. #異常資料回滾,不進行mysql資料的執行
  74. self.connection.rollback()
  75. #列印異常資訊
  76. print(ex)
  77. finally:
  78. #關閉資源
  79. self.close()
  80. #如果直接使用本檔案就執行
  81. if __name__== '__main__':
  82. #初始化資料庫
  83. sql0= "DROP TABLE IF EXISTS `songs`"
  84. sql1 = "CREATE TABLE `songs` (`rank` varchar(5),`songer` varchar(100),`song` varchar(50),`time` varchar(10))ENGINE=InnoDB DEFAULT CHARSET=utf8;"
  85. #建立物件
  86. mysqlHelper=mysqlHelper()
  87. #清空資料庫中songs的表格
  88. mysqlHelper.insert(sql0)
  89. #建立表格,經過測試,不可以同時執行這兩條語句
  90. mysqlHelper.insert(sql1)
  91. #生成要遍歷成的url,使用列表生成器的方式
  92. urls=[ 'http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range( 1, 24)]
  93. for url in urls:
  94. #呼叫get_info方法進行爬取
  95. get_info(url,mysqlHelper)
  96. #推遲1s
  97. time.sleep( 1)

4.  執行結果