Python爬蟲第五課:存儲數據

一、存儲數據的方式

同樣是存儲數據的文件,“csv”格式文件和Excel文件有什麼區別呢?

1. CSV文件

  • 我們知道json是特殊的字符串。其實,csv也是一種字符串文件的格式,它組織數據的語法就是在字符串之間加分隔符——行與行之間是加換行符,同列之間是加逗號分隔。
  • csv格式文件可以用任意的文本編輯器打開(如記事本),也可以用Excel打開,還可以通過Excel把文件另存爲csv格式(因爲Excel支持csv格式文件)。
  • csv文件裏的逗號充當分隔同列字符串的作用。分隔符使得數據的組織方式更有規律,這讓更容易讓我們提取和查找。

2. EXCEL文件

  • 它有專門的文件格式,即xls和xlsx(Excel2003版本的文件格式是xls,Excel2007及之後的版本的文件格式就是xlsx)。

3. CSV文件與EXCEL文件的比較

  • 用csv格式存儲數據,讀寫比較方便,易於實現,文件也會比Excel文件小。
  • Excel文件本身的功能更爲強大,比如能嵌入圖像和圖表,生成公式等。如何選擇就看具體的使用場景了。
    在這裏插入圖片描述

二、存儲數據的基礎知識

存儲成csv格式文件和存儲成Excel文件,這兩種不同的存儲方式需要引用的模塊也是不同的。操作csv文件我們需要藉助csv模塊;操作Excel文件則需要藉助openpyxl模塊。

1. CSV文件的讀寫

import csv

# 需要寫入的數據
score1 = ['math', 95]
score2 = ['english', 90]

# 打開文件,追加a, newline="",可以刪掉行與行之間的空格
file= open("score.csv", "a", newline="")

# 設定寫入模式
csv_write = csv.writer(file)

# 寫入具體內容
csv_write.writerow(score1)
csv_write.writerow(score2)
file.close()

  • 代碼file= open(“score.csv”, “a”, newline="")事實上就是創建了一個csv文件並打開它,等待寫入文件。
  • 代碼csv_write = csv.writer(file),創建了一個csvwrite對象。
  • 下面兩行代碼就用該對象的writerow方法寫入列表數據。
import csv

# 打開csv文件
file = open("score.csv")

# 讀取文件內容,構造csv.reader對象
reader = csv.reader(file)

# 打印reader中的內容
for item in reader:
    print(item)

第二行的代碼就是打開我們已有的csv文件,然後構造一個csv.reader對象,最後把reader中的內容輸出,讀取csv的工作也就完成了。

2. EXCEL文件的讀寫

安裝openpyxl庫

  • Windows系統:pip install openpyxl
    Macx系統:pip3 install openpyxl

EXCEL文件的寫入

import openpyxl
# 引用openpyxl
wb = openpyxl.Workbook()
# 利用openpyxl.Workbook()函數創建新的workbook(工作薄)對象,就是創建新的空的Excel文件。
sheet = wb.active
# wb.active就是獲取這個工作薄的活動表,通常就是第一個工作簿,也就是我們在上面的圖片中看到的sheet1。
sheet.title = 'test'
# 可以用.title給工作表重命名。現在第一個工作表的名稱就會由原來默認的“sheet1”改爲"kaikeba"。
sheet['A1'] = '天下第一'
# 向單個單元格寫入數據
score1 = ['math', 95]
sheet.append(score1)
# 寫入整行的數據,變量類型是一個列表
wb.save('score.xlsx')
# 保存修改的Excel
wb.close()
# 關閉Excel

示例代碼中我們是用到append方法向Excel寫入一行內容,要寫入多個內容只需添加一個循環即可。

EXCEL文件的讀取

import openpyxl
wb = openpyxl.load_workbook('score.xlsx')
# 打開的指定的工作簿
sheet = wb['天下第一']
# 指定讀取的工作表的名稱
A1_value = sheet['A1'].value
print(A1_value)
# 獲取A1的值

三、爬取並存儲周杰倫的歌曲信息

import requests
import openpyxl

# 創建workbook對象,建立工作簿
workbook = openpyxl.Workbook()
# 創建工作表
sheet = workbook.active
# 重命名工作表
sheet.title  = 'Jac_chou_songs'
# 插入表頭
sheet.append(['頁碼','歌名','歌曲ID','專輯名稱','播放時長','播放鏈接','歌詞'])

# 僞裝歌曲請求頭
headers = {'orgin': 'https://y.qq.com',
           'referer': 'https://y.qq.com/portal/search.htm',
           'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
           }
# 歌曲請求的網址
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
# 循環更新頁碼
for i in range(1,4):
    # 歌曲請求參數
    param_song = {'ct': '24',
                  'qqmusic_ver': '1298',
                  'new_json': '1',
                  'remoteplace': 'txt.yqq.song',
                  'searchid': '67279455817994118',
                  't': '0',
                  'aggr': '1',
                  'cr': '1',
                  'catZhida': '1',
                  'lossless': '0',
                  'flag_qc': '0',
                  'p': i,
                  'n': '10',
                  'w': '周杰倫',
                  'g_tk': '1987388883',
                  'loginUin': '1285575771',
                  'hostUin': '0',
                  'format': 'json',
                  'inCharset': 'utf8',
                  'outCharset': 'utf-8',
                  'notice': '0',
                  'platform': 'yqq.json',
                  'needNewCode': '0'}

    # 使用requests.get(),獲取返回的數據
    response = requests.get(url,params=param_song,headers=headers)
    # 使用json(),將字符串轉爲列表/字典
    js_music = response.json()
    # 層層展開字典,獲取歌曲列表
    list_musci = js_music['data']['song']['list']

    # 遍歷歌曲列表,獲取每首歌曲的信息
    for music in list_musci:
        # 歌名
        title = music['name']
        # 歌曲ID
        id = music['id']
        # 歌曲所屬專輯
        album = music['album']['name']
        # 歌曲播放時長
        time = music['interval']
        # 歌曲鏈接
        link = 'https://y.qq.com/n/yqq/song/'+music['mid']+'.html'

        # 僞裝歌詞請求頭
        headers_lyric = {'origin': 'https://y.qq.com',
                         'referer': 'https://y.qq.com/n/yqq/song/{}.html'.format(music['mid']),
                         'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
        }
        # 歌詞url
        url_lyric = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_yqq.fcg'
        # 歌詞請求參數
        param_lyric = {'nobase64': '1',
                       'musicid': id,
                       '-': 'jsonp1',
                       'g_tk': '1847098181',
                       'loginUin': '1285575771',
                       'hostUin': '0',
                       'format': 'json',
                       'inCharset': 'utf8',
                       'outCharset': 'utf-8',
                       'notice': '0',
                       'platform': 'yqq.json',
                       'needNewCode': '0'
                       }
        # 請求返回歌詞的數據
        response_lyric = requests.get(url_lyric,params=param_lyric,headers=headers)
        # 使用json()方法,轉換爲字典/列表
        js_lyric = response_lyric.json()
        # 展開字典,獲取歌詞
        lyric = js_lyric['lyric']
        # 將歌曲信息寫入excel文件中
        sheet.append([i,title,id,album,time,link,lyric])
        # 打印,以便發現問題
        print('頁碼:'+str(i))
        print('歌名:'+title)
        print('歌曲ID:'+str(id))
        print('專輯名:'+album)
        print('播放時長:'+str(time)+'秒')
        print('播放鏈接:'+link)
        print('歌詞:'+lyric)

# 保存excel文件,並命名爲Jay_chou_songs.xlsx
workbook.save('Jay_chou_songs.xlsx')
# 關閉文件
workbook.close()

四、總結

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

五、練習

  1. 爬取豆瓣TOP250的電影信息,並存入EXCEL文件中。
import requests
from bs4 import BeautifulSoup
import openpyxl

# 請求頭,避免反爬
headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'}
# 使用requests.get()獲取response對象,循環更新每頁的頁碼

# 創建xlsx工作簿
wb = openpyxl.Workbook()
# 創建工作表
sheet = wb.active
# 將工作表命名爲豆瓣電影250
sheet.title = '豆瓣電影TOP250'
# 添加工作表頭
sheet.append(['序號', '電影名稱', '網址URL', '導演/演員', '評價信息', '影片簡介'])

# 觀察豆瓣TOP250的影片的URL,規律爲每頁間隔25.
for i in range(10):
    reponse = requests.get(f'https://movie.douban.com/top250?start={i * 25}&filter=', headers=headers)
    # 將返回的字符串轉換爲bs對象
    bs_movie = BeautifulSoup(reponse.text, 'html.parser')
    # 通過find_all找到包含電影信息的列表
    list_movie = bs_movie.find_all('div', class_='item')
    # 循環遍歷列表,返回每個電影的信息
    for movie in list_movie:
        # 電影序號
        num = movie.find('em').text
        # 電影標題
        title = movie.find('div', class_='hd').find('a').text.replace(' ', '').replace('\n', '')
        # 電影網址URL
        url = movie.find('a')['href']
        # 電影導演與演員
        director = movie.find('p').text.replace(' ', '').replace('\n', '')
        # 電影評價信息
        rating = movie.find('div', class_='star').text.replace(' ', '').replace('\n', '/')
        # 電影簡介,因第248條沒有簡介信息返回,所以使用異常捕捉報錯
        try:
            info = movie.find('p', class_='quote').text.replace('\n', '')
        except:
            info = None
        # 將電影信息逐行寫入xlsx文件中
        sheet.append([num, title, url, director, rating, info])
        # 打印,以便發現問題
        print(num)
        print(title)
        print(director)
        print(rating)
        print(info)

# 保存文件爲"豆瓣點評TOP250.xlsx"
wb.save('豆瓣電影TOP250.xlsx')
# 關閉文件
wb.close()
  1. 爬取知乎張佳偉的前三頁文章,並存入CSV文件中。
import requests
import csv

# 創建csv文件,並命名爲"張佳偉.csv",以追加模式寫入
file = open('zhangjiawei.csv','a+',newline='')
file_writer = csv.writer(file)
# 寫入表頭
file_writer.writerow(['序號','文章標題','文章ID','點贊數','評論數','文章簡介','文章鏈接'])
# 僞裝請求頭
headers = {'referer': 'https://www.zhihu.com/people/zhang-jia-wei/posts',
           'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
           }
# 請求的url
url = 'https://www.zhihu.com/api/v4/members/zhang-jia-wei/articles'
x = 1
# 循環更改頁碼參數
for i in range(4):
    # 請求參數
    param = {
        'include': 'data[*].comment_count,suggest_edit,is_normal,thumbnail_extra_info,thumbnail,can_comment,comment_permission,admin_closed_comment,content,voteup_count,created,updated,upvoted_followees,voting,review_info,is_labeled,label_info;data[*].author.badge[?(type=best_answerer)].topics',
        'offset': str(i*20),
        'limit': 20,
        'sort_by': 'created'
        }

    # requests.get()返回數據
    response = requests.get(url,params=param,headers=headers)
    # 使用json(),將字符串轉換爲字典/列表
    js_response = response.json()
    # 展開字典,獲取文章列表
    list_article = js_response['data']

    # 遍歷列表,獲取文章信息
    for article in list_article:
        # 文章標題
        title = article['title']
        # 文章簡介
        content = article['excerpt']
        # 文章ID
        id = article['id']
        # 文章點贊數
        voteup = article['voteup_count']
        # 文章評論數
        comment = article['comment_count']
        # 文章URL
        url_article = 'https://zhuanlan.zhihu.com/p/{}.html'.format(id)
        # 將文章信息寫入csv中
        file_writer.writerow([x,title,id,voteup,comment,url_article])
        # 打印文章信息,以便發現問題
        print(x)
        print(title)
        print(id)
        print(voteup)
        print(comment)
        print(url_article)
        print()
        x = x + 1

# 關閉文件
file.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章