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

來源:互聯網
上載者:User

作者:黃嘉鋒

來源:https://www.jianshu.com/p/ea0b56e3bd86


草長鶯飛,轉眼間又到了三月“爬蟲月”。
這時往往不少童鞋寫論文苦於資料擷取艱難,輾轉走上爬蟲之路;
許多分析師做輿情監控或者競品分析的時候,也常常使用到爬蟲。


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


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

import requests; from lxml import etree; import pandas as pd; import time; import random; from tqdm import tqdm
name, 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")

運行以上的爬蟲指令碼,我們得以見證奇蹟


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


通過tqdm模組實現了良好的互動


工具準備


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

安裝Python 3及相關模組(requests、lxml、pandas、time、random、tqdm)
requests:用來簡單請求資料
lxml:比Beautiful Soup更快更強的解析庫
pandas:資料處理神器
time:設定爬蟲訪問間隔防止被抓
random:隨機數產生工具,配合time使用
tqdm:互動好工具,顯示程式運行進度


基本步驟


網路請求分析

網頁內容解析

資料讀取儲存


涉及知識點


爬蟲協議

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文法解析


擷取到資料之後,需要對網頁內容進行解析,常用的工具有Regex、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 requests
from lxml import etree
import pandas as pd
import time
import random
from tqdm import tqdm

name, 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")


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.