豆瓣电影(一):网络爬虫
夏日炎炎,屋外三十多度的烈日溫度,著實一點出門的欲望都無了,小編還是窩在宿舍里當個“肥宅”吧。豆瓣爬蟲屬于動靜結合的數據類型,即列表頁動態(tài)、詳情頁靜態(tài)。對豆瓣高分電影信息進行詳細爬取,并存入Excel表格,后續(xù)再對數據進行數據分析,簡單可視化展示。
操作環(huán)境: Windows10、Python3.6、Pycharm、谷歌瀏覽器
目標網址: https://movie.douban.com/ (豆瓣電影)
相關文章: 拉鉤爬蟲、騰訊招聘爬蟲、新筆趣閣爬蟲、鏈家網爬蟲
目錄
- 一、分析網頁
- 1.1、ajax加載
- 1.2、接口鏈接
- 1.3、電影詳情頁
- 二、請求響應
- 2.1、構建params
- 2.2、翻頁
- 2.3、列表頁請求
- 三、提取數據
- 3.1、xpath語法
- 3.2、re正則
- 四、存入Excel
- 4.1、Excel表頭
- 五、項目總結
一、分析網頁
??目標網站:1、點擊選電影;2、選擇高分電影分類。
1.1、ajax加載
??隨意選擇復制一個電影名字段,右鍵點擊選擇源碼,快捷鍵Ctrl+F查看數據是否存在。
1.2、接口鏈接
??快速尋找ajax加載的接口鏈接方法:
???1、右鍵點擊檢查;
???2、選擇Network;
???3、點擊XHR;(一般接口鏈接處于XHR中)
???4、查看Time類型里的最大數值鏈接
??接口鏈接正確,如圖可知rate參數為評分,title為電影名,url為電影詳情鏈接。
1.3、電影詳情頁
??json數據中的url為電影詳情頁鏈接,提取電影詳情頁中的電影名、導演、編劇、主演、評分等等。
二、請求響應
??導入爬蟲項目需要的庫,并設置全局請求頭,以便列表頁及詳情頁的調用請求身份。
# 導入爬蟲需要的庫 import json import re import requests import openpyxl import time# 全局請求頭 處理基本反爬 HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36' }2.1、構建params
??get請求攜帶的params參數,定一個get_params函數寫params參數的構建, 傳入電影分類與頁數,以便每次列表頁請求的攜帶調用。
def get_params(tag,pn):''':param tag: 電影分類:param pn: 頁數:return: 返回請求體'''params = { # 請求體"type": "movie","tag": str(tag),"sort": "recommend","page_limit": "20","page_start": str(pn),}return params2.2、翻頁
??電影列表頁為點擊“加載更多”翻頁,而不是下拉翻頁等。只能自己手動查看“豆瓣高分”這一分類的總頁數為 25 ,不能像之前的動態(tài)項目那樣提取json數據中的總數來while循環(huán)翻頁。
for pn in range(0,500,20): # 翻頁 間隔20# 獲取請求體params = get_params('豆瓣高分',pn)
2.3、列表頁請求
??測試請求列表頁,這里設置一頁驗證結果。另外需要注意的爬蟲程序請求速率過快的情況下,會被豆瓣服務器反爬機制識別,進而封掉識別請求的ip。這時使用time模塊延遲睡眠即可。
for pn in range(0,20,20): # 翻頁 間隔20# 獲取請求體params = get_params('豆瓣高分',pn)# 請求列表頁數據并編碼response = requests.get(url=url, headers=HEADERS, params=params).text time.sleep(1.2) # 睡眠1.2秒,防止識別到是爬蟲被封ipprint(response)??請求返回的數據一一對應,結果無誤。
三、提取數據
??json.loads(): 將已編碼的 JSON 字符串解碼為 Python 對象
??提取json數據比靜態(tài)數據簡單許多,直接一層層剝取到想要的數據即可。這里獲取電影id、電影名、電影詳情頁鏈接。
代碼執(zhí)行部分結果為:
??定義一個get_detail_data函數,傳入獲取到的id、電影名、詳情頁鏈接,繼續(xù)寫請求規(guī)則。
response.status_code: 返回狀態(tài)碼
def get_detail_data(id,title,href_url):'''獲取電影詳情頁數據:param id: # 電影id:param title: # 電影名:param href_url: # 電影詳情鏈接:return:'''response = requests.get(url=href_url,headers=HEADERS) # 請求詳情頁if response.status_code == 200: # 判斷是否請求成功text = response.text # 編碼print(text)else:print('詳情頁請求失敗。。。')代碼部分輸出結果為:
3.1、xpath語法
??請求詳情頁成功,進而提取詳情數據。首先導入parsel庫,即import parsel。將請求編譯好的源碼轉化為Selector對象,以便于xpath或css語法提取數據。
import parsel sele = parsel.Selector(text) # 轉化為Selector對象??使用xpath語法提取數據,可在網頁查看中按Ctrl + 快捷鍵,在出現(xiàn)的小框框內寫xpath或者css語法提取數據。例如:導演。
??以此類推,剩余有規(guī)律的屬性字段皆可用xpath語法提取數據。例如:導演、編劇、電影評分、主演、電影類型、簡介。
’’.join(): 將列表數據合并成字符串數據
extract_first()與get(): 同為獲取一個,返回字符串型數據。
extract與getall(): 同為獲取全部,返回列表型數據。
3.2、re正則
??正則表達式概念: 正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式是對字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,用來檢索、替換那些符合規(guī)則的文本,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。
??剩余的字段數據:制片地區(qū)、語言、上映日期、片長、IMBD鏈接均在網頁中屬于不規(guī)律字段,若繼續(xù)使用xpath語法提取這些字段信息的話,結果確實每個電影的字段順序對應不上,即出現(xiàn) “片長字段” 出現(xiàn)的是 “語言” 信息。
??那么這些不規(guī)律的字段數據可以使用re正則匹配提取,導入模塊import re。注意:re正則使用的是源碼匹配,而不是parsel轉化的Selector對象。這里以“制片地區(qū)”字段為例:
re.findall: 提取全部,為列表型數據,則最后[0]提取第一個數據。
pro_areas: 變量,為匹配的正則表達式。
text: 網頁源碼,提供正則匹配文本。
代碼輸出結果無誤,re提取成功。
??以此類推,提取的所有字段結果并將其填入空列表中。
print('id:',id+'\n','電影名:',title+'\n','導演:',director+'\n','編劇:',scriptwriter+'\n','電影評分:',movie_rating + '\n','主演:', protagonist + '\n', '電影類型:', movie_type + '\n','語言:', Language + '\n','制片地區(qū):', pro_area + '\n', '上映日期:',movie_pubdate + '\n','片長:', length + '\n', 'IMBD鏈接:', IMBD_link + '\n', '電影簡介:',movie_summary ) print('*' * 150) data_list.append([id, title, director, scriptwriter, movie_rating, protagonist, movie_type, pro_area,movie_pubdate, length, IMBD_link, movie_summary])代碼輸入部分結果為:
四、存入Excel
4.1、Excel表頭
openpyxl.Workbook(): 創(chuàng)建excel簿
wb.create_sheet(簿名): 寫入簿名
row: 行
column: 列
value: 值
wb.save(文件名): 保存文件名
??定義save_excel函數,用于寫Excel存儲數據功能。
def save_excel(data_list):wb = openpyxl.load_workbook('豆瓣高分電影.xlsx')sheet = wb['movie'] # 選擇簿名for d in data_list: # 遍歷列表數據sheet.append(d) # 寫入數據wb.save('豆瓣高分電影.xlsx') # 保存??“豆瓣高分”電影分類共25頁,每頁至多20條數據。運行保存的文件結果為500條數據,成功提取無誤。
五、項目總結
??豆瓣電影爬蟲需要注意的地方有兩點:
???一、反爬機制
????豆瓣的反爬措施是封禁頻繁請求ip,少則幾個小時,多則一天。使用time模塊 time.sleep睡眠1至2秒即可。
???二、匹配規(guī)則
????電影詳情頁字段的匹配,有規(guī)律的字段數據則使用xpath語法提取,反之無規(guī)律且錯亂位置的則使用re正則匹配提取。
??此次項目到此結束,若有小伙伴有疑惑的地方,可在評論區(qū)留言,小編看到會盡快一一回復;此項目有需要改進的地方,也請大佬不吝賜教,感謝!
注:本項目僅用于學習用途,若用于商業(yè)用途,請自行負責!!
總結
以上是生活随笔為你收集整理的豆瓣电影(一):网络爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 湖北省水系数据,水库数据,线要素和面要素
- 下一篇: Scrapy爬取豆瓣小组图片