美文网首页技术爬虫编程基础知识
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