美文网首页前端社团
Python3爬取豆瓣电影

Python3爬取豆瓣电影

作者: pro_ven_ce | 来源:发表于2017-03-29 15:28 被阅读1839次
    目标是爬取2000年到2016年的电影,并进行数据分析。

    本文适合新手

    下面以2016年的电影为例:

    这是我们需要爬取的网页链接:
    https://movie.douban.com/tag/2016

    进入网页



    按Fn+F12,我们就能看到:



    通过正则表达式解析获取数据:
    pattern = re.compile('<table width=".*?<div class="pl2">.*?>(.*?)</a>.*?class="pl">(.*?)</p>'   
                       + '.*?<span class="rating_nums">(.*?)</span>.*?class="pl">(.*?)</span>', re.S)
    items = re.findall(pattern, html)
    
    实现循环翻页

    我们可以发现
    第一页的网址为:https://movie.douban.com/tag/2016?start=0&type=T
    第二页的网址为:https://movie.douban.com/tag/2016?start=20&type=T
    第三页的网址为:https://movie.douban.com/tag/2016?start=40&type=T
    ……
    =.= 得到规律,跳转到下一页只需将start加20;
    代码如下:

    def main(start):
        url = 'https://movie.douban.com/tag/2007?start='+str(start)+'&type=T'
        html = get_one_page(url)
    
    if __name__ == '__main__':
        for i in range(196):
            main(i*20)
    

    range中的数即为页数。

    写入文档

    利用json.dumps()将dict转化成str格式。

    def write_to_file(content):
        with open('2007.txt', 'a', encoding='utf-8') as f:
            f.write(json.dumps(content, ensure_ascii=False) + '\n')
    
    源代码
    import requests
    from requests.exceptions import RequestException
    import re
    import json
    
    
    def get_one_page(url):
        try:
            response = requests.get(url)
            if response.status_code == 200:
                return response.text
            return None
        except RequestException:
            return None
    
    
    def parse_one_page(html):
        pattern = re.compile('<table width=".*?<div class="pl2">.*?>(.*?)</a>.*?class="pl">(.*?)</p>'
                             + '.*?<span class="rating_nums">(.*?)</span>.*?class="pl">(.*?)</span>', re.S)
        items = re.findall(pattern, html)
        for item in items:
            yield {
                'title': item[0].split("/")[0],
                'time': item[1].split("/")[0],
                'actor': item[1].split("/")[1:],
                'average': item[2],
                'content': item[3],
            }
    
    
    def write_to_file(content):
        with open('2016.txt', 'a', encoding='utf-8') as f:
            f.write(json.dumps(content, ensure_ascii=False) + '\n')
            f.close()
    
    
    def main(start):
        url = 'https://movie.douban.com/tag/2016?start='+str(start)+'&type=T'
        html = get_one_page(url)
        for item in parse_one_page(html):
            print(item)
            write_to_file(item)
    
    
    if __name__ == '__main__':
        for i in range(84, 194):
            main(i*20)
    

    记事本如图:



    接着把2000年到2015年的数据都爬取下来。
    嗯。方法很蠢。



    把记事本中的文字导入excel
    发挥自己强大的excel技能你就能得到
    数据分析

    我在excel里制作了图表。




    我们可以得到2000年以来,电影数量逐年递增,电影质量却呈现下降的趋势,评价人数则上下波动。

    进行筛选还可以得到高分热评电影,高分冷门电影……
    再也不用纠结周末要看什么电影啦[捂脸]🙃

    参考视频:https://edu.hellobi.com/course/156/play/lesson/2453

    相关文章

      网友评论

      • 李未恕:菜鸟请教……可不可以直接写入CSV……
      • 草木乾坤:你好 请问怎么写进txt呢?菜鸟请教~
        几何欢:txt 换成 text 可以实现
        pro_ven_ce: @karen4tree def write_to_file(content):
        with open('2016.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
        f.close()

      本文标题:Python3爬取豆瓣电影

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