Python爬蟲入門教程01之爬取豆瓣Top電影
前言
本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,如有問題請(qǐng)及時(shí)聯(lián)系我們以作處理
基本開發(fā)環(huán)境
- Python 3.6
- Pycharm
相關(guān)模塊的使用
- requests
- parsel
- csv
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
爬蟲基本思路
一、明確需求
爬取豆瓣Top250排行電影信息
- 電影名字
- 導(dǎo)演、主演
- 年份、國家、類型
- 評(píng)分、評(píng)價(jià)人數(shù)
- 電影簡(jiǎn)介
二、發(fā)送請(qǐng)求
Python中的大量開源的模塊使得編碼變的特別簡(jiǎn)單,我們寫爬蟲第一個(gè)要了解的模塊就是requests。
請(qǐng)求url地址,使用get請(qǐng)求,添加headers請(qǐng)求頭,模擬瀏覽器請(qǐng)求,網(wǎng)頁會(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ò)誤)
常見狀態(tài)碼
- 200 - 服務(wù)器成功返回網(wǎng)頁,客戶端請(qǐng)求已成功。
- 302 - 對(duì)象臨時(shí)移動(dòng)。服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請(qǐng)求,但請(qǐng)求者應(yīng)繼續(xù)使用原有位置來進(jìn)行以后的請(qǐng)求。
- 304 - 屬于重定向。自上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁內(nèi)容。
- 401 - 未授權(quán)。請(qǐng)求要求身份驗(yàn)證。 對(duì)于需要登錄的網(wǎng)頁,服務(wù)器可能返回此響應(yīng)。
- 404 - 未找到。服務(wù)器找不到請(qǐng)求的網(wǎng)頁。
- 503 (服務(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)頁返回的是response對(duì)象
response.text:
獲取網(wǎng)頁文本數(shù)據(jù)
response.json:
獲取網(wǎng)頁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
無論是在之前的文章,還是說之后的爬蟲系列文章,我都會(huì)使用 parsel
這個(gè)解析庫,無它就是覺得它比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 類屬性 下面的 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', '美國', '犯罪 劇情'] movie_time = movie_info[0] # 電影上映時(shí)間 movie_country = movie_info[1] # 哪個(gè)國家的電影 movie_type = movie_info[2] # 什么類型的電影 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, '拍攝國家': movie_country, '電影類型': 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ǔ)是很有必要的。不然你連代碼都不知道為什么要這樣寫。
五、保存數(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í)間', '拍攝國家', '電影類型', '電影評(píng)分', '評(píng)價(jià)人數(shù)', '電影概述']) csv_writer.writeheader() # 寫入表頭
這就是爬取了數(shù)據(jù)保存到本地了。這只是一頁的數(shù)據(jù),爬取數(shù)據(jù)肯定不只是爬取一頁數(shù)據(jù)。想要實(shí)現(xiàn)多頁數(shù)據(jù)爬取,就要分析網(wǎng)頁數(shù)據(jù)的url地址變化規(guī)律。
可以清楚看到每頁url地址是 25 遞增的,使用for循環(huán)實(shí)現(xiàn)翻頁操作
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)演、主演 年份、國家、類型 評(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í)間', '拍攝國家', '電影類型', '電影評(píng)分', '評(píng)價(jià)人數(shù)', '電影概述']) csv_writer.writeheader() # 寫入表頭 # 模擬瀏覽器發(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 類屬性 下面的 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', '美國', '犯罪 劇情'] movie_time = movie_info[0] # 電影上映時(shí)間 movie_country = movie_info[1] # 哪個(gè)國家的電影 movie_type = movie_info[2] # 什么類型的電影 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, '拍攝國家': movie_country, '電影類型': 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爬蟲入門教程01之爬取豆瓣Top電影的文章就介紹到這了,更多相關(guān)Python爬取豆瓣Top電影內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)在數(shù)字中添加千位分隔符的方法小結(jié)
在數(shù)據(jù)處理和數(shù)據(jù)可視化中,經(jīng)常需要對(duì)大數(shù)值進(jìn)行格式化,其中一種常見的需求是在數(shù)字中添加千位分隔符,本文為大家整理了三種常見方法,希望對(duì)大家有所幫助2024-01-01利用Python進(jìn)行網(wǎng)絡(luò)爬蟲和數(shù)據(jù)抓取的代碼示例
在當(dāng)今數(shù)字化時(shí)代,數(shù)據(jù)是無處不在的,從市場(chǎng)趨勢(shì)到個(gè)人偏好,從社交媒體活動(dòng)到商業(yè)智能,數(shù)據(jù)扮演著關(guān)鍵的角色,Python提供了一套強(qiáng)大而靈活的工具,使得網(wǎng)絡(luò)爬蟲和數(shù)據(jù)抓取成為可能,本文將深入探討如何利用Python進(jìn)行網(wǎng)絡(luò)爬蟲和數(shù)據(jù)抓取,為您打開數(shù)據(jù)世界的大門2024-05-05python通過nmap掃描在線設(shè)備并嘗試AAA登錄(實(shí)例代碼)
這篇文章主要介紹了python通過nmap掃描在線設(shè)備并嘗試AAA登錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12淺談python腳本設(shè)置運(yùn)行參數(shù)的方法
今天小編就為大家分享一篇淺談python腳本設(shè)置運(yùn)行參數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12一文輕松掌握python語言命名規(guī)范規(guī)則
這篇文章主要介紹了一文輕松掌握python語言命名規(guī)范規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Python學(xué)習(xí)筆記之讀取文件、OS模塊、異常處理、with as語法示例
這篇文章主要介紹了Python學(xué)習(xí)筆記之讀取文件、OS模塊、異常處理、with as語法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Python針對(duì)文件、目錄的讀取、異常處理等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06python的numpy模塊實(shí)現(xiàn)邏輯回歸模型
這篇文章主要為大家詳細(xì)介紹了python的numpy模塊實(shí)現(xiàn)邏輯回歸模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07在Lighttpd服務(wù)器中運(yùn)行Django應(yīng)用的方法
這篇文章主要介紹了在Lighttpd服務(wù)器中運(yùn)行Django應(yīng)用的方法,本文所采用的是最流行的FastCGI模塊,包括同時(shí)運(yùn)行多個(gè)Django應(yīng)用的方法,需要的朋友可以參考下2015-07-07