美文网首页技术爬虫编程基础知识
30行代码抓取豆瓣电影排行榜评分

30行代码抓取豆瓣电影排行榜评分

作者: sambor | 来源:发表于2016-04-30 22:03 被阅读3729次

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
  • 结果截图


感谢阅读我的文章,转载请注明作者

相关文章

网友评论

  • SuperMario_Nil:写的不错。记录一下:lxml在python2.7.3版本之前兼容性不好,可以用html5lib.
    还需加入
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    解决unicode编码冲突. :grin:
  • daiw:学习了,不过我的代码里输出时movie_dict['rank']要编码成utf-8才会不报错
    sambor:@daiw 嗯嗯,互相学习
    daiw:@daiw orz我没有默认utf-8编码 在环境里设置了下面这些就好了 :sweat:

    另一个方案是在python的Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:
    Python代码
    # encoding=utf8
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
  • 木易小王爷:高手
    sambor:@木易小王爷 谢谢夸奖
  • WordPress陌陌:请问如何解决抓取频繁被403
    sambor:@WordPress陌陌 是的,需用代理
    WordPress陌陌:@SakuraMekhi 我已经设置了 。但是没用。 代理IP没试过
    SakuraMekhi:@WordPress陌陌 设置抓取延时,代理IP

本文标题:30行代码抓取豆瓣电影排行榜评分

本文链接:https://www.haomeiwen.com/subject/dwmkrttx.html