Python获取TOP250电影的英文名、港台名、导演、主演、上映年份、电影分类及评分

《Python网络爬虫:从入门到实践》3.4.3自我实践题:

获取豆瓣网上TOP250电影的英文名、港台名、导演、主演、上映年份、电影分类及评分。

学习嘛,就费了点劲自己试了一下,挺耽误时间的,不过好在搞出来了,书上给的代码有点问题,不够全面。

现在把自己测试过的源代码给大家分享出来,供大家学习借鉴,正好正则表达式一起学了,还是很有收获的。

由于电影的英文名、港台名爬取过滤比较麻烦,太耽误时间,所以忽略掉了,知道怎么弄就行。

代码测试时间是2019年11月8日。

以下是 rmv_by_re 模块中的 rmv_by_re 函数。

import re
def rmv_by_re(regex,somelist,num):
    """根据正则表达式的结构和分组号替换列表中元素"""
    results = []
    for y in range(0,len(somelist)):
        r = re.search(regex,somelist[y])
        if r != None :
            results.append(r.group(num))
        else:
            results.append(somelist[y])
    return results

以下是主程序:

#3.4.3自我实践题
import requests
import rmv_by_re
import time
from bs4 import BeautifulSoup

# 导演
dirs = []
# 主演
acts = []
# 年份
year = []
# 类别
categories = []
# 评分
grades = []

def show_lists(dirs,acts,year,categories,grades):
    print("共有",len(dirs),"个导演:",dirs)
    print("对应的",len(acts),"组主演:",acts)
    print(len(year),"部电影的出品年份:",year)
    print(len(categories),"部电影的类别:",categories)
    print(len(grades),"部电影的评分:",grades)

def get_top250details(dirs,acts,year,categories,grades):
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x'
        + '64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom'
        + 'e/70.0.3538.102 Safari/537.36 Edge/18.18362',
        'Host': 'movie.douban.com'
        }
    allcontents = []
    for i in range(0,10):
        link = 'https://movie.douban.com/top250?start=' + str(i * 25)
        r = requests.get(link,headers=headers,timeout=15)
        soup = BeautifulSoup(r.text,"html.parser")
        # 提取评分列表
        for one in soup.find_all("span",class_="rating_num"):
            grades.append(str(one.text.strip()))
        # 提取包含导演、主演、年份、类别的 p 标签
        for everyone in soup.find_all("p",class_=''):
            allcontents.append(str(everyone))
        if i == 9:
            # 提取导演、主演名字的正则表达式
            dir_maj_re= '导演:\s*(.*?)\s*主(演:)?\s*(.*[\S$])\s*<'
            # 提取年份的正则表达式
            year_re = '(20|19|18)[0-9]{2}'
            # 提取类别的正则表达式
            cate_re = '(20|19|18)[0-9]{2}.*?/.*?/\s*(.*[^\s$])'
            for num in range(0,len(allcontents)):
                if "主"not in allcontents[num] :
                    dirs.append(rmv_by_re.rmv_by_re('导演:\s*(.*[\S$])\s*<',allcontents,1)[num])
                else:
                    dirs.append(rmv_by_re.rmv_by_re(dir_maj_re,allcontents,1)[num])

                if "主"not in allcontents[num] :
                    acts.append("(未提供)")
                else:
                    acts.append(rmv_by_re.rmv_by_re(dir_maj_re,allcontents,3)[num])

                year.append(rmv_by_re.rmv_by_re(year_re,allcontents,0)[num])
                categories.append(rmv_by_re.rmv_by_re(cate_re,allcontents,2)[num])
    time.sleep(3)

get_top250details(dirs,acts,year,categories,grades)
show_lists(dirs,acts,year,categories,grades)

 

这本书还是不错,适合对Python爬虫特别感兴趣的爱好者学习,浅尝辄止的估计看不下去。有疑问的可以给我留言,有时间的话我会解答。

 

 

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值