30行代碼抓取豆瓣電影排行榜
代碼基于python3,用到的類庫有requests,beautifulsoup。直接上代碼github
- pip安裝requests,beautifulsoup
pip install requests
pip install BeautifulSoup4
兩個類庫各司其職,Requests負責請求并加載網頁,BeautifulSoup 用于解析html文檔,強烈建議參考Requests文檔和BeautifulSoup文檔
- 導入相關模塊
import requests
from bs4 import BeautifulSoup
- 分析豆瓣電影文檔結構
打開瀏覽器查看源代碼或者調試工具
調試代碼
需要爬取的信息已經標注了,不多解釋。
需要注意的是爬取的URL包含分頁和過濾信息
通用的URL格式為:https://movie.douban.com/top250?start=25&filter= 其中start=25表示從排名25開始,filter=為過濾標志在此不考慮,下面代碼為獲取指定起始排名的url的代碼
# 獲得指定起始排名的電影url
def get_url(root_url,start):
return root_url+"?start="+str(start)+"&filter="
- 根據傳入的url,獲取電影排名及評分,代碼及注釋如下
# 根據傳入的url,獲取電影排名及評分,代碼如下
def get_review(page_url):
#存放電影信息的列表
movies_list=[]
#請求url,返回response對象
response=requests.get(page_url)
#指定lxml解析器解析html文檔
soup=BeautifulSoup(response.text,"lxml")
#獲取包含所有電影信息的節點
soup=soup.find('ol','grid_view')
#循環獲取單個節點
for tag_li in soup.find_all('li'):
dict={}
#排名
dict['rank']=tag_li.find('em').string
#名稱
dict['name']=tag_li.find_all('span','title')[0].string
#評分
dict['score']=tag_li.find('span','rating_num').string
#有的電影短評為空,為防止抓取到一半出錯,需判斷是否為空
if(tag_li.find('span','inq')):
dict['desc']=tag_li.find('span','inq').string
movies_list.append(dict)
return movies_list
- 測試代碼
if __name__ == "__main__":
root_url="https://movie.douban.com/top250"
start=0
while(start<250):
movies_list=get_review(get_url(root_url,start))
for movie_dict in movies_list:
print('電影排名:'+movie_dict['rank'])
print('電影名稱:'+movie_dict.get('name'))
print('電影評分:'+movie_dict.get('score'))
print('電影評詞:'+movie_dict.get('desc','無評詞'))
print('------------------------------------------------------')
start+=25
- 完整代碼
# -*- coding: UTF-8 -*-
"""
獲取豆瓣電影評分排行榜
"""
import requests
from bs4 import BeautifulSoup
# 獲得指定開始排行的電影url
def get_url(root_url,start):
return root_url+"?start="+str(start)+"&filter="
def get_review(page_url):
movies_list=[]
response=requests.get(page_url)
soup=BeautifulSoup(response.text,"lxml")
soup=soup.find('ol','grid_view')
for tag_li in soup.find_all('li'):
dict={}
dict['rank']=tag_li.find('em').string
dict['name']=tag_li.find_all('span','title')[0].string
dict['score']=tag_li.find('span','rating_num').string
if(tag_li.find('span','inq')):
dict['desc']=tag_li.find('span','inq').string
movies_list.append(dict)
return movies_list
if __name__ == "__main__":
root_url="https://movie.douban.com/top250"
start=0
while(start<250):
movies_list=get_review(get_url(root_url,start))
for movie_dict in movies_list:
print('電影排名:'+movie_dict['rank'])
print('電影名稱:'+movie_dict.get('name'))
print('電影評分:'+movie_dict.get('score'))
print('電影評詞:'+movie_dict.get('desc','無評詞'))
print('------------------------------------------------------')
start+=25
-
結果截圖