日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Python | 雜代碼】爬蟲,從基礎(chǔ)到進(jìn)階(一)

 Four兄 2019-09-06

爬蟲,從基礎(chǔ)到進(jìn)階(一)

一、學(xué)習(xí)開始前需安裝模塊

pip install requests
pip install lxml
pip install pandas

二、講解概要

  1. 本期先帶大家利用requests+xpath爬取豆瓣影評(píng)------適合0基礎(chǔ)同學(xué)學(xué)習(xí)

    (本來(lái)昨天是騎士對(duì)勇士的,想帶大家爬取騰訊體育NBA專區(qū)話題的,可是騰訊反爬也厲害,等到下一期再教大家,畢竟從基礎(chǔ)開始,就要簡(jiǎn)單點(diǎn),哈哈哈。)

   2.下一期,將帶大家學(xué)習(xí)如何應(yīng)對(duì)反爬

三、正式開始,豎起你的小眼睛

1.requests + xpath 爬取豆瓣影評(píng)
   (1)獲取頁(yè)面內(nèi)容

# 爬取頁(yè)面 url
douban_url = 'https://movie.douban.com/subject/26647117/comments?status=P'
# requests 發(fā)送請(qǐng)求
get_response = requests.get(douban_url)
# 將返回的響應(yīng)碼轉(zhuǎn)換成文本(整個(gè)網(wǎng)頁(yè))
get_data = get_response.text
'''
到這里我們就已經(jīng)獲取了整個(gè)網(wǎng)頁(yè)的內(nèi)容,
可以‘算’是完成了爬蟲
'''

    (2)分析頁(yè)面內(nèi)容,獲取我們想要的內(nèi)容

  • 瀏覽器中打開我們要爬取的頁(yè)面

  • 按F12進(jìn)入開發(fā)者工具,查看我們想要的數(shù)據(jù)在哪里

  • 這里我們只要 評(píng)論人+評(píng)論內(nèi)

  • 分析我們獲取的 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'

  • 通過(guò)觀察我們發(fā)現(xiàn),這幾個(gè)xpath只有細(xì)微不同,上面加粗的部分已數(shù)加的格式改變,所以我們要爬取所有的 commentator(評(píng)論者),只需把xpath改為:
            '/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a'
    即不要后面的序號(hào),當(dāng)我們查詢時(shí),會(huì)自動(dòng)捕獲類似的xpath。

  • 同樣的分析,我們可以得到評(píng)論內(nèi)容的xpath為:
    '/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p'

# (跟在上面代碼后)解析頁(yè)面,并輸出獲取內(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]+'說(shuō):')
   files[i].strip(r'\n')
   files[i].strip(' ')
   print(comment_content[i])

  • 運(yùn)行結(jié)果(一部分?jǐn)?shù)據(jù))

Oriol Paulo說(shuō): 'Wrath of silence' is quite different from the crime movies I've seen. It's a mix of genres. It's a crime movie,a mystery movie,an action movie,it's also a social realistic movie. Xin Yu Kun plays very well the mix of different genres in this film,and it has a powerful ending.

文文周說(shuō): 對(duì)于平均水準(zhǔn)以上的年輕導(dǎo)演,應(yīng)毫不吝嗇予以鼓勵(lì),對(duì)于年齡一大把了還言之無(wú)物的導(dǎo)演,才要無(wú)情打擊。

西樓塵說(shuō): 老板兒子吃真空羊肉,貪婪絞入碎肉機(jī);屠夫兒子喝污染井水,正義只在電視屏。戳瞎左眼,被戳傷的同鄉(xiāng)都能包庇;咬斷舌頭,被救助的律師卻不敢發(fā)聲。憑蠻力壘不成金字塔,靠假聲變不成兔子?jì)?。超人面具如同良心咒,送不回原主;尋子告示像是招魂符,在風(fēng)里飄搖。真相埋進(jìn)泥土,藏入山洞,終于再無(wú)人知。

#85說(shuō): 忻鈺坤第二部作品不是一部秀操作的《心迷宮2.0》,要說(shuō)風(fēng)格像誰(shuí),都像也都不像:凝視山洞的庫(kù)布里克單點(diǎn)透視、像科恩兄弟一樣塑造的神經(jīng)質(zhì)殺手、《老男孩》一樣的長(zhǎng)廊Fight…不一樣的是,不只是想告訴你兇手是誰(shuí),而是他的選擇,以及像手術(shù)刀一樣劃開上層失態(tài)、中層失德、底層失語(yǔ)、人間失格的社會(huì)癥結(jié)

一口吃掉小蛋糕說(shuō): 結(jié)尾太贊,配樂非常喜歡,如果能去掉字幕就好了。從姜武拿起煙灰缸的時(shí)候就猜到了結(jié)尾。只不過(guò)細(xì)思極恐,井水為什么越來(lái)越咸?為什么那么多人都水腫?村長(zhǎng)是知道的,不然不會(huì)喝礦泉水。然而這個(gè)梗,最后卻沒有過(guò)多的交代

大大肉罐說(shuō): 上層偽善殘暴,中層冷漠自私,下層失語(yǔ)無(wú)力。

武俠小王子說(shuō): 當(dāng)年摩托羅拉的電量還是大大不如諾基亞。

劉瀟陽(yáng)說(shuō): 僅僅是80%成片,已經(jīng)精彩絕倫。中國(guó)類型片就該這么拍。良好的多線敘事控制力,深穴映射人性,爆炸增長(zhǎng)的經(jīng)濟(jì),暴裂難控的社會(huì)問(wèn)題,男人無(wú)聲的憤恨和傷痛,就像無(wú)法發(fā)聲的底層人民。黑暗結(jié)尾,孩子沒有尋回,真相沒有昭顯,這卻是社會(huì)真相。有時(shí)惡人作惡,僅是為了與相同利益者變成真正的同盟。

木衛(wèi)二說(shuō): 不斷向下,墮入黑暗的那種片子,鞭撻了社會(huì)主要矛盾,且不負(fù)責(zé)提供解謎快感,所以看完會(huì)很沉,很堵。如果《心迷宮》還是手工時(shí)代的自發(fā)創(chuàng)作,《暴裂無(wú)聲》明顯是工業(yè)時(shí)代(卡司動(dòng)作特效)的考量,三人較勁,律師一角太弱,宋洋戰(zhàn)力太強(qiáng),姜武模式化。優(yōu)點(diǎn)和缺陷都比較明顯。

巴伐利亞酒神說(shuō): 結(jié)局太他媽的屌了,看完在影院倒吸一口涼氣。影射也很牛逼啊,1984的摩托牌照,一個(gè)底層屌絲的人設(shè)為啞巴(沒有話語(yǔ)權(quán)),律師(代表中產(chǎn)和法律)和煤老板(代表權(quán)貴和黑惡勢(shì)力)的相互勾結(jié)。所以即便張保民擁有《黃海》里綿正赫那樣爆表的武力值,也只能淪為這個(gè)殘酷社會(huì)的犧牲品。

凌睿說(shuō): 當(dāng)你望著深淵的時(shí)候,深淵也在望著你。

frozenmoon說(shuō): 昌萬(wàn)年是食肉者,徐文杰是喝湯的,而張保民本人就是“肉”,原本他們?cè)谑澄镦湹囊粋€(gè)位置安之若素的扮演自己的角色,但意外沖垮了一切。失控之后,每個(gè)人都發(fā)現(xiàn)自己不過(guò)都是“肉”,昌摘下假發(fā)和西裝,也得臣服于暴力和運(yùn)氣,徐走出金錢和言辭的保護(hù)也要面對(duì)殘酷,張的代價(jià)或許更大。人性暴裂的悶響。

無(wú)恥不混蛋說(shuō): 影片最打動(dòng)我的,不是那些顯而易見、甚至昭然若揭的隱喻,而是整部影片的“失語(yǔ)”。我們屬于“失語(yǔ)的一代”,對(duì)應(yīng)片中,不僅僅只是表層的啞巴張保民的“生理性失語(yǔ)”,更是,精英階層律師在片尾所選擇的“主動(dòng)性失語(yǔ)”。而影片對(duì)“失語(yǔ)”的精準(zhǔn)展示,不僅敏感捕捉到了時(shí)代痛點(diǎn),而且極為戳痛人心。

    (3)實(shí)現(xiàn)翻頁(yè),并把評(píng)論人和評(píng)論內(nèi)容存入csv文件

  • 翻頁(yè)(1)
    和前面分析xpath不同,我們只要找出每頁(yè)之間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),除了第一個(gè),每個(gè)url就只有 start的值不同,而且每次增加20,上面已經(jīng)說(shuō)了start屬性,通過(guò)觀察我們也不難發(fā)現(xiàn),每個(gè)頁(yè)面只有20條評(píng)論,這個(gè)是由 limit這個(gè)屬性控制的(小編已經(jīng)試過(guò),人為改動(dòng)是沒有用的,估計(jì)是豆瓣的反爬,但并不影響我們),我這里想說(shuō)明的是這個(gè)start的值之所以會(huì)以20為增量,就是這個(gè) limit 控制的。

  • 翻頁(yè)(2)

 # 獲取評(píng)論總數(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('看過(guò)()'))
 # 計(jì)算出總的的頁(yè)面數(shù)(每頁(yè)有20條評(píng)論)
 page_counts = int(comment_counts/20)
 # 請(qǐng)求訪問(wèn),并把爬取數(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)

在完成上面之前,我們肯定要把之前寫的代碼進(jìn)行修改,讓代碼看起,我們可以把前面寫的代碼封裝成一個(gè)函數(shù)get_respones_data(),傳入一個(gè)訪問(wèn)url參數(shù),獲得返回的HTML。

代碼大整改:

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ā)送請(qǐng)求
     get_response = requests.get(douban_url)
     # 將返回的響應(yīng)碼轉(zhuǎn)換成文本(整個(gè)網(wǎng)頁(yè))
     get_data = get_response.text
     # 解析頁(yè)面
     a = etree.HTML(get_data)
     return a
 first_a = get_respones_data()
 # 翻頁(yè)
 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('看過(guò)()'))
 page_counts = int(comment_counts / 20)
#小編已經(jīng)測(cè)試過(guò)了,如果沒有登入的話最多只能訪問(wèn)10個(gè)頁(yè)面,也就是200條評(píng)論
#下一期小編將教大家如何應(yīng)對(duì)反爬
 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)
     # 獲取評(píng)論人和評(píng)論內(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 = ['評(píng)論人','評(píng)論內(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)

四、來(lái)點(diǎn)進(jìn)階的(和爬蟲無(wú)關(guān))

新安裝模塊

1pip install jieba
2pip install re
3pip install csv
4pip install pyecharts
5pip install numpy

  1. 解析數(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        # 去除所有評(píng)論里多余的字符
12        content = re.sub('[,,。. \r\n]', '', content)

2.分析數(shù)據(jù)

# 切詞,將整個(gè)評(píng)論分解成一個(gè)個(gè)的詞語(yǔ)
1segment = jieba.lcut(content)
2words_df = pd.DataFrame({'segment': segment})
3# quoting=3 表示stopwords.txt里的內(nèi)容全部不引用
4stopwords = 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')
5words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
# 計(jì)算每個(gè)詞語(yǔ)重復(fù)出現(xiàn)次數(shù)
6words_stat = words_df.groupby(by=['segment'])['segment'].agg({'計(jì)數(shù)': numpy.size})
7words_stat = words_stat.reset_index().sort_values(by=['計(jì)數(shù)'], ascending=False)

3.數(shù)據(jù)可視化

1test = words_stat.head(1000).values
# 獲取所有詞語(yǔ)
2words = [test[i][0] for i in range(0,len(test))]
# 獲取詞語(yǔ)對(duì)于的出現(xiàn)次數(shù)
3counts = [test[i][1] for i in range(0,len(test))]
4wordcloud = WordCloud(width=1300, height=620)
# 生成詞云圖
5wordcloud.add('爆裂無(wú)聲', words, counts, word_size_range=[20, 100])
6wordcloud.render()

4.顯示效果

可以看出來(lái),大家非常喜歡導(dǎo)演,哈哈哈哈~數(shù)據(jù)只爬了10頁(yè),等下一期給大家講解反爬蟲之后,爬取全部?jī)?nèi)容,就能獲取更準(zhǔn)確的數(shù)據(jù)啦。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多