爬取豆瓣电影top250


引言

为实现豆瓣top50电影在一个Excel表中一览无遗~

豆瓣电影top250/爬取时间20211005

【存在问题】

一次性写入csv存在问题:

UnicodeEncodeError: 'gbk' codec can't encode character '\xee' in position 59: illegal multibyte sequence

如果你想一下子爬下来,本代码无法实现。

思路

html比较清晰的字段,可以一下子爬取250条;稍微混乱点的,或者存在空字段的采取了分页爬取措施。

影片、上映年份、评分、评价人数一下子爬取250条;其余分页爬取,分别是导演主演、地区类型、一句话总概括。

下面的代码最重要的部分是

obj=re.compile(r'
  • .*?.*?(?P<电影名>.*?)',re.S)
  • 如何找出你要的内容,参考python爬虫入门(6)爬取豆瓣电影top250

    1.影片

    # 需要的库
    import requests
    import re 
    # 250
    for i in range(0,250,25):
        url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
        headers = {
                "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
            }
        resp=requests.get(url,headers=headers)
        page_content=resp.text # html
        
        #测试一下,爬取电影名
        obj=re.compile(r'
  • .*?.*?(?P<电影名>.*?)',re.S)
        ret = obj.finditer(page_content)#页面源码代入解析
        for it in ret:
            print(it.group("电影名"))
  • 2.上映年份

    # 250
    for i in range(0,250,25):
        url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
        headers = {
                "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
            }
        resp=requests.get(url,headers=headers)
        page_content=resp.text # html
        
        #测试一下,爬取年份
        obj=re.compile(r'
  • .*?.*?.*?
    (?P<年份>.*?) ',re.S)
        ret = obj.finditer(page_content)#页面源码代入解析
        for it in ret:
            print(it.group("年份").strip())
  • 3.评分

    # 250
    for i in range(0,250,25):
        url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
        headers = {
                "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
            }
        resp=requests.get(url,headers=headers)
        page_content=resp.text # html
        
        #评分
        obj=re.compile(r'
  • .*?.*?(?P<评分>.*?)',re.S)
        ret = obj.finditer(page_content)#页面源码代入解析
        for it in ret:
            print(it.group("评分").strip())
  • 4.评价人数

    # 250
    for i in range(0,250,25):
        url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
        headers = {
                "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
            }
        resp=requests.get(url,headers=headers)
        page_content=resp.text # html
        
        #评价人数
        obj=re.compile(r'
  • .*?.*?(?P<评价人数>.*?)人评价',re.S)
        ret = obj.finditer(page_content)#页面源码代入解析
        for it in ret:
            print(it.group("评价人数").strip())
  • 5.导演主演

    i=225 #你要爬取的是哪一页
    url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
    headers = {
                "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
            }
    resp=requests.get(url,headers=headers)
    page_content=resp.text # html
        
    #爬取一页的,导演主演
    obj=re.compile(r'
  • .*?.*?.*?(?P<导演主演>.*?)
    ',re.S)
    ret = obj.finditer(page_content)#页面源码代入解析
    for it in ret:
        print(it.group("导演主演").strip())
  • 6.地区类型

    i=225
    url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
    headers = {
                "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
            }
    resp=requests.get(url,headers=headers)
    page_content=resp.text # html
        
    #爬取一页的,地区类型
    obj=re.compile(r'
  • .*?.*?.*? / (?P<地区类型>.*?)

    ',re.S)
    ret = obj.finditer(page_content)#页面源码代入解析
    for it in ret:
        print(it.group("地区类型").strip())
  • 7.一句话总概括

    i=200
    url = "https://movie.douban.com/top250?start="+str(i)+"&filter="
    headers = {
                "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
            }
    resp=requests.get(url,headers=headers)
    page_content=resp.text # html
        
    #爬取一页的,经典台词
    obj=re.compile(r'
  • .*?.*?(?P<经典台词>.*?)',re.S)
    ret = obj.finditer(page_content)#页面源码代入解析
    for it in ret:
        print(it.group("经典台词"))
  • 可以看出导演主演,地区类型是一起爬出的,由于数据比较少,就在Excel中直接进行单元格切分处理了。