1. 程式人生 > 實用技巧 >Python爬蟲:你真的會看部落格???看看這篇文章快速獲取你想要的東西

Python爬蟲:你真的會看部落格???看看這篇文章快速獲取你想要的東西

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

本品文章來自騰訊雲 作者:孤獨的明月

python手把手叫你分析CSDN個人部落格資料

獲取個人的全部部落格標題及連結,釋出時間、瀏覽量、以及收藏量等資料資訊,按訪問量排序,整理成一份Excel表儲存。
使用時,輸入個人部落格ID即可,從資料獲取到解析儲存,用到requests、BeautifulSoup、pandas等三方庫,一個完整的Python爬蟲實踐。


網頁分析

部落格列表分析

通過分析我的部落格列表網頁程式碼,提取出每篇文章的連結。
我的部落格列表url為:https://blog.csdn.net/xiaoma_2018/article/list/1?t=1
注意每個人的部落格ID會不同,因此本爬蟲使用時要求輸入個人的部落格ID及頁碼數,以達到通用的功能。

單篇部落格分析

通過分析單篇部落格的網頁原始碼,從其中獲取文章連結、文章標題、釋出時間、瀏覽量、以及收藏量等資料資訊。

環境配置

本爬蟲程式,執行環境說明 PyCharm 2020.1.1、Python 3.7.5
使用到的第三方依賴庫如下:
執行:pip freeze > requirements.txt 匯出

beautifulsoup4==4.9.1
pandas==1.1.1
requests==2.24.0

程式碼實現

程式碼主要思路是:

  • 要求輸入部落格ID和頁面數
  • 爬取全部部落格連結
  • 爬取每一篇部落格的資料資訊
  • 資料儲存

config 配置

為了方便爬取不同的部落格ID網頁,單獨寫了入一個配置檔案來定義爬蟲用到的引數及檔案路徑引數,config.py 檔案如下:

'''
@Func 爬蟲程式用到的請求頭資訊及檔案路徑資訊
@File config.py
'''
Host = "blog.csdn.net" # 請求頭host引數
User_Agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
Source 
= 'html.txt' # 臨時儲存部落格列表html原始碼 EachSource = 'each.txt' # 臨時儲存每篇部落格html原始碼 OUTPUT = "部落格資訊.csv" # 輸出部落格資訊到 csv 檔案

其中,User_Agent必須根據自己的瀏覽器引數配置才能使用,其他引數可預設該配置。

run 程式碼

'''
@Func Python爬蟲CSDN部落格文章資料,並寫入excel表中
      使用 re 模組正則匹配要獲取的 url地址
'''
import requests
from bs4 import BeautifulSoup
import pandas as pd
import os
import re
from config import Host, User_Agent, Source, EachSource,OUTPUT

results = [] # 儲存全部資料

def parseEachBlog(link):
    referer = "Referer: " + link
    headers = {"Referer": referer, "User-Agent": User_Agent}
    r = requests.post(link, headers=headers)
    html = r.text
    with open(EachSource, 'w', encoding='UTF-8') as f:
        f.write(html)
    soup = BeautifulSoup(open(EachSource, 'r', encoding='UTF-8'), features="html.parser")
    readcontent = soup.select('.bar-content .read-count')
    collection = soup.select('.bar-content .get-collection')
    readcounts = re.sub(r'\D', "", str(readcontent[0]))
    collections = re.sub(r'\D', "", str(collection[0]))
    blogname = soup.select('.title-article')[0].text
    time = soup.select('.bar-content .time')[0].text
    eachBlog = [blogname, link, readcounts, collections, time]
    return eachBlog

def getBlogList(blogID, pages):
    listhome = "https://" + Host + "/" + blogID + "/article/list/"
    pagenums = [] # 轉換後的pages頁數
    for i in range(1, int(pages)+1):
        pagenums.append(str(i))

    for number in pagenums:
        url = listhome + number + "?t=1"
        headers = {"Referer": url, "Host": Host, "User-Agent": User_Agent}
        response = requests.post(url, headers=headers)
        html = response.text
        with open(Source, 'a', encoding='UTF-8') as f:
            f.write(html)
    # 獲取全部部落格的連結
    soup = BeautifulSoup(open(Source, 'r', encoding='UTF-8'), features="html.parser")
    hrefs = []
    re_patterm = "^https://blog.csdn.net/" + blogID + "/article/details/\d+$"
    for a in soup.find_all('a', href=True):
        if a.get_text(strip=True):
            href = a['href']
            if re.match(re_patterm, href):
                if hrefs.count(href) == 0:
                    hrefs.append(href)
    return hrefs

def parseData():
    results.sort(key=lambda result:int(result[2]), reverse=True) # 按瀏覽量排序
    dataframe = pd.DataFrame(data=results)
    dataframe.columns = ['文章標題', '文章連結', '瀏覽量', '收藏量', '釋出時間']
    dataframe.to_csv(OUTPUT, index=False, sep=',')

def delTempFile():
    if os.path.exists(Source):
        os.remove(Source)
    if os.path.exists(EachSource):
        os.remove(EachSource)

if __name__ == '__main__':
    blogID = input("輸入你要爬去的部落格名: ")
    pages = input("輸入部落格列表頁數: ")
    print("獲取全部部落格連結...")
    linklist = getBlogList(blogID, pages)
    print("開始獲取資料...")
    for i in linklist:
        print("當前獲取: %s"%(i))
        results.append(parseEachBlog(i))
    print("結束獲取資料...")
    # 開始解析並存儲 .csv 檔案
    print("開始解析並存儲資料...")
    parseData()
    print("刪除臨時檔案...")
    delTempFile()

執行過程

以我自己的部落格ID為例,來展示一下執行的過程及結果,我的部落格列表目前兩頁。
開始執行

結束執行