Python爬蟲入門教程01之爬取豆瓣Top電影

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理

基本開發環境

  •  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)

實現效果

在這裡插入圖片描述
在這裡插入圖片描述

到此這篇關於Python爬蟲入門教程01之爬取豆瓣Top電影的文章就介紹到這瞭,更多相關Python爬取豆瓣Top電影內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: