我用Python爬取了豆瓣影评,成功后居然发现了一个惊人的秘密.........
大家好,我是IT界搬運喵。
相信大家在工作無聊時,總想掏出手機,看看電影刷刷視頻。更加是夜深人靜的時候,總是按耐不住自己的內(nèi)心想要去看看小電影,當(dāng)然我可沒有開車。我說的是好電影,豆瓣高分電影,自己想歪的時候可不要怪我。
但是看電影之前,都想會簡單的了解一下這部電影講的是什么劇情等等(我真沒有開車!!!)所以我今天就來帶你爬取一下豆瓣影評!
前言
利用利用requests+xpath爬取豆瓣影評,廢話不多說。
讓我們愉快地開始吧~
開發(fā)工具
Python版本:3.6.8
相關(guān)模塊:
requests模塊;
jieba模塊;
pandas模塊
numpy模塊
pyecharts模塊;
以及一些Python自帶的模塊。
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
前期準(zhǔn)備
1.獲取頁面內(nèi)容
# 爬取頁面 url\ douban_url = 'https://movie.douban.com/subject/26647117/comments?status=P'\ # requests 發(fā)送請求\ get_response = requests.get(douban_url)\ # 將返回的響應(yīng)碼轉(zhuǎn)換成文本(整個網(wǎng)頁)\ get_data = get_response.text2.分析頁面內(nèi)容,獲取我們想要的內(nèi)容
- 瀏覽器中打開我們要爬取的頁面
- 按F12進入開發(fā)者工具,查看我們想要的數(shù)據(jù)在哪里
- 這里我們只要 評論人+評論內(nèi)
?3.分析我們獲取的 xpath值
'/html/body/div[3]/div[1]/div/div[1]/div[4]/**div[1]** /div[2]/h3/span[2]/a' '/html/body/div[3]/div[1]/div/div[1]/div[4]/**div[2]** /div[2]/h3/span[2]/a' '/html/body/div[3]/div[1]/div/div[1]/div[4]/**div[3]** /div[2]/h3/span[2]/a'通過觀察我們發(fā)現(xiàn),這幾個xpath只有細(xì)微不同,上面加粗的部分已數(shù)加的格式改變,所以我們要爬取所有的 commentator(評論者),只需把xpath改為:
'/html/body/div[3]/div[1]/div/div[1]/div[4]/**div**/div[2]/h3/span[2]/a'即不要后面的序號,當(dāng)我們查詢時,會自動捕獲類似的xpath。
- 同樣的分析,我們可以得到評論內(nèi)容的xpath為: # (跟在上面代碼后)解析頁面,并輸出獲取內(nèi)容\
a = etree.HTML(get_data)\
commentator = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a/text()')\
comment_content = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p/text()')\
# 解析獲取內(nèi)容,去除多余內(nèi)容\
for i in range(0,len(files)):\print(commentator[i]+'說:')\files[i].strip(r'\n')\files[i].strip(' ')\print(comment_content[i])
運行結(jié)果
實現(xiàn)翻頁,并把評論人和評論內(nèi)容存入csv文件
翻頁1:
和前面分析xpath不同,我們只要找出每頁之間url的不同之處和規(guī)律即可。
# start 屬性表示開始位置\ turn_page1 = 'https://movie.douban.com/subject/26647117/comments?status=P'\ turn_page2 = 'https://movie.douban.com/subject/26647117/comments?start=20&limit=20&sort=new_score&status=P'\ turn_page3 = 'https://movie.douban.com/subject/26647117/comments?start=40&limit=20&sort=new_score&status=P'\ turn_page4 = 'https://movie.douban.com/subject/26647117/comments?start=60&limit=20&sort=new_score&status=P'觀察發(fā)現(xiàn),除了第一個,每個url就只有 start的值不同,而且每次增加20,上面已經(jīng)說了start屬性,通過觀察我們也不難發(fā)現(xiàn),每個頁面只有20條評論,這個是由 limit這個屬性控制的(小編已經(jīng)試過,人為改動是沒有用的,估計是豆瓣的反爬,但并不影響我們),我這里想說明的是這個start的值之所以會以20為增量,就是這個 limit 控制的。
翻頁2:
# 獲取評論總數(shù)\comment_counts = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/ul/li[1]/span/text()')\comment_counts = int(comment_counts[0].strip("看過()"))\# 計算出總的的頁面數(shù)(每頁有20條評論)\page_counts = int(comment_counts/20)\# 請求訪問,并把爬取數(shù)據(jù)存入csv文件\for i in range(0,page_counts):\turn_page_url = 'https://movie.douban.com/subject/26647117/comments?start={}&limit=20&sort=new_score&status=P'.format(i*20)\get_respones_data(turn_page_url)在完成上面之前,我們肯定要把之前寫的代碼進行修改,讓代碼看起,我們可以把前面寫的代碼封裝成一個函數(shù)get_respones_data(),傳入一個訪問url參數(shù),獲得返回的HTML。
代碼實現(xiàn)
import requests\ from lxml import etree\ import pandas as pd\ def get_respones_data(douban_url = 'https://movie.douban.com/subject/26647117/comments?status=P'):\# requests 發(fā)送請求\get_response = requests.get(douban_url)\# 將返回的響應(yīng)碼轉(zhuǎn)換成文本(整個網(wǎng)頁)\get_data = get_response.text\# 解析頁面\a = etree.HTML(get_data)\return a\first_a = get_respones_data()\# 翻頁\comment_counts = first_a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/ul/li[1]/span/text()')\comment_counts = int(comment_counts[0].strip("看過()"))\page_counts = int(comment_counts / 20)\ #小編已經(jīng)測試過了,如果沒有登入的話最多只能訪問10個頁面,也就是200條評論\ #下一期小編將教大家如何應(yīng)對反爬\for i in range(0, page_counts+1):\turn_page_url = 'https://movie.douban.com/subject/26647117/comments?start={}&limit=20&sort=new_score&status=P'.format(\i * 20)\print(turn_page_url)\a = get_respones_data(turn_page_url)\# 獲取評論人和評論內(nèi)容\commentator = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a/text()')\comment_content = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p/text()')\# 解析內(nèi)容,并存入csv文件\content = [' ' for i in range(0, len(commentator))]\for i in range(0, len(commentator)):\comment_content[i].strip(r'\n')\comment_content[i].strip(' ')\content_s = [commentator[i],comment_content[i]]\content[i] = content_s\name = ['評論人','評論內(nèi)容']\file_test = pd.DataFrame(columns=name, data=content)\if i == 0:\file_test.to_csv(r'H:\PyCoding\FlaskCoding\Test_all\test0609\app\comment_content.cvs',encoding='utf-8',index=False)\else:\file_test.to_csv(r'H:\PyCoding\FlaskCoding\Test_all\test0609\app\comment_content.cvs',mode='a+',encoding='utf-8',index=False)數(shù)據(jù)可視化
安裝新模塊
pip install jieba\ pip install re\ pip install csv\ pip install pyecharts\ pip install numpy解析數(shù)據(jù)
1 with codecs.open(r'H:\PyCoding\FlaskCoding\Test_all\test0609\app\comment_content.cvs', 'r', 'utf-8') as csvfile:\ 2 content = ''\ 3 reader = csv.reader(csvfile)\ 4 i =0\ 5 for file1 in reader:\ 6 if i == 0 or i ==1:\ 7 pass\ 8 else:\ 9 content =content + file1[1]\ 10 i = i +1\ 11 # 去除所有評論里多余的字符\ 12 content = re.sub('[,,。. \r\n]', '', content)分析數(shù)據(jù)
# 切詞,將整個評論分解成一個個的詞語\ segment = jieba.lcut(content)\ words_df = pd.DataFrame({'segment': segment})\ # quoting=3 表示stopwords.txt里的內(nèi)容全部不引用\ stopwords = pd.read_csv(r"H:\PyCoding\FlaskCoding\Test_all\test0609\app\stopwords.txt", index_col=False, quoting=3, sep="\t", names=['stopword'], encoding='utf-8')\ words_df = words_df[~words_df.segment.isin(stopwords.stopword)]\ # 計算每個詞語重復(fù)出現(xiàn)次數(shù)\ words_stat = words_df.groupby(by=['segment'])['segment'].agg({"計數(shù)": numpy.size})\ words_stat = words_stat.reset_index().sort_values(by=["計數(shù)"], ascending=False)數(shù)據(jù)可視化
1 test = words_stat.head(1000).values\ # 獲取所有詞語\ 2 words = [test[i][0] for i in range(0,len(test))]\ # 獲取詞語對于的出現(xiàn)次數(shù)\ 3 counts = [test[i][1] for i in range(0,len(test))]\ 4wordcloud = WordCloud(width=1300, height=620)\ # 生成詞云圖\ 5 wordcloud.add("爆裂無聲", words, counts, word_size_range=[20, 100])\ 6 wordcloud.render()效果展示
?好啦。詞云也就出來啦!
總結(jié)一下:Python爬蟲實戰(zhàn)----------requests+xpath模塊
總結(jié)完畢,大家學(xué)會了嗎
總結(jié)
以上是生活随笔為你收集整理的我用Python爬取了豆瓣影评,成功后居然发现了一个惊人的秘密.........的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序-在使用加速器数据事件后移除的
- 下一篇: python第三方库大概有多少人口_py