使用Python爬取豆瓣电影TOP250!

最近在学习Python爬虫,学习并使用了一个非常强大的解析库: gawel/pyquery: A jquery-like library for python ,语法和Jquery非常类似,可以非常方便地提取信息,因此也顺便挑战了一下爬取豆瓣电影TOP 250,链接为: https://movie.douban.com/top250?start=0&filter= ,由于刚开始学习爬虫,代码将就着看,也简单的总结了一下。

Python资源共享群:626017123

  1. 豆瓣电影页面采取了反爬虫措施,因此在爬虫时速度不宜过快,使用 time.sleep() 函数进行休眠,否则会封IP,或者使用代理进行,但我尝试了一些免费代理并没有成功。
  2. 爬虫的文件存储为cvs格式,使用 logging 进行日志记录,方便查看进度
  3. 由于个别页面并不是统一的格式,如有的电影(如 千与千寻 )有官方网站,大部分没有,大部分可以正常对应cvs页面,但对于这些特殊的页面则可能存在误差,最终文件我是手动修改的,并将其转换为excel。
  4. 由于还未涉及到数据分析,也就没有对该数据进行分析了

数据的爬取

以下为简单的代码:

from pyquery import PyQuery as pq
import csv
import logging
import time
#豆瓣Top250信息爬取:https://movie.douban.com/top250?start=0&filter=
#使用休眠方法爬取 爬取速度非常慢,防止豆瓣封IP
start_url='https://movie.douban.com/top250?start=%s&filter='
#存储目录
csv_file='douban_top250.csv'
logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(name)s-%(levelname)s-%(message)s')
logger=logging.getLogger(__name__)
head_str='电影名称,年份,概括,导演,编剧,主演,类型,制片国家,语言,上映日期,片长,别名,评分,评价人数,链接'
csv_heads=head_str.split(',')
#写入头信息
with open(csv_file,'w',encoding='utf_8_sig',newline='') as f:
    writer=csv.writer(f)
    writer.writerow(csv_heads)
real_page=0
for page in range(0,250,25):
    logger.info("正在休眠5s,请稍后……")
    time.sleep(5)
    real_page+=1
    logger.info('正在获取第%s页的信息',real_page)
    page_url=start_url % page #当前页链接
    page_doc=pq(page_url)
    single_doc=page_doc('.item') #获取单项信息
    for item in single_doc.items():
        #电影名称,年份,概括,导演,编剧,主演,类型,制片国家,语言,上映日期,片长,别名,评分,评价人数,链接
        info_list=[]
        #评分
        rate=item('.star .rating_num').text()
        #评价人数
        rate_nums=item('.star span').eq(3).text()
        #概括
        quote=item('.bd p').eq(1).text()
    
        #进入详情页面提取信息
        detail_url=item('.pic a').attr('href')
        detail_doc=pq(detail_url)
        #为防止封IP,休眠5s
        logger.info("正在休眠3s,请稍后……")
        time.sleep(3)
        #电影名称和年份
        title=detail_doc('h1 span').eq(0).text()
        year=detail_doc('h1 .year').text()[1:-1]
        info_list.append(title)
        info_list.append(year)   
        info_list.append(quote)
        #基本信息
        infos=detail_doc('#info').text().split('\n')[:-1]
        for index in range(len(infos)):
            info=infos[index].split(':')[1]
            info_list.append(info)
        info_list.append(rate)
        info_list.append(rate_nums)
        info_list.append(detail_url)
        #部分电影有官方链接如https://movie.douban.com/subject/1291561/,去除该链接,但可能会误删,最终手动修复
        if len(info_list)==16:
            del info_list[7] #删除官方网站
        with open(csv_file,'a',encoding='utf_8_sig',newline='') as f:
            writer=csv.writer(f)
            writer.writerow(info_list)
        logger.info('获取------%s------信息成功!',title)

最终爬取的文件截图如下,包括的字段为:电影名称,年份,概括,导演,编剧,主演,类型,制片国家,语言,上映日期,片长,别名,评分,评价人数,链接

 

 

 

 

 

 

下载链接: https://www.lanzous.com/i6317he

简单的数据分析

由于对Python的数据分析还不了解,简单地用Excel进行分析。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

豆瓣电影TOP250中,制片国为美国的电影占了118部,而中国大陆仅有14部,20时间90年代后到至今的30年中,TOP250高达86%,而中国电影虽拍的非常多,但高质量的影片依然不足。同问,中国何时能再次拍出“霸王别姬”?

你可能感兴趣的:(Python)