python爬取豆瓣書評(píng)并詞云展示

前言:

準(zhǔn)備工具:python3.7枚驻、vscode裙士、chrome

安裝urllib心剥、beautifulsoup、jieba瘩缆、wordcloud(pip install 庫(kù))

一关拒、分析豆瓣頁(yè)面

首先我們先觀察豆瓣的搜索頁(yè)面

搜索頁(yè)面
搜索頁(yè)面url

我們可以看到左側(cè)的導(dǎo)航欄,結(jié)合url我們會(huì)發(fā)現(xiàn)cat后面的值和q后面的書名電影名影響著搜索的變化庸娱,可以找出如下規(guī)律:

讀書 1001

電影1002

音樂1003

我們查看網(wǎng)頁(yè)的源代碼(F12)可以發(fā)現(xiàn)我們所需要的內(nèi)容全部都在a標(biāo)簽之下着绊,我們利用豆瓣優(yōu)秀的排序算法可以直接獲取搜索排序的第一名作為我們的待爬取內(nèi)容,我們也只需要其中的sid號(hào)熟尉,其余的事情就交給待爬取頁(yè)面的爬蟲去做了归露。

搜索頁(yè)面源代碼

下面給出源代碼:

import ssl
import string
import urllib
import urllib.request
import urllib.parse

from bs4 import BeautifulSoup


def create_url(keyword: str, kind: str) -> str:
    '''
    Create url through keywords
    Args:
        keyword: the keyword you want to search
        kind: a string indicating the kind of search result
            type: 讀書; num: 1001
            type: 電影; num: 1002
            type: 音樂; num: 1003
    Returns: url
    '''
    num = ''
    if kind == '讀書':
        num = 1001
    elif kind == '電影':
        num = 1002
    elif kind == '音樂':
        num = 1003
    url = 'https://www.douban.com/search?cat=' + \
        str(num) + '&q=' + keyword
    return url


def get_html(url: str) -> str:
    '''send a request'''

    headers = {
        # 'Cookie': 你的cookie,
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
        'Connection': 'keep-alive'
    }
    ssl._create_default_https_context = ssl._create_unverified_context

    s = urllib.parse.quote(url, safe=string.printable)  # safe表示可以忽略的部分
    req = urllib.request.Request(url=s, headers=headers)
    req = urllib.request.urlopen(req)
    content = req.read().decode('utf-8')
    return content


def get_content(keyword: str, kind: str) -> str:
    '''
    Create url through keywords
    Args:
        keyword: the keyword you want to search
        kind: a string indicating the kind of search result
            type: 讀書; num: 1001
            type: 電影; num: 1002
            type: 音樂; num: 1003
    Returns: url
    '''
    url = create_url(keyword=keyword, kind=kind)
    html = get_html(url)
    # print(html)
    soup_content = BeautifulSoup(html, 'html.parser')
    contents = soup_content.find_all('h3', limit=1)
    result = str(contents[0])
    return result


def find_sid(raw_str: str) -> str:
    '''
    find sid in raw_str
    Args:
        raw_str: a html info string contains sid
    Returns:
        sid
    '''
    assert type(raw_str) == str, \
        '''the type of raw_str must be str'''
    start_index = raw_str.find('sid:')
    sid = raw_str[start_index + 5: start_index + 13]
    sid.strip(',')
    return sid


if __name__ == "__main__":
    raw_str = get_content('看見', '讀書')
    print(find_sid(raw_str))

這樣我們就有了具有唯一標(biāo)實(shí)的圖書(電影)的sid

其次我們先觀察待爬取頁(yè)面并查看網(wǎng)頁(yè)源代碼(F12)

待爬取頁(yè)面
待爬取頁(yè)面源代碼

通過(guò)觀察我們不難發(fā)現(xiàn)我們所需的評(píng)論都在<span class="short"> 標(biāo)簽下,想要爬取的作者斤儿、時(shí)間剧包、推薦星級(jí)也分別藏在其他幾個(gè)子標(biāo)簽下,代碼如下:

comments = soupComment.findAll('span', 'short')

time = soupComment.select( '.comment-item > div > h3 > .comment-info > span:nth-of-type(2)')

name = soupComment.select('.comment-item > div > h3 > .comment-info > a')

第一頁(yè)評(píng)論url:https://book.douban.com/subject/20427187/comments/hot?p=1

第二頁(yè)評(píng)論url:https://book.douban.com/subject/20427187/comments/hot?p=2

...

第n頁(yè)評(píng)論url:https://book.douban.com/subject/20427187/comments/hot?p=n

通過(guò)翻取評(píng)論往果,url的規(guī)律這樣就找到了疆液,只需要改變p后面的一個(gè)變量就可以

二、豆瓣評(píng)論數(shù)據(jù)抓取

我們需要為爬蟲偽裝一個(gè)頭部信息防止網(wǎng)站的反爬蟲

headers = {

        # 'Cookie': 你的cookie,

        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',

        'Referer': 'https: // movie.douban.com / subject / 20427187 / comments?status = P',

        'Connection': 'keep-alive'

    }

關(guān)于cookie你可以先在網(wǎng)頁(yè)登陸你的豆瓣賬號(hào)然后F12->network->all->heders中尋找

image

爬蟲代碼如下:

import urllib.request

import urllib.parse

from bs4 import BeautifulSoup

import time

import jieba

import wordcloud

import crawler_tools

def creat_url(num):

    urls = []

    for page in range(1, 20):

        url = 'https://book.douban.com/subject/' + \

            str(num)+'/comments/hot?p='+str(page)+''

        urls.append(url)

    print(urls)

    return urls

def get_html(urls):

    headers = {

        # 'Cookie': 你的cookie,

        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',

        'Connection': 'keep-alive'

    }

    for url in urls:

        print('正在爬壬轮:'+url)

        req = urllib.request.Request(url=url, headers=headers)

        req = urllib.request.urlopen(req)

        content = req.read().decode('utf-8')

        time.sleep(10)

    return content

def get_comment(num):

    a = creat_url(num)

    html = get_html(a)

    soupComment = BeautifulSoup(html, 'html.parser')

    comments = soupComment.findAll('span', 'short')

    onePageComments = []

    for comment in comments:

        # print(comment.getText()+'\n')

        onePageComments.append(comment.getText()+'\n')

    print(onePageComments)

    f = open('數(shù)據(jù).txt', 'a', encoding='utf-8')

    for sentence in onePageComments:

        f.write(sentence)

    f.close()

raw_str = crawler_tools.get_content('看見', '讀書')

sid = crawler_tools.find_sid(raw_str)

print('sid:'+sid)

get_comment(sid)

三堕油、數(shù)據(jù)清洗、特征提取及詞云顯示

首先利用jieba庫(kù)分詞肮之,并使用其其庫(kù)里內(nèi)置的TFIDF算法對(duì)分詞進(jìn)行權(quán)重運(yùn)算

然后利用wordcloud庫(kù)生成詞云掉缺,具體設(shè)置參數(shù)如下:

font_path='FZQiTi-S14S.TTF', # 設(shè)置字體

max_words=66, # 設(shè)置最大顯示字?jǐn)?shù)

max_font_size=600, # 設(shè)置字體最大值

random_state=666, # 設(shè)置隨機(jī)生成狀態(tài)

width=1400, height=900, # 設(shè)置圖像大小

background_color='black', # 設(shè)置背景大小

stopwords=(type(list)) # 設(shè)置停用辭典

我們把做了數(shù)據(jù)處理的詞云和普通詞云做個(gè)對(duì)比:

為處理
處理過(guò)

數(shù)據(jù)處理代碼如下:

import jieba

import jieba.analyse

import wordcloud

f = open('/Users/money666/Desktop/The_new_crawler/看見.txt',

        'r', encoding='utf-8')

contents = f.read()

f.close()

stopWords_dic = open(

    '/Users/money666/Desktop/stopwords.txt', 'r', encoding='gb18030')    # 從文件中讀入停用詞

stopWords_content = stopWords_dic.read()

stopWords_list = stopWords_content.splitlines()    # 轉(zhuǎn)為list備用

stopWords_dic.close()

keywords = jieba.analyse.extract_tags(

    contents, topK=75, withWeight=False,)

print(keywords)

w = wordcloud.WordCloud(background_color="black",

                        font_path='/Users/money666/Desktop/字體/粗黑.TTF',

                        width=1400, height=900, stopwords=stopWords_list)

txt = ' '.join(keywords)

w.generate(txt)

w.to_file("/Users/money666/Desktop/The_new_crawler/看見.png")

四、問(wèn)題及解決辦法

1戈擒、pip timeout

一眶明、創(chuàng)建或修改pip.conf配置文件:

$ sudo vi ~/.pip/pip.config

timeout =500 #設(shè)置pip超時(shí)時(shí)間

二、使用國(guó)內(nèi)鏡像

使用鏡像來(lái)替代原來(lái)的官網(wǎng)筐高,方法如下:

1. pip install redis -i https://pypi.douban.com/simple

-i:指定鏡像地址

2. 創(chuàng)建或修改pip.conf配置文件指定鏡像地址:

[global]

timeout =6000

index-url = http://pypi.douban.com/simple/

[install]

use-mirrors =true

mirrors = http://pypi.douban.com/simple/

trusted-host = pypi.douban.com

補(bǔ)充:可以在多個(gè)路徑下找到pip.conf搜囱,沒有則創(chuàng)建,另外,還可以通過(guò)環(huán)境變量Linux*:/etc/pip.conf *

*~/.pip/pip.conf *

*~/.config/pip/pip.conf *

Windows: %APPDATA%\pip\pip.ini

  • %HOME%\pip\pip.ini *

C:\Documents and Settings\All Users\Application Data\PyPA\pip\pip.conf (Windows XP)

  • C:\ProgramData\PyPA\pip\pip.conf (Windows 7及以后)*

Mac OSX*: ~/Library/Application Support/pip/pip.conf *

*~/.pip/pip.conf *

*/Library/Application Support/pip/pip.conf *

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凯傲,一起剝皮案震驚了整個(gè)濱河市犬辰,隨后出現(xiàn)的幾起案子嗦篱,更是在濱河造成了極大的恐慌冰单,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灸促,死亡現(xiàn)場(chǎng)離奇詭異诫欠,居然都是意外死亡涵卵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門荒叼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轿偎,“玉大人,你說(shuō)我怎么就攤上這事被廓』祷蓿” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嫁乘,是天一觀的道長(zhǎng)昆婿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蜓斧,這世上最難降的妖魔是什么仓蛆? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挎春,結(jié)果婚禮上看疙,老公的妹妹穿的比我還像新娘。我一直安慰自己直奋,他們只是感情好能庆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脚线,像睡著了一般相味。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殉挽,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天丰涉,我揣著相機(jī)與錄音,去河邊找鬼斯碌。 笑死一死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傻唾。 我是一名探鬼主播投慈,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冠骄!你這毒婦竟也來(lái)了伪煤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凛辣,失蹤者是張志新(化名)和其女友劉穎抱既,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扁誓,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡防泵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蚀之,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捷泞。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡足删,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锁右,到底是詐尸還是另有隱情失受,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布咏瑟,位于F島的核電站贱纠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏响蕴。R本人自食惡果不足惜谆焊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浦夷。 院中可真熱鬧辖试,春花似錦、人聲如沸劈狐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肥缔。三九已至莲兢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間续膳,已是汗流浹背改艇。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坟岔,地道東北人谒兄。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像社付,于是被迫代替她去往敵國(guó)和親承疲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容