前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理,
PS:如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取
python免費學習資料以及群交流解答點擊即可加入
基本開發環境
- Python 3.6
- Pycharm
相關模塊的使用
- requests
- parsel
- csv
安裝Python并添加到環境變數,pip安裝需要的相關模塊即可,
爬蟲基本思路

一、明確需求
爬取豆瓣Top250排行電影資訊
- 電影名字
- 導演、主演
- 年份、國家、型別
- 評分、評價人數
- 電影簡介

二、發送請求
Python中的大量開源的模塊使得編碼變的特別簡單,我們寫爬蟲第一個要了解的模塊就是requests,


請求url地址,使用get請求,添加headers請求頭,模擬瀏覽器請求,網頁會給你回傳response物件
# 模擬瀏覽器發送請求
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是狀態碼,表示請求成功
2xx (成功)
3xx (重定向)
4xx(請求錯誤)
5xx(服務器錯誤)
常見狀態碼
- 200 - 服務器成功回傳網頁,客戶端請求已成功,
- 302 - 物件臨時移動,服務器目前從不同位置的網頁回應請求,但請求者應繼續使用原有位置來進行以后的請求,
- 304 - 屬于重定向,自上次請求后,請求的網頁未修改過,服務器回傳此回應時,不會回傳網頁內容,
- 401 - 未授權,請求要求身份驗證, 對于需要登錄的網頁,服務器可能回傳此回應,
- 404 - 未找到,服務器找不到請求的網頁,
- 503 (服務不可用) 服務器目前無法使用(由于超載或停機維護),通常,這只是暫時狀態,
三、獲取資料
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) 請求網頁回傳的是response物件
response.text: 獲取網頁文本資料
response.json: 獲取網頁json資料
這兩個是用的最多的,當然還有其他的
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
四、決議資料
常用決議資料方法: 正則運算式、css選擇器、xpath、lxml...
常用決議模塊:bs4、parsel...
我們使用的是 parsel 無論是在之前的文章,還是說之后的爬蟲系列文章,我都會使用 parsel 這個決議庫,無它就是覺得它比bs4香,
parsel 是第三方模塊,pip install parsel 安裝即可
parsel 可以使用 css、xpath、re決議方法

所有的電影資訊都包含在 li 標簽當中,
# 把 response.text 文本資料轉換成 selector 物件
selector = parsel.Selector(response.text)
# 獲取所有li標簽
lis = selector.css('.grid_view li')
# 遍歷出每個li標簽內容
for li in lis:
# 獲取電影標題 hd 類屬性 下面的 a 標簽下面的 第一個span標簽里面的文本資料 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() # 評價人數
summary = li.css('.inq::text').get() # 一句話概述
dit = {
'電影名字': title,
'參演人員': star,
'上映時間': movie_time,
'拍攝國家': movie_country,
'電影型別': movie_type,
'電影評分': rating_num,
'評價人數': people,
'電影概述': summary,
}
# pprint 格式化輸出模塊
pprint.pprint(dit)

以上的知識點使用到了
- parsel 決議模塊的方法
- for 回圈
- css 選擇器
- 字典的創建
- 串列取值
- 字串的方法:分割、替換等
- pprint 格式化輸出模塊
所以扎實基礎是很有必要的,不然你連代碼都不知道為什么要這樣寫,
五、保存資料(資料持久化)
常用的保存資料方法 with open
像豆瓣電影資訊這樣的資料,保存到Excel表格里面會更好,
所以需要使用到 csv 模塊
# csv模塊保存資料到Excel
f = open('豆瓣電影資料.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['電影名字', '參演人員', '上映時間', '拍攝國家', '電影型別',
'電影評分', '評價人數', '電影概述'])
csv_writer.writeheader() # 寫入表頭


這就是爬取了資料保存到本地了,這只是一頁的資料,爬取資料肯定不只是爬取一頁資料,想要實作多頁資料爬取,就要分析網頁資料的url地址變化規律,

可以清楚看到每頁url地址是 25 遞增的,使用for回圈實作翻頁操作
for page in range(0, 251, 25):
url = f'https://movie.douban.com/top250?start={page}&filter='
完整實作代碼
""""""
import pprint
import requests
import parsel
import csv
'''
1、明確需求:
爬取豆瓣Top250排行電影資訊
電影名字
導演、主演
年份、國家、型別
評分、評價人數
電影簡介
'''
# csv模塊保存資料到Excel
f = open('豆瓣電影資料.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['電影名字', '參演人員', '上映時間', '拍攝國家', '電影型別',
'電影評分', '評價人數', '電影概述'])
csv_writer.writeheader() # 寫入表頭
# 模擬瀏覽器發送請求
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 文本資料轉換成 selector 物件
selector = parsel.Selector(response.text)
# 獲取所有li標簽
lis = selector.css('.grid_view li')
# 遍歷出每個li標簽內容
for li in lis:
# 獲取電影標題 hd 類屬性 下面的 a 標簽下面的 第一個span標簽里面的文本資料 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() # 評價人數
summary = li.css('.inq::text').get() # 一句話概述
dit = {
'電影名字': title,
'參演人員': star,
'上映時間': movie_time,
'拍攝國家': movie_country,
'電影型別': movie_type,
'電影評分': rating_num,
'評價人數': people,
'電影概述': summary,
}
pprint.pprint(dit)
csv_writer.writerow(dit)
實作效果


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/251410.html
標籤:Python
