前言
本文的文字及圖片來源于網(wǎng)絡(luò),僅供學習、交流使用,不具有任何商業(yè)用途,如有問題請及時聯(lián)系我們以作處理
基本開發(fā)環(huán)境
相關(guān)模塊的使用
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
爬蟲基本思路
![](/d/20211017/3e8e12a5481dbaeea5c7664bbb0783ae.gif)
一、明確需求
爬取豆瓣Top250排行電影信息
- 電影名字
- 導演、主演
- 年份、國家、類型
- 評分、評價人數(shù)
- 電影簡介
二、發(fā)送請求
Python中的大量開源的模塊使得編碼變的特別簡單,我們寫爬蟲第一個要了解的模塊就是requests。
![](/d/20211017/57ce41e9c5a933d178785fa5bed27a2a.gif)
![](/d/20211017/9f250d0f4c109b180b30e9b05c00abad.gif)
請求url地址,使用get請求,添加headers請求頭,模擬瀏覽器請求,網(wǎng)頁會給你返回response對象
# 模擬瀏覽器發(fā)送請求
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)
![](/d/20211017/799ab65ec8201ad4ebf01311cf0b76f6.gif)
200是狀態(tài)碼,表示請求成功
2xx (成功)
3xx (重定向)
4xx(請求錯誤)
5xx(服務器錯誤)
常見狀態(tài)碼
- 200 - 服務器成功返回網(wǎng)頁,客戶端請求已成功。
- 302 - 對象臨時移動。服務器目前從不同位置的網(wǎng)頁響應請求,但請求者應繼續(xù)使用原有位置來進行以后的請求。
- 304 - 屬于重定向。自上次請求后,請求的網(wǎng)頁未修改過。服務器返回此響應時,不會返回網(wǎng)頁內(nèi)容。
- 401 - 未授權(quán)。請求要求身份驗證。 對于需要登錄的網(wǎng)頁,服務器可能返回此響應。
- 404 - 未找到。服務器找不到請求的網(wǎng)頁。
- 503 (服務不可用) 服務器目前無法使用(由于超載或停機維護)。
通常,這只是暫時狀態(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)
![](/d/20211017/df88e1bc05e63aba476ac5f29c50f0ce.gif)
requests.get(url=url, headers=headers)
請求網(wǎng)頁返回的是response對象
response.text:
獲取網(wǎng)頁文本數(shù)據(jù)
response.json:
獲取網(wǎng)頁json數(shù)據(jù)
這兩個是用的最多的,當然還有其他的
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ù)方法: 正則表達式、css選擇器、xpath、lxml…
常用解析模塊:bs4、parsel…
我們使用的是 parsel
無論是在之前的文章,還是說之后的爬蟲系列文章,我都會使用 parsel
這個解析庫,無它就是覺得它比bs4香。
parsel
是第三方模塊,pip install parsel
安裝即可
parsel 可以使用 css、xpath、re解析方法
![](/d/20211017/e33d8b36828f1ecce9a1303c79edadb3.gif)
所有的電影信息都包含在 li
標簽當中。
# 把 response.text 文本數(shù)據(jù)轉(zhuǎn)換成 selector 對象
selector = parsel.Selector(response.text)
# 獲取所有l(wèi)i標簽
lis = selector.css('.grid_view li')
# 遍歷出每個li標簽內(nèi)容
for li in lis:
# 獲取電影標題 hd 類屬性 下面的 a 標簽下面的 第一個span標簽里面的文本數(shù)據(jù) get()輸出形式是 字符串獲取一個 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', '美國', '犯罪 劇情']
movie_time = movie_info[0] # 電影上映時間
movie_country = movie_info[1] # 哪個國家的電影
movie_type = movie_info[2] # 什么類型的電影
rating_num = li.css('.rating_num::text').get() # 電影評分
people = li.css('.star span:nth-child(4)::text').get() # 評價人數(shù)
summary = li.css('.inq::text').get() # 一句話概述
dit = {
'電影名字': title,
'參演人員': star,
'上映時間': movie_time,
'拍攝國家': movie_country,
'電影類型': movie_type,
'電影評分': rating_num,
'評價人數(shù)': people,
'電影概述': summary,
}
# pprint 格式化輸出模塊
pprint.pprint(dit)
![](/d/20211017/87f408352f51332ec0f05a581d7104ac.gif)
以上的知識點使用到了
- parsel 解析模塊的方法
- for 循環(huán)
- css 選擇器
- 字典的創(chuàng)建
- 列表取值
- 字符串的方法:分割、替換等
- pprint 格式化輸出模塊
所以扎實基礎(chǔ)是很有必要的。不然你連代碼都不知道為什么要這樣寫。
五、保存數(shù)據(jù)(數(shù)據(jù)持久化)
常用的保存數(shù)據(jù)方法 with open
像豆瓣電影信息這樣的數(shù)據(jù),保存到Excel表格里面會更好。
所以需要使用到 csv
模塊
# csv模塊保存數(shù)據(jù)到Excel
f = open('豆瓣電影數(shù)據(jù).csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['電影名字', '參演人員', '上映時間', '拍攝國家', '電影類型',
'電影評分', '評價人數(shù)', '電影概述'])
csv_writer.writeheader() # 寫入表頭
![](/d/20211017/f848da0e5ab44cf4a5b4987ab7e80cce.gif)
![](/d/20211017/ef4ac0a46d5da36ff07d8241f62eda06.gif)
這就是爬取了數(shù)據(jù)保存到本地了。這只是一頁的數(shù)據(jù),爬取數(shù)據(jù)肯定不只是爬取一頁數(shù)據(jù)。想要實現(xiàn)多頁數(shù)據(jù)爬取,就要分析網(wǎng)頁數(shù)據(jù)的url地址變化規(guī)律。
![](/d/20211017/a0a40f45053da04f14d3762c9ec0a3d4.gif)
可以清楚看到每頁url地址是 25 遞增的,使用for循環(huán)實現(xiàn)翻頁操作
for page in range(0, 251, 25):
url = f'https://movie.douban.com/top250?start={page}filter='
完整實現(xiàn)代碼
""""""
import pprint
import requests
import parsel
import csv
'''
1、明確需求:
爬取豆瓣Top250排行電影信息
電影名字
導演、主演
年份、國家、類型
評分、評價人數(shù)
電影簡介
'''
# csv模塊保存數(shù)據(jù)到Excel
f = open('豆瓣電影數(shù)據(jù).csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['電影名字', '參演人員', '上映時間', '拍攝國家', '電影類型',
'電影評分', '評價人數(shù)', '電影概述'])
csv_writer.writeheader() # 寫入表頭
# 模擬瀏覽器發(fā)送請求
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 對象
selector = parsel.Selector(response.text)
# 獲取所有l(wèi)i標簽
lis = selector.css('.grid_view li')
# 遍歷出每個li標簽內(nèi)容
for li in lis:
# 獲取電影標題 hd 類屬性 下面的 a 標簽下面的 第一個span標簽里面的文本數(shù)據(jù) get()輸出形式是 字符串獲取一個 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', '美國', '犯罪 劇情']
movie_time = movie_info[0] # 電影上映時間
movie_country = movie_info[1] # 哪個國家的電影
movie_type = movie_info[2] # 什么類型的電影
rating_num = li.css('.rating_num::text').get() # 電影評分
people = li.css('.star span:nth-child(4)::text').get() # 評價人數(shù)
summary = li.css('.inq::text').get() # 一句話概述
dit = {
'電影名字': title,
'參演人員': star,
'上映時間': movie_time,
'拍攝國家': movie_country,
'電影類型': movie_type,
'電影評分': rating_num,
'評價人數(shù)': people,
'電影概述': summary,
}
pprint.pprint(dit)
csv_writer.writerow(dit)
實現(xiàn)效果
![](/d/20211017/2c3e04ed5e2f625fb0651c779eea00c4.gif)
![](/d/20211017/b0eaa33c2562c3f500776a8e8898722e.gif)
到此這篇關(guān)于Python爬蟲入門教程01之爬取豆瓣Top電影的文章就介紹到這了,更多相關(guān)Python爬取豆瓣Top電影內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python爬蟲獲取豆瓣電影并寫入excel
- Python爬蟲實現(xiàn)的根據(jù)分類爬取豆瓣電影信息功能示例
- python爬蟲豆瓣網(wǎng)的模擬登錄實現(xiàn)
- Python爬蟲——爬取豆瓣電影Top250代碼實例
- 一個簡單的python爬蟲程序 爬取豆瓣熱度Top100以內(nèi)的電影信息
- Python爬蟲實戰(zhàn):分析《戰(zhàn)狼2》豆瓣影評
- Python制作豆瓣圖片的爬蟲
- 實踐Python的爬蟲框架Scrapy來抓取豆瓣電影TOP250
- 編寫Python爬蟲抓取豆瓣電影TOP100及用戶頭像的方法
- python 開心網(wǎng)和豆瓣日記爬取的小爬蟲