隨便說幾句
打完游戲
(帶妹兒)、和學習之余,最喜歡看電影啦~
開學了,無聊的時候挑一部高分電影欣賞欣賞
而豆瓣電影:
號稱提供最新的電影介紹及評論包括上映影片的影訊,
來這里找 高分的電影再好不過,
'''
博文說明:
撰寫時間: 2021-03-01
爬取入口url: https://movie.douban.com/top250
用到的庫:request,fake-useragent,BeautifulSoup csv
工具:python 3.9、Pycharm、Chorme Browser
采用: select 方法來定位標簽
爬取如下欄位:
{
'排名':rank,
'標題': title,
'簡介': info,
'影評':quote,
'電影評分': score,
'詳情URL':movie_url,
'照片URL': movie_pic,
}
保存到: .csv 格式
'''
假設用到的庫、工具都準備好了、也會使用啦,那么…
一、首先當然是分析網站
1.用打開website 豆瓣TOP 250 https://movie.douban.com/top250
2.按F12 打開chorme Developer Tools (開發者工具)
3.然后這樣點Network 重繪頁面,按F5 或者Ctrl + R,于是就會記錄到network activity…
也就是記錄
頁面上的網路請求的詳情資訊,
從發起網頁頁面請求Request后分析HTTP請求后得到的各個請求資源資訊
(包括狀態、資源型別、大小、所用時間、Request和Response等)

一般第一個記錄就是website url對應的web回應

4.然后點開top250,查看請求頭Headers和預覽Previw一下top250的 “樣子”



可以看到Top 250 Preview的 “樣子(右邊)”,和 瀏覽器下的樣子(左邊)
是比較相似的
在Top 250里面有我們需要的電影串列,頁數,
為什么要查看
Top 250這個包呢?
因為有時候,請求的url所回傳的response里面,并沒有,自以為有的,所需要的東西
當沒有的時候,就要考慮抓取別的"Top 250",也就是抓包了,
目前看來爬取豆瓣Top250不用抓包,比較簡單,
電影串列就在請求的url(https://movie.douban.com/top250)里,
5.分析電影的html標簽
有兩種定位頁面物件(比如網頁的圖片、文字)的辦法:
選中物件,滑鼠右鍵 ——> 檢查

F12,打開開發者工具, 點一個左上角的按鈕,再去選中物件


6.分析翻頁
我復制了一下1~4頁,翻頁邏輯一目了然,

我們可以大膽的猜測:
這個start引數值,就是從哪個電影開始顯示,
而且不一定要25、25地遞增,
下面start=249,直接就回傳了最后一部電影
當然,start >= 250的時候就沒有電影回傳了

可以發現,每次最多回傳25部電影


而且 &filter= 是無效引數,可以刪掉~
是不是so easy~ ~!!
二、磨刀不誤砍柴工,開始碼代碼
先上代碼
import requests
from bs4 import BeautifulSoup as bs
from fake_useragent import UserAgent
import csv
def get_html(url):
ua = UserAgent()
try:
r = requests.get(url,headers={'User-Agent':ua.random}) # ua.random 回傳一個隨機user-agent,
# 如果不加 headers = {...} 回傳的Response(回應)就不是200(也就是回應例外)
return r.text
except:
print('Request ERROR')
def parse_html(url):
all_items = []
soup = bs(get_html(url),'html.parser') # 做一碗美麗湯~
items = soup.select('.item') # soup.select()回傳一個串列,每個串列元素是一個item標簽
for i in items: # 一個i(item) 就是一個資料元素(電影)、有許多資料項(排名、標題、...)
rank = i.select_one('em').text # 排名
movie_url = i.select_one('a').get('href') # 電影詳情url
movie_pic = i.select_one('a img').get('src') # 電影圖片url
title = i.select_one('.hd >a ').text.replace('\n','').strip() # 電影標題,去掉換行符、首尾的空格
info = i.select_one('.bd').text.replace('\n','').strip() # 導演、主演,去掉換行符、首尾的空格
score = i.select_one('.rating_num').text # 評分
try:
quote = i.select_one('.inq').text # 影評
except:
quote = None
print(f'《{title}》沒有參考影評')
all_items.append( # 每個被append到all_items里面的,是一個 字典,有如下鍵值對
{
'排名':rank,
'標題': title,
'簡介': info,
'影評':quote,
'電影評分': score,
'詳情URL':movie_url,
'照片URL': movie_pic,
}
)
return all_items
def save2file(all_items):
keys = all_items[0].keys() # 回傳dict_keys型別,其實可以看作串列,形如dict_keys(['排名', '標題', '簡介',...])
with open('豆瓣TOP250.csv', 'w', newline='', encoding='utf-8') as output_file:
dict_writer = csv.DictWriter(output_file, keys) # 把字典寫入CSV 檔案
# 沒有欄位名串列的話,DictWriter就無法知道使用哪些鍵來從字典中檢索值,它還使用欄位名中的鍵將第一行寫為列名,
dict_writer.writeheader() # 寫header,即第一行
dict_writer.writerows(all_items) # 用keys為檢索,每一行,寫一個item值
output_file.close()
if __name__ == '__main__':
url = 'https://movie.douban.com/top250?start={}'
all_items = [] # 用來存所有item字典
for i in range(0, 250, 25):
print(f'正在爬取{url.format(i)}','')
items = parse_html(url.format(i)) # 回傳前25名的電影items
all_items += items
print('爬取成功')
save2file(all_items)
print("爬取結束,")
關于我的代碼(大概寫一下給小白同學康康~)
首先呢,requests、bs4的用法,邊查檔案,邊寫多了,就爐火純青啦,不成問題,
下面解釋一下BeautifulSoup物件的 .select的用法
比如soup.select('.quote')
表示找到所有的
class = quote的標簽,"."(小數點) 代表class
回傳的是一個串列,(若沒找到,就是空串列)
之后遍歷這個串列,
.text拿的是標簽中間的字串,比如上圖就是“王家衛…代表”
.attrs['class']拿的是屬性class的屬性值,比如上圖就是“inq”
同理items = soup.select('.item')
表示找到所有的
class = item的標簽,"."(小數點) 代表class
回傳的是一個串列,(若沒找到,就是空串列)
又比如title = i.select_one('.hd >a ')
表示找每一個i下面的,
滿足class = hd所包含的直接子標簽,名為a的第一個標簽,
因為是select_one(),所以回傳第一個滿足查找條件的標簽,
(如果沒有找到,就是Nonetype)
成品截圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265652.html
標籤:其他
上一篇:Linux學習之安裝環境

