爬蟲綜合大做業

做業要求來源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3075

1、要求

選擇一個熱點或者你感興趣的主題、爬取的對象與範圍,爬取相應的內容並作數據分析與文本分析,造成一篇有說明、技術要點、有數據、有數據分析圖形化展現與說明、文本分析圖形化展現與說明的文章。html

2、爬取說明

2019年春節長假,一部電影成了最熱話題。《流浪地球》,這部被譽爲開創了中國科幻電影元年的大做不但刷爆朋友圈收穫滿滿口碑,票房上也連奏凱歌,堪稱是中國史上第一部硬科幻片,原做者劉慈欣也更加廣爲人知。然而對於劉慈欣來講,流浪地球只是他衆多做品中的一個,其實最讓人感到驚歎和震撼的實際上是他的另外一部做品:《三體》三部曲---《三體》、《三體Ⅱ·黑暗森林》、《三體Ⅲ·死神永生》。《三體》做爲三部曲的開篇之做,2006年,《三體》開始在《科幻世界》雜誌上連載。並迅速成爲劉慈欣科幻小說的「巔峯之做」。《三體》這部小說給我留下了深入的印象,其硬科幻以及超乎想象的劇情是最爲精彩的。爲了獲取讀過三體的讀者的評價,爬取了豆瓣讀書的部分評價,對所爬取的數據進行簡要分析。sql

如下是豆瓣讀書短評原網頁的結構:


經過對網頁結構,找到須要爬取的信息的id,對網頁的元素進行篩選和保存:用戶名username、用戶居住地useraddress、點贊數agree、 評價好壞程度assess、評價時間comment_date以及評價內容。app

3、源代碼

import requests
from bs4 import BeautifulSoup
import pandas as pd
import sqlite3

st1_comment_Url = 'https://book.douban.com/subject/2567698/comments/hot?p=1'


UserAgent = [
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
   ]
Http_Ip=[
    '47.92.5.85:3128'
    #'104.129.11.35:3128',
    #'115.159.31.195:8080',
    #'111.43.70.58:51547'
]
Https_Ip=[
    '111.177.181.152:9999',
    '116.208.53.244:9999',
    '175.165.129.19:1133',
    '116.209.55.223:9999',
    '47.92.5.85:3128'
]
headers={
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
proxies = {
    "https": '74.208.83.188:80'
    #"https": Https_Ip[random.randint(0,4)]
}

res = requests.get(st1_comment_Url, headers=headers, proxies=proxies)
res.encoding = 'utf-8'
#data = requests.get(st1_short_comment_Url,mheader).content
soup = BeautifulSoup(res.text,'html.parser')
all_list = []

def get_address(url):#獲取用戶的居住地
    res = requests.get(url,headers=headers,proxies=proxies)
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    adr=''
    for a in soup.select('div'):
        if len(a.select('.user-info')) > 0:
            if len(a.select('a'))>0:
                adr=a.select('a')[0].text
                c=a.select('a')[0]['href']
                if adr=='':
                  print("已註銷")
                elif c=='#':
                  print("未設置地址")
                else:
                  print(adr)
    return adr

def comment_each(each_page_url):  # 獲取短評的信息
    res = requests.get(each_page_url,headers=headers,proxies=proxies)
    res.encoding = 'utf-8'
    #data= requests.get(each_page_url,headers=mheader).content
    soup = BeautifulSoup(res.text,'html.parser')
    for item in soup.select('li'):
        #time.sleep(random.random() * 2)  # 設置爬取的時間間隔
        if len(item.select('.comment-info')) > 0:
            comment_dict = {}  # 定義字典爲局部變量,避免每次添加新元素時修改字典的內容
            a = item.find('span',class_='comment-info')
            address_url=a.select('a')[0]['href']
            useraddress=get_address(address_url)
            username = item.select('a')[0]['title']
            agree = item.select('span')[1].text
            comment_date = item.select('span')[3].text
            if (comment_date == ''):  # 評論時間的span不固定,稍加處理
                comment_date = item.select('span')[4].text
                assess = item.select('span')[3]['title']
            else:
                assess = "未評價"

            comment_dict['username'] = username  # 用戶名
            comment_dict['address'] = useraddress  # 居住地
            comment_dict['vote'] = agree  # 點贊數
            comment_dict['assess'] = assess  # 評價好壞程度
            comment_dict['date'] = comment_date  # 評價的時間
            comment_dict['short_comment'] = item.select('.short')[0].text  # 評價的內容
            all_list.append(comment_dict)

if __name__ == '__main__':
    for i in range(1, 2500):
        comment_Url = 'https://book.douban.com/subject/2567698/comments/hot?p={}'.format(i)  # 短評的網頁連接
        comment_each(comment_Url)  # 將字典的元素添加到列表
        print(i)
        
    comdf = pd.DataFrame(all_list)  # 格式化列表數據
    comdf.to_csv(r'D:\py_file\st_short100.csv', encoding='utf_8_sig')  # 保存爲csv格式
    
    with sqlite3.connect(r'D:\py_file\st_short9.sqlite') as db:#保存文件爲sql
         comdf.to_sql('st9',db)

4、結果

保存爬取的csv數據:

分析:

一、評論者居住地:

將前11位地址數量排序,從圖片可看出大多數評論者都集中在北上廣杭等一線城市。
二、評論時間:


將評論時間排序,得出前13位排序結果,從結果看出,評論時間最多的是2015年,而這部做品得到雨果獎項時恰好是2015,這裏能夠簡單說明大多數讀者是在這部做品出名後慕名而讀的。
經過上面的簡單分析,三體這部做品即便是在得獎後招來許多讀者閱讀,可是反響效果卻不差,大多數仍是以爲這部做品好看,說明了了三體贏得了讀者的許可。dom

保存到SQL:

生成詞雲:

5、總結

一、爲了保證不被封ip,整個爬取數據的內容實際上是比較緩慢的,並且效率極低,主要用了select篩選元素,其實要用獲取數據請求的方式抓取效率才高,可是由於時間緣由(期間被封了幾回ip,找了代理依舊不能根本解決問題)就暫時抓取這麼多數據。
二、從詞雲上看,《三體》這部小說總體的評價是不錯的,大多數評論的關鍵詞是:好看,還不錯,神做、腦洞大開、四星半等稱讚的詞。但同時也存在不同的聲音:文筆太差、文筆通常等評價。無論怎麼說,我的認爲,硬科幻註定不會讓全部人喜歡,可是改變不了我對本書的讚賞。這部小說情節和故事設定超乎想象,感受做者來自將來,將歷史、現實和將來聯繫在一塊兒。其中我在書中令我影響深入的是黑暗森林法則 - 「1.生存是文明的第一須要。2.文明不斷增加和擴張,但宇宙中的物質總量基本保持不變」 在書中經過這兩句短短的話,做者發展出來了一個一個理論 - 「宇宙就是一座黑暗森林,每一個文明都是帶槍的獵人,竭力不讓腳步發出一點兒聲音,由於林中處處都有與他同樣潛行的獵人。若是他發現了別的生命,能作的只有一件事:開槍消滅之。在這片森林中,他人就是地獄,就是永恆的威脅,任何暴露本身存在的生命都將很快被消滅。」 最後,借用網友的一句話就是:把科幻小說寫成新聞報道那樣真實的也就只有劉慈欣了。url

相關文章
相關標籤/搜索