12行Python暴力爬《黑豹》豆瓣短評

12行Python暴力爬《黑豹》豆瓣短評

草長鶯飛,轉眼間又到了三月“爬蟲月”。

這時往往不少童鞋寫論文苦於數據獲取艱難,輾轉走上爬蟲之路;

許多分析師做輿情監控或者競品分析的時候,也常常使用到爬蟲。

今天,本文將帶領小夥伴們通過12行簡單的Python代碼,初窺爬蟲的秘境。

爬蟲目標

本文采用requests + Xpath,爬取豆瓣電影《黑豹》部分短評內容。話不多說,代碼先上:

import requests; from lxml import etree; import pandas as pd; import time; import random; from tqdm import tqdmname, score, comment = [], [], []def danye_crawl(page): url = 'https://movie.douban.com/subject/6390825/comments?start=%s&limit=20&sort=new_score&status=P&percent_type='%(page*20) response = etree.HTML(requests.get(url).content.decode('utf-8')) print('\n', '第%s頁評論爬取成功'%(page)) if requests.get(url).status_code == 200 else print('\n', '第%s頁爬取失敗'(page)) for i in range(1,21): name.append(response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/a'%(i))[0].text) score.append(response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]'%(i))[0].attrib['class'][7]) comment.append(response.xpath('//*[@id="comments"]/div[%s]/div[2]/p'%(i))[0].text)for i in tqdm(range(11)): danye_crawl(i); time.sleep(random.uniform(6, 9))res = pd.DataFrame({'name':name, 'score':score, 'comment':comment},columns = ['name','score','comment']); res.to_csv("豆瓣.csv")

運行以上的爬蟲腳本,我們得以見證奇蹟

12行Python暴力爬《黑豹》豆瓣短評

爬蟲結果與原網頁內容的對比,完全一致

通過tqdm模塊實現了良好的交互

工具準備

  • chrome瀏覽器(分析HTTP請求、抓包)

  • 安裝Python 3及相關模塊(requests、lxml、pandas、time、random、tqdm)

    requests:用來簡單請求數據

    lxml:比Beautiful Soup更快更強的解析庫

    pandas:數據處理神器

    time:設置爬蟲訪問間隔防止被抓

    random:隨機數生成工具,配合time使用

    tqdm:交互好工具,顯示程序運行進度

基本步驟

  1. 網絡請求分析

  2. 網頁內容解析

  3. 數據讀取存儲

涉及知識點

  • 爬蟲協議

  • http請求分析

  • requests請求

  • Xpath語法

  • Python基礎語法

  • Pandas數據處理

爬蟲協議

爬蟲協議即網站根目錄之下的robots.txt文件,用來告知爬蟲者哪些可以拿哪些不能偷,其中Crawl-delay告知了網站期望的被訪問的間隔。(為了對方服務器端同學的飯碗,文明拿數據,本文將爬蟲訪問間隔設置為6-9秒的隨機數)

豆瓣網站的爬蟲協議

HTTP請求分析

使用chrome瀏覽器訪問《黑豹》短評頁面https://movie.douban.com/subject/6390825/comments?sort=new_score&status=P,按下F12,進入network面板進行網絡請求的分析,通過刷新網頁重新獲得請求,藉助chrome瀏覽器對請求進行篩選、分析,找到那個Ta

豆瓣短評頁面請求分析

通過請求分析,我們找到了目標url為

'https://movie.douban.com/subject/6390825/comments?start=0&limit=20&sort=new_score&status=P&percent_type=',並且每次翻頁,參數start將往上增加20

(通過多次翻頁嘗試,我們發現第11頁以後需要登錄才能查看,且登錄狀態也僅展示前500條短評。作為簡單demo,本文僅對前11頁內容進行爬取)

requests請求

通過requests模塊發送一個get請求,用content方法獲取byte型數據,並以utf-8重新編碼;然後添加一個交互,判斷是否成功獲取到資源(狀態碼為200),輸出獲取狀態

請求詳情分析

(除了content,還有text方法,其返回unicode字符集,直接使用text方法遇到中文的話容易出現亂碼)

Xpath語法解析

獲取到數據之後,需要對網頁內容進行解析,常用的工具有正則表達式、Beautiful Soup、Xpath等等;其中Xpath又快又方便。此處我們通過Xpath解析資源獲取到了前220條短評的用戶名、短評分數、短評內容等數據。

(可藉助chrome的強大功能直接複製Xpath,Xpath語法學習http://www.runoob.com/xpath/xpath-tutorial.html)

數據處理

獲取到數據之後,我們通過list構造dictionary,然後通過dictionary構造dataframe,並通過pandas模塊將數據輸出為csv文件

結語與彩蛋

本例通過requests+Xpath的方案,成功爬取了電影《黑豹》的部分豆瓣短評數據,為文本分析或其他數據挖掘工作打好了數據地基。

本文作為demo,僅展示了簡單的爬蟲流程,更多彩蛋如請求頭、請求體信息獲取、cookie、模擬登錄、分佈式爬蟲等請關注後期文章更新喲。

最後,送上白話文版的代碼:

import requestsfrom lxml import etreeimport pandas as pdimport timeimport randomfrom tqdm import tqdmname, score, comment = [], [], []def danye_crawl(page): url = 'https://movie.douban.com/subject/6390825/comments?start=%s&limit=20&sort=new_score&status=P&percent_type='%(page*20) response = requests.get(url) response = etree.HTML(response.content.decode('utf-8')) if requests.get(url).status_code == 200: print('\n', '第%s頁評論爬取成功'%(page)) else: print('\n', '第%s頁爬取失敗'(page)) for i in range(1,21): name_list = response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/a'%(i)) score_list = response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]'%(i)) comment_list = response.xpath('//*[@id="comments"]/div[%s]/div[2]/p'%(i)) name_element = name_list[0].text score_element = score_list[0].attrib['class'][7] comment_element = comment_list[0].text name.append(name_element) score.append(score_element) comment.append(comment_element)for i in tqdm(range(11)): danye_crawl(i) time.sleep(random.uniform(6, 9))res = {'name':name, 'score':score, 'comment':comment}res = pd.DataFrame(res, columns = ['name','score','comment'])res.to_csv("豆瓣.csv")


分享到:


相關文章: