python——關於簡單爬取博客園班級成員發的博文的題目、發布人、閱讀、評論,再存到csv文件中


因為老師要以班里每個人發的博客質量作為最后總成績的評定的一部分,就要把班上所有同學發的博客都統計起來,可以用來評定的因素有:閱讀、評論、推薦等,但因為今天只是做一個簡單的爬取,推薦這個元素在班級博客中需要點開每一篇博文才能看到獲取,就不爬取了,只爬取閱讀和推薦,加上每篇博文的發布人和標題。

我先會放上代碼,再逐條解釋其含義及作用。

代碼如下(其中爬取的網頁是以我自己的班級為例):

 1 from bs4 import BeautifulSoup
 2 import pandas as pd
 3 import requests
 4 import csv,time
 5 
 6 def get_url(n):
 7     urls=[]
 8     for i in range(1,n+1):
 9         urls.append("https://edu.cnblogs.com/campus/hbsfxy/DayDayUp?page=%s" %i)
10     return urls
11 
12 def parse_HTML(url):
13     req = requests.get(url)
14     req.encoding = req.apparent_encoding
15     soup = BeautifulSoup(req.text, 'lxml')
16     data=[]
17     li_list = soup.find_all('li',class_="am-g am-list-item-desced am-list-item-thumbed am-list-item-thumb-bottom-right")    
18     for li in li_list:
19         if len(li.find("div",class_="am-text-sm").get_text())>0:
20             print("ok")
21             dic={}
22             dic["博客提目"]=li.find("a",target="_blank").get_text()
23             dic["發布人"]=li.find("a",title="發布人").get_text().replace(" ","").replace("\n","")
24             dic["評論"]=li.find("span",title="評論").get_text().replace("\ue606","").replace(" ","")
25             dic["閱讀"]=li.find("span",title="閱讀").get_text().replace("\ue641","").replace(" ","")
26             data.append(dic)
27             time.sleep(1)
28     return data
29 
30 def get_alldata(n):
31     alldata=[]
32     for url in get_url(n):
33         alldata.extend(parse_HTML(url)) 
34     return alldata
35 
36 
37 if __name__ == "__main__":
38     
39     dp=pd.DataFrame(get_alldata(11))
40     dp.to_csv("博客data.csv",encoding='utf_8_sig')

開頭是將要用到的庫文件導入。

from bs4 import BeautifulSoup
import pandas as pd
import requests
import csv,time

 

這段代碼是定義了一個函數,將要遍歷的網址儲存在一個列表里,因為班級博客不止一頁,有很多頁,每一頁都有一個網址,但這些網址都是有規律的,可以鼠標右擊頁面,點擊檢查,再右邊出來的審查元素框上方,點擊這個 ,然后放到網面頁數那 ,在審查元素框內就會出現相應的每頁網址的對應代碼,如下圖:

從網頁中可以看出每頁的網址只有后面的page=的數不一樣

def get_url(n):
    urls=[]
    for i in range(1,n+1):
        urls.append("https://edu.cnblogs.com/campus/hbsfxy/DayDayUp?page=%s" %i)
    return urls

這句最后page=%s 的意思是每次循環用i的值來替換%s的位置,因為range(1,n)的意思是從1到n-1,所以我們要遍歷到所有頁就要n+1,這樣就可以將所有要爬取的頁面地址存到我們定義的urls列表里,然后返回urls列表。

urls.append("https://edu.cnblogs.com/campus/hbsfxy/DayDayUp?page=%s" %i)

 

這段代碼是定義了一個函數用於將從傳入的網址爬取的數據存在列表字典里。首先是請求網址;將網址返回的響應內容的字符編碼設置成和網頁一樣的,以免亂碼;然后創建一個beautifulsoup對象soup並初始化,然后從網頁源代碼中可以看出所有我們要爬取的內容都包含在class屬性為"am-g am-list-item-desced am-list-item-thumbed am-list-item-thumb-bottom-right"的一對對<li> 標簽里,我們先找出所有這樣標簽。

def parse_HTML(url):
    req = requests.get(url)
    req.encoding = req.apparent_encoding
    soup = BeautifulSoup(req.text, 'lxml')
    data=[]
    li_list = soup.find_all('li',class_="am-g am-list-item-desced am-list-item-thumbed am-list-item-thumb-bottom-right")    
    for li in li_list:
        if len(li.find("div",class_="am-text-sm").get_text())>0:
            print("ok")
            dic={}
            dic["博客提目"]=li.find("a",target="_blank").get_text()
            dic["發布人"]=li.find("a",title="發布人").get_text().replace(" ","").replace("\n","")
            dic["評論"]=li.find("span",title="評論").get_text().replace("\ue606","").replace(" ","")
            dic["閱讀"]=li.find("span",title="閱讀").get_text().replace("\ue641","").replace(" ","")
            data.append(dic)
            time.sleep(1)
    return data

 下面的截圖是我截取要爬取我們信息的頁面的截圖,下面有三對class屬性相同<li>標簽,但第一個是沒有我們要爬取的內容的,當我們遍歷所有我們篩選出來的標簽時爬到第一個<li>標簽時,沒有我們要爬取的<a>、<span>標簽的內容就會報錯,所以我們必須加以控制,我這里加了一個if循環,如果<div>標簽爬出來不為空才能繼續下面的爬取操作。從圖中可以看出在名字、評論、閱讀那有許多空格和其他符號,我用了replace()函數來篩選文字。最后sleep函數用來調整我們訪問服務器的時間,以防訪問過於頻繁被封。

 

這段代碼定義了一個函數,並分別調用了前兩個函數,for循環用於將之前存的網頁列表一個一個拿出來訪問,然后將每個頁面訪問信息存在一個總的列表里。

def get_alldata(n):
    alldata=[]
    for url in get_url(n):
        alldata.extend(parse_HTML(url)) 
    return alldata

 

這個就是main函數了,調用get_alldata()函數,並將最后列表用DataFrame函數變為二維表,pd是之前在導入pandas庫時定義的。最后再將二維表存入csv表就行了!

if __name__ == "__main__":
    
    dp=pd.DataFrame(get_alldata(11))
    dp.to_csv("博客data.csv",encoding='utf_8_sig')

 

打開csv文件,這就是最后大概爬出來的樣子了~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM