30行代碼抓取豆瓣電影排行榜
代碼基于python3瑰抵,用到的類(lèi)庫(kù)有requests,beautifulsoup器联。直接上代碼github
- pip安裝requests二汛,beautifulsoup
pip install requests
pip install BeautifulSoup4
兩個(gè)類(lèi)庫(kù)各司其職,Requests負(fù)責(zé)請(qǐng)求并加載網(wǎng)頁(yè)拨拓,BeautifulSoup 用于解析html文檔肴颊,強(qiáng)烈建議參考Requests文檔和BeautifulSoup文檔
- 導(dǎo)入相關(guān)模塊
import requests
from bs4 import BeautifulSoup
- 分析豆瓣電影文檔結(jié)構(gòu)
打開(kāi)瀏覽器查看源代碼或者調(diào)試工具
需要爬取的信息已經(jīng)標(biāo)注了,不多解釋千元。
需要注意的是爬取的URL包含分頁(yè)和過(guò)濾信息
通用的URL格式為:https://movie.douban.com/top250?start=25&filter= 其中start=25表示從排名25開(kāi)始苫昌,filter=為過(guò)濾標(biāo)志在此不考慮,下面代碼為獲取指定起始排名的url的代碼
# 獲得指定起始排名的電影url
def get_url(root_url,start):
return root_url+"?start="+str(start)+"&filter="
- 根據(jù)傳入的url幸海,獲取電影排名及評(píng)分祟身,代碼及注釋如下
# 根據(jù)傳入的url,獲取電影排名及評(píng)分物独,代碼如下
def get_review(page_url):
#存放電影信息的列表
movies_list=[]
#請(qǐng)求url袜硫,返回response對(duì)象
response=requests.get(page_url)
#指定lxml解析器解析html文檔
soup=BeautifulSoup(response.text,"lxml")
#獲取包含所有電影信息的節(jié)點(diǎn)
soup=soup.find('ol','grid_view')
#循環(huán)獲取單個(gè)節(jié)點(diǎn)
for tag_li in soup.find_all('li'):
dict={}
#排名
dict['rank']=tag_li.find('em').string
#名稱(chēng)
dict['name']=tag_li.find_all('span','title')[0].string
#評(píng)分
dict['score']=tag_li.find('span','rating_num').string
#有的電影短評(píng)為空,為防止抓取到一半出錯(cuò)挡篓,需判斷是否為空
if(tag_li.find('span','inq')):
dict['desc']=tag_li.find('span','inq').string
movies_list.append(dict)
return movies_list
- 測(cè)試代碼
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('電影名稱(chēng):'+movie_dict.get('name'))
print('電影評(píng)分:'+movie_dict.get('score'))
print('電影評(píng)詞:'+movie_dict.get('desc','無(wú)評(píng)詞'))
print('------------------------------------------------------')
start+=25
- 完整代碼
# -*- coding: UTF-8 -*-
"""
獲取豆瓣電影評(píng)分排行榜
"""
import requests
from bs4 import BeautifulSoup
# 獲得指定開(kāi)始排行的電影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('電影名稱(chēng):'+movie_dict.get('name'))
print('電影評(píng)分:'+movie_dict.get('score'))
print('電影評(píng)詞:'+movie_dict.get('desc','無(wú)評(píng)詞'))
print('------------------------------------------------------')
start+=25
-
結(jié)果截圖