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
-
结果截图
网友评论
还需加入
import sys
reload(sys)
sys.setdefaultencoding('utf8')
解决unicode编码冲突.
另一个方案是在python的Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:
Python代码
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')