Python爬虫实战 | (3) 爬取豆瓣电影Top250

在本篇博客中,我们将使用requests+正则表达式来爬取豆瓣电影TOP250电影榜单,获取每部电影的序号、片名、导演、编剧、主演、类型、制作国家/地区、语言、上映日期、片长、又名、豆瓣评分和剧情简介等内容。

打开豆瓣Top250,分析URL的变化:发现Top250榜总共包含10页,每页25部电影,并且每一页的URL都是有规律的,如第2页的URL是https://movie.douban.com/top250?start=25&filter=,第三页https://movie.douban.com/top250?start=50&filter=

由此可得,第n页是https://movie.douban.com/top250?start=(n-1)*25&filter=。接下来我们通过爬虫四部曲,来对其进行爬取:

首先搭建起程序的主体框架:

import requests
from requests.exceptions import RequestException
import re

def get_page(url):
    pass

def get_movie_list(html):
    pass

def get_content(movie_url):
    pass



if __name__ == '__main__':
    for i in range(10):
        url = 'https://movie.douban.com/top250?start='+str(i*25)
        #发送请求 获取响应
        html = get_page(url)
        #解析响应 获取电影列表
        movie_list = get_movie_list(html)
        #获取每部电影的详细内容
        for movie in movie_list:
            get_content(movie[1])

发送请求,获取响应:

def get_page(url):
    try:
        headers = {
            'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
        }
        response = requests.get(url,headers=headers)
        if response.status_code==200:
            response.encoding = response.apparent_encoding
            return response.text
        return None
    except RequestException:
        return None

和之前爬取猫眼电影不同,我们需要剧情简介等内容,需要点开每部电影,获取详细信息。所以,我们首先要把页面上所有电影的链接爬下来,再逐个链接进行详细信息的爬取。

初始页面的每部电影都包含在li标签中,电影的序号和链接都在上图所示的标签中,接下里我们需要解析初始页面的html代码,提取电影序号和链接:

def get_movie_list(html):
    pattern = re.compile('<div class="pic".*?em class="">(.*?)</em>.*?<a href="(.*?)">.*?</a>',re.S)
    movie_list = pattern.findall(html)
    return movie_list

依次打开每个电影的url,对详细信息分别进行解析提取:

1)片名

2)导演、编剧、主演、类型、制作国家/地区、语言、上映日期、片长、又名、豆瓣评分

3)剧情简介

def get_content(movie_url):
    html = get_page(movie_url)
    html = str(html)
    #获取片名
    pattern = re.compile('<span property="v:itemreviewed">(.*?)</span>',re.S)
    name = pattern.findall(html)
    print(name)
    #导演
    pattern = re.compile('<a.*?rel="v:directedBy">(.*?)</a>',re.S)
    director = pattern.findall(html)
    print(director)

    #编剧 没办法一次解析出来 可以解析两次 第一次缩小范围
    pattern = re.compile("<span ><span class='pl'>编剧</span>: <span class='attrs'>(.*?)</span></span><br/>",re.S)
    author = pattern.findall(html)
    if author:
        pattern = re.compile('<a href=.*?>(.*?)</a>',re.S)
        author = pattern.findall(author[0])
    print(author)

    #主演
    pattern = re.compile('<a.*?rel="v:starring">(.*?)</a>',re.S)
    actor = pattern.findall(html)
    print(actor)

    #类型
    pattern = re.compile('<span property="v:genre">(.*?)</span>',re.S)
    type = pattern.findall(html)
    print(type)

    #制片国家/地区
    pattern = re.compile('<span class="pl">制片国家/地区:</span>(.*?)<br/>',re.S)
    area = pattern.findall(html)
    print(area)

    #语言
    pattern = re.compile('<span class="pl">语言:</span>(.*?)<br/>',re.S)
    language = pattern.findall(html)
    print(language)

    #上映时间
    pattern = re.compile('<span property="v:initialReleaseDate" content=.*?>(.*?)</span>',re.S)
    time = pattern.findall(html)
    print(time)

    #片长
    pattern = re.compile('<span property="v:runtime" content=.*?>(.*?)</span>',re.S)
    runtime = pattern.findall(html)
    print(runtime)

    #又名
    pattern = re.compile('<span class="pl">又名:</span>(.*?)<br/>',re.S)
    other_name = pattern.findall(html)
    print(other_name)

    #评分
    pattern = re.compile('<strong class="ll rating_num" property="v:average">(.*?)</strong>',re.S)
    score = pattern.findall(html)
    print(score)

    #简介
    pattern = re.compile('<span property="v:summary".*?>(.*?)</span>',re.S)
    introduce = pattern.findall(html)

    introduce = introduce[0].strip().replace('\n', '').replace('\t', '').replace(
		'                                    <br />                                  ', '')
    print(introduce)

    # 保存数据
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(movie[0] + '\t' + movie[1] + '\t' + str(name) + '\t' + str(director) + '\t' + str(author) + '\t' + str(
            actor) + '\t' + str(type) + '\t' + str(area) + '\t' + str(language) + '\t' + str(
            time) + '\t' + str(runtime) + '\t' + str(other_name) + '\t' + str(
            score) + '\t' + introduce + '\n')

完整代码:

import requests
from requests.exceptions import RequestException
import re

def get_page(url):
    try:
        headers = {
            'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
        }
        response = requests.get(url,headers=headers)
        if response.status_code==200:
            response.encoding = 'utf-8'
            return response.text
        return None
    except RequestException:
        return None

def get_movie_list(html):
    pattern = re.compile('<div class="pic".*?em class="">(.*?)</em>.*?<a href="(.*?)">.*?</a>',re.S)
    movie_list = pattern.findall(html)
    return movie_list

def get_content(movie_url):
    html = get_page(movie_url)
    html = str(html)
    #获取片名
    pattern = re.compile('<span property="v:itemreviewed">(.*?)</span>',re.S)
    name = pattern.findall(html)
    print(name)
    #导演
    pattern = re.compile('<a.*?rel="v:directedBy">(.*?)</a>',re.S)
    director = pattern.findall(html)
    print(director)

    #编剧 没办法一次解析出来 可以解析两次 第一次缩小范围
    pattern = re.compile("<span ><span class='pl'>编剧</span>: <span class='attrs'>(.*?)</span></span><br/>",re.S)
    author = pattern.findall(html)
    if author:
        pattern = re.compile('<a href=.*?>(.*?)</a>',re.S)
        author = pattern.findall(author[0])
    print(author)

    #主演
    pattern = re.compile('<a.*?rel="v:starring">(.*?)</a>',re.S)
    actor = pattern.findall(html)
    print(actor)

    #类型
    pattern = re.compile('<span property="v:genre">(.*?)</span>',re.S)
    type = pattern.findall(html)
    print(type)

    #制片国家/地区
    pattern = re.compile('<span class="pl">制片国家/地区:</span>(.*?)<br/>',re.S)
    area = pattern.findall(html)
    print(area)

    #语言
    pattern = re.compile('<span class="pl">语言:</span>(.*?)<br/>',re.S)
    language = pattern.findall(html)
    print(language)

    #上映时间
    pattern = re.compile('<span property="v:initialReleaseDate" content=.*?>(.*?)</span>',re.S)
    time = pattern.findall(html)
    print(time)

    #片长
    pattern = re.compile('<span property="v:runtime" content=.*?>(.*?)</span>',re.S)
    runtime = pattern.findall(html)
    print(runtime)

    #又名
    pattern = re.compile('<span class="pl">又名:</span>(.*?)<br/>',re.S)
    other_name = pattern.findall(html)
    print(other_name)

    #评分
    pattern = re.compile('<strong class="ll rating_num" property="v:average">(.*?)</strong>',re.S)
    score = pattern.findall(html)
    print(score)

    #简介
    pattern = re.compile('<span property="v:summary".*?>(.*?)</span>',re.S)
    introduce = pattern.findall(html)

    introduce = introduce[0].strip().replace('\n', '').replace('\t', '').replace(
		'                                    <br />                                  ', '')
    print(introduce)

    # 保存数据
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(movie[0] + '\t' + movie[1] + '\t' + str(name) + '\t' + str(director) + '\t' + str(author) + '\t' + str(
            actor) + '\t' + str(type) + '\t' + str(area) + '\t' + str(language) + '\t' + str(
            time) + '\t' + str(runtime) + '\t' + str(other_name) + '\t' + str(
            score) + '\t' + introduce + '\n')




if __name__ == '__main__':
    for i in range(10):
        url = 'https://movie.douban.com/top250?start='+str(i*25)
        print(url)
        #发送请求 获取响应
        html = get_page(url)
        #print(html)
        #解析响应 获取电影列表
        movie_list = get_movie_list(html)
        print(movie_list)
        #获取每部电影的详细内容
        for movie in movie_list:
            get_content(movie[1])

 

 

 

 

 

  • 13
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
爬取豆瓣电影Top250,可以按照以下步骤进行操作: 首先,需要搭建程序的主体框架。可以导入必要的库,如requests用于发送请求,re用于正则表达式匹配等。然后定义一个函数get_page(url),用于获取指定URL的网页内容;另外定义一个函数get_movie_list(html),用于解析网页内容,获取电影列表;再定义一个函数get_content(movie_url),用于获取每部电影的详细内容。接下来就可以在主程序中使用循环来爬取每一页的电影数据了。具体实现如下所示: ```python import requests from requests.exceptions import RequestException import re def get_page(url): # 发送请求,获取响应 response = requests.get(url) if response.status_code == 200: return response.text return None def get_movie_list(html): # 解析响应,获取电影列表 pattern = re.compile('<a href="(.*?)".*?<span class="title">(.*?)</span>.*?' '<span class="rating_num" property="v:average">(.*?)</span>', re.S) movie_list = re.findall(pattern, html) return movie_list def get_content(movie_url): # 获取每部电影的详细内容 # 这里可以继续编写代码,根据电影详情页的URL获取需要的信息 if __name__ == '__main__': for i in range(10): url = 'https://movie.douban.com/top250?start=' + str(i*25) # 根据页数拼接URL html = get_page(url) # 获取网页内容 movie_list = get_movie_list(html) # 解析网页内容,获取电影列表 for movie in movie_list: get_content(movie<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python爬虫实战 | (3) 爬取豆瓣电影Top250](https://blog.csdn.net/sdu_hao/article/details/96114862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值