Python爬蟲(chóng)入門(mén)教程01之爬取豆瓣Top電影
前言
本文的文字及圖片來(lái)源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,如有問(wèn)題請(qǐng)及時(shí)聯(lián)系我們以作處理
基本開(kāi)發(fā)環(huán)境
- Python 3.6
- Pycharm
相關(guān)模塊的使用
- requests
- parsel
- csv
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
爬蟲(chóng)基本思路

一、明確需求
爬取豆瓣Top250排行電影信息
- 電影名字
- 導(dǎo)演、主演
- 年份、國(guó)家、類(lèi)型
- 評(píng)分、評(píng)價(jià)人數(shù)
- 電影簡(jiǎn)介
二、發(fā)送請(qǐng)求
Python中的大量開(kāi)源的模塊使得編碼變的特別簡(jiǎn)單,我們寫(xiě)爬蟲(chóng)第一個(gè)要了解的模塊就是requests。


請(qǐng)求url地址,使用get請(qǐng)求,添加headers請(qǐng)求頭,模擬瀏覽器請(qǐng)求,網(wǎng)頁(yè)會(huì)給你返回response對(duì)象
# 模擬瀏覽器發(fā)送請(qǐng)求
import requests
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
print(response)

200是狀態(tài)碼,表示請(qǐng)求成功
2xx (成功)
3xx (重定向)
4xx(請(qǐng)求錯(cuò)誤)
5xx(服務(wù)器錯(cuò)誤)
常見(jiàn)狀態(tài)碼
- 200 - 服務(wù)器成功返回網(wǎng)頁(yè),客戶端請(qǐng)求已成功。
- 302 - 對(duì)象臨時(shí)移動(dòng)。服務(wù)器目前從不同位置的網(wǎng)頁(yè)響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來(lái)進(jìn)行以后的請(qǐng)求。
- 304 - 屬于重定向。自上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容。
- 401 - 未授權(quán)。請(qǐng)求要求身份驗(yàn)證。 對(duì)于需要登錄的網(wǎng)頁(yè),服務(wù)器可能返回此響應(yīng)。
- 404 - 未找到。服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。
- 503 (服務(wù)不可用) 服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))。
通常,這只是暫時(shí)狀態(tài)。
三、獲取數(shù)據(jù)
import requests
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
print(response.text)

requests.get(url=url, headers=headers) 請(qǐng)求網(wǎng)頁(yè)返回的是response對(duì)象
response.text: 獲取網(wǎng)頁(yè)文本數(shù)據(jù)
response.json: 獲取網(wǎng)頁(yè)json數(shù)據(jù)
這兩個(gè)是用的最多的,當(dāng)然還有其他的
apparent_encoding cookies history iter_lines ok close elapsed is_permanent_redirect json raise_for_status connection encoding is_redirect links raw content headers iter_content next reason url
四、解析數(shù)據(jù)
常用解析數(shù)據(jù)方法: 正則表達(dá)式、css選擇器、xpath、lxml…
常用解析模塊:bs4、parsel…
我們使用的是 parsel 無(wú)論是在之前的文章,還是說(shuō)之后的爬蟲(chóng)系列文章,我都會(huì)使用 parsel 這個(gè)解析庫(kù),無(wú)它就是覺(jué)得它比bs4香。
parsel 是第三方模塊,pip install parsel 安裝即可
parsel 可以使用 css、xpath、re解析方法

所有的電影信息都包含在 li 標(biāo)簽當(dāng)中。
# 把 response.text 文本數(shù)據(jù)轉(zhuǎn)換成 selector 對(duì)象
selector = parsel.Selector(response.text)
# 獲取所有l(wèi)i標(biāo)簽
lis = selector.css('.grid_view li')
# 遍歷出每個(gè)li標(biāo)簽內(nèi)容
for li in lis:
# 獲取電影標(biāo)題 hd 類(lèi)屬性 下面的 a 標(biāo)簽下面的 第一個(gè)span標(biāo)簽里面的文本數(shù)據(jù) get()輸出形式是 字符串獲取一個(gè) getall() 輸出形式是列表獲取所有
title = li.css('.hd a span:nth-child(1)::text').get() # get()輸出形式是 字符串
movie_list = li.css('.bd p:nth-child(1)::text').getall() # getall() 輸出形式是列表
star = movie_list[0].strip().replace('\xa0\xa0\xa0', '').replace('/...', '')
movie_info = movie_list[1].strip().split('\xa0/\xa0') # ['1994', '美國(guó)', '犯罪 劇情']
movie_time = movie_info[0] # 電影上映時(shí)間
movie_country = movie_info[1] # 哪個(gè)國(guó)家的電影
movie_type = movie_info[2] # 什么類(lèi)型的電影
rating_num = li.css('.rating_num::text').get() # 電影評(píng)分
people = li.css('.star span:nth-child(4)::text').get() # 評(píng)價(jià)人數(shù)
summary = li.css('.inq::text').get() # 一句話概述
dit = {
'電影名字': title,
'參演人員': star,
'上映時(shí)間': movie_time,
'拍攝國(guó)家': movie_country,
'電影類(lèi)型': movie_type,
'電影評(píng)分': rating_num,
'評(píng)價(jià)人數(shù)': people,
'電影概述': summary,
}
# pprint 格式化輸出模塊
pprint.pprint(dit)

以上的知識(shí)點(diǎn)使用到了
- parsel 解析模塊的方法
- for 循環(huán)
- css 選擇器
- 字典的創(chuàng)建
- 列表取值
- 字符串的方法:分割、替換等
- pprint 格式化輸出模塊
所以扎實(shí)基礎(chǔ)是很有必要的。不然你連代碼都不知道為什么要這樣寫(xiě)。
五、保存數(shù)據(jù)(數(shù)據(jù)持久化)
常用的保存數(shù)據(jù)方法 with open
像豆瓣電影信息這樣的數(shù)據(jù),保存到Excel表格里面會(huì)更好。
所以需要使用到 csv 模塊
# csv模塊保存數(shù)據(jù)到Excel
f = open('豆瓣電影數(shù)據(jù).csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['電影名字', '參演人員', '上映時(shí)間', '拍攝國(guó)家', '電影類(lèi)型',
'電影評(píng)分', '評(píng)價(jià)人數(shù)', '電影概述'])
csv_writer.writeheader() # 寫(xiě)入表頭


這就是爬取了數(shù)據(jù)保存到本地了。這只是一頁(yè)的數(shù)據(jù),爬取數(shù)據(jù)肯定不只是爬取一頁(yè)數(shù)據(jù)。想要實(shí)現(xiàn)多頁(yè)數(shù)據(jù)爬取,就要分析網(wǎng)頁(yè)數(shù)據(jù)的url地址變化規(guī)律。

可以清楚看到每頁(yè)url地址是 25 遞增的,使用for循環(huán)實(shí)現(xiàn)翻頁(yè)操作
for page in range(0, 251, 25):
url = f'https://movie.douban.com/top250?start={page}&filter='
完整實(shí)現(xiàn)代碼
""""""
import pprint
import requests
import parsel
import csv
'''
1、明確需求:
爬取豆瓣Top250排行電影信息
電影名字
導(dǎo)演、主演
年份、國(guó)家、類(lèi)型
評(píng)分、評(píng)價(jià)人數(shù)
電影簡(jiǎn)介
'''
# csv模塊保存數(shù)據(jù)到Excel
f = open('豆瓣電影數(shù)據(jù).csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['電影名字', '參演人員', '上映時(shí)間', '拍攝國(guó)家', '電影類(lèi)型',
'電影評(píng)分', '評(píng)價(jià)人數(shù)', '電影概述'])
csv_writer.writeheader() # 寫(xiě)入表頭
# 模擬瀏覽器發(fā)送請(qǐng)求
for page in range(0, 251, 25):
url = f'https://movie.douban.com/top250?start={page}&filter='
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
# 把 response.text 文本數(shù)據(jù)轉(zhuǎn)換成 selector 對(duì)象
selector = parsel.Selector(response.text)
# 獲取所有l(wèi)i標(biāo)簽
lis = selector.css('.grid_view li')
# 遍歷出每個(gè)li標(biāo)簽內(nèi)容
for li in lis:
# 獲取電影標(biāo)題 hd 類(lèi)屬性 下面的 a 標(biāo)簽下面的 第一個(gè)span標(biāo)簽里面的文本數(shù)據(jù) get()輸出形式是 字符串獲取一個(gè) getall() 輸出形式是列表獲取所有
title = li.css('.hd a span:nth-child(1)::text').get() # get()輸出形式是 字符串
movie_list = li.css('.bd p:nth-child(1)::text').getall() # getall() 輸出形式是列表
star = movie_list[0].strip().replace('\xa0\xa0\xa0', '').replace('/...', '')
movie_info = movie_list[1].strip().split('\xa0/\xa0') # ['1994', '美國(guó)', '犯罪 劇情']
movie_time = movie_info[0] # 電影上映時(shí)間
movie_country = movie_info[1] # 哪個(gè)國(guó)家的電影
movie_type = movie_info[2] # 什么類(lèi)型的電影
rating_num = li.css('.rating_num::text').get() # 電影評(píng)分
people = li.css('.star span:nth-child(4)::text').get() # 評(píng)價(jià)人數(shù)
summary = li.css('.inq::text').get() # 一句話概述
dit = {
'電影名字': title,
'參演人員': star,
'上映時(shí)間': movie_time,
'拍攝國(guó)家': movie_country,
'電影類(lèi)型': movie_type,
'電影評(píng)分': rating_num,
'評(píng)價(jià)人數(shù)': people,
'電影概述': summary,
}
pprint.pprint(dit)
csv_writer.writerow(dit)
實(shí)現(xiàn)效果


到此這篇關(guān)于Python爬蟲(chóng)入門(mén)教程01之爬取豆瓣Top電影的文章就介紹到這了,更多相關(guān)Python爬取豆瓣Top電影內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)Python selenium自動(dòng)化網(wǎng)頁(yè)抓取器
本篇文章給大家介紹了Python selenium自動(dòng)化網(wǎng)頁(yè)抓取器的實(shí)例應(yīng)用以及知識(shí)點(diǎn)分析,有需要的參考學(xué)習(xí)下。2018-01-01
python 中關(guān)于pycharm選擇運(yùn)行環(huán)境的問(wèn)題
這篇文章主要介紹了python 中關(guān)于pycharm選擇運(yùn)行環(huán)境的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
學(xué)習(xí)Python,你還不知道m(xù)ain函數(shù)嗎
Python?中的?main?函數(shù)充當(dāng)程序的執(zhí)行點(diǎn),在?Python?編程中定義?main?函數(shù)是啟動(dòng)程序執(zhí)行的必要條件。本文就來(lái)帶大家深入了解一下main函數(shù),感興趣的可以了解一下2022-09-09
Python 把序列轉(zhuǎn)換為元組的函數(shù)tuple方法
今天小編就為大家分享一篇Python 把序列轉(zhuǎn)換為元組的函數(shù)tuple方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
同時(shí)安裝了 Python 3.8.20 和 Python 3.12.3
文章介紹了在Linux系統(tǒng)中通過(guò)update-alternatives管理多個(gè)Python版本的方法,指導(dǎo)如何選擇默認(rèn)版本并解決切換時(shí)的錯(cuò)誤問(wèn)題,同時(shí)提到Windows環(huán)境下需采用其他方式調(diào)整默認(rèn)Python版本,感興趣的朋友一起看看吧2025-07-07
Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說(shuō)明
這篇文章主要給大家分享的是Python線程之同步機(jī)制實(shí)際應(yīng)用場(chǎng)景舉例說(shuō)明,銀行轉(zhuǎn)賬小栗子供大家參考學(xué)習(xí),希望對(duì)你有一定的幫助2022-02-02

