利用python的三种不同方式爬取《豆瓣电影TOP250》排行榜的所有电影信息

一、利用《BeautifulSoup》方法,爬取《豆瓣电影》排行榜

       以下代码是一个用于从豆瓣电影Top250页面抓取数据的Python脚本,使用了csv模块来写入CSV文件以及BeautifulSoup进行HTML解析。下面是带有注释的代码,解释了每个部分的功能。

# 导入必要的模块
import csv
from bs4 import BeautifulSoup
import Ch  # 自定义模块,提供网络请求和缓存目录获取功能

# 主函数,接受一个URL作为参数
def main(url):
    # 使用Ch模块的get_web_request方法获取网页的HTML内容
    html = Ch.get_web_request(url)
    # 创建BeautifulSoup对象,用于解析HTML
    soup = BeautifulSoup(html, 'html.parser')
    # 获取页面上的每个.item元素(代表每部电影)
    for element in soup.select('.item'):
        # 获取排行榜的序号
        num = element.select_one('em').text
        # 获取电影名称
        zw_name = element.select_one('span.title').text
        # 获取电影详情链接
        urls = element.select_one('div.hd a')['href']
        # 获取评分
        star_rating = element.select('div.star span')[1].text
        # 获取评价人数,去除“人评价”文本
        star_num = element.select('div.star span')[3].text.replace('人评价', '')
        # 获取剧情评语,如果不存在则为空字符串
        content = element.select_one('p span.inq').text if element.select_one('p span.inq') is not None else ''
        # 将抓取的数据打包成元组
        tuples = (num, zw_name, urls, star_rating, star_num, content)
        # 将元组写入CSV文件
        csv_writer.writerow(tuples)
        # 打印当前处理的元组信息
        print(tuples)

# 如果直接运行此脚本,则执行以下代码
if __name__ == '__main__':
    # 打开CSV文件,写模式,UTF-8编码,去除空行
    with open(Ch.get_dir_cache_to('test.csv'), mode='w', encoding='utf-8', newline='') as f:
        # 创建CSV写入器
        csv_writer = csv.writer(f)
        # 写入表头
        csv_writer.writerow(['序号', '电影名称', '电影详情链接', '评分', '评价人数', '剧情概况'])
        # 循环抓取前10页的数据
        for i in range(10):
            # 调用main函数,传入当前页的URL
            main(f'https://movie.douban.com/top250?start={i * 25}&filter=')
            # 打印完成提示
            print(f'第{i + 1}页爬取完毕.')

二、利用《XPath》方法,爬取《豆瓣电影》排行榜

       这段代码使用了lxml库的etree模块来解析HTML文档,通过XPath选择器提取所需数据。同时,使用正则表达式来匹配和提取某些特定格式的信息。最后,将抓取到的信息保存到CSV文件中。

# 导入必要的模块
import csv
import re
from lxml import etree
import Ch  # 自定义的模块,提供网络请求和一些辅助功能

# 主函数,负责爬取豆瓣Top250电影的详细信息
def main(url):
    # 发送GET请求并获取HTML页面内容
    html = Ch.get_web_get(url).text
    # 解析HTML文档
    tree = etree.HTML(html)
    # 获取电影详情页的链接列表
    href_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href')
    # 获取电影名称列表
    name_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
    # 遍历电影详情页链接和名称列表
    for href_, name_ in zip(href_list, name_list):
        # 设置请求头中的Host字段
        Ch.params_headers['host'] = 'movie.douban.com'
        # 请求电影详情页
        html_ = Ch.get_web_get(href_).text
        # 解析详情页HTML文档
        tree_ = etree.HTML(html_)
        # 获取导演信息
        dir_ = tree_.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
        # 使用正则表达式提取电影类型
        type_ = re.findall(r'property="v:genre">(.*?)</span>', html_)
        # 将类型列表转换为字符串,各类型之间用斜杠分隔
        type_ = '/'.join(type_)
        # 使用正则表达式提取制片国家
        country_ = re.findall(r'地区:</span> (.*?)<br', html_)[0]
        # 获取上映日期(提取年份)
        time_ = tree_.xpath('//*[@id="content"]/h1/span[2]/text()')[0][1:5]
        # 获取评分
        rate_ = tree_.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
        # 获取评价人数
        people_ = tree_.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/div/div[2]/a/span/text()')[0]
        # 将抓取到的信息封装为元组
        tuples = (name_, dir_, type_, country_, time_, rate_, people_)
        # 将元组写入CSV文件
        csv_writer.writerow(tuples)
        # 打印当前处理的元组信息
        print(tuples)

# 当该脚本被直接运行时执行以下代码
if __name__ == '__main__':
    # 打开CSV文件,写模式,UTF-8编码,无空白行
    with open(Ch.get_dir_cache_to('test.csv'), mode='w', encoding='utf-8', newline='') as f:
        # 创建CSV写入器
        csv_writer = csv.writer(f)
        # 写入CSV文件的表头
        csv_writer.writerow(['电影名称', '导演', '类型', '制片国家', '上映日期', '评分', '评价人数'])
        # 遍历前10页的豆瓣Top250电影列表
        for i in range(10):
            # 调用main函数,传入当前页的URL
            main(f'https://movie.douban.com/top250?start={i * 25}&filter=')
            # 打印当前页的爬取状态
            print(f'第{i + 1}页爬取完毕.')

三、利用《正则表达式》方法,爬取《豆瓣电影》排行榜

       这段代码主要用于爬取豆瓣电影Top250列表中的电影详细信息,并将其存储到CSV文件中。它使用了BeautifulSoup和正则表达式来解析和提取网页中的数据。

# 导入必要的模块
import csv
import re
from bs4 import BeautifulSoup
import Ch  # 假设Ch模块提供了一些自定义功能,如网络请求和文件路径获取

# 定义主函数,负责爬取指定URL的网页数据
def main(url):
    # 使用Ch模块的get_web_request方法发送网络请求并获取响应内容
    html = Ch.get_web_request(url)
    # 使用BeautifulSoup解析HTML内容
    soup = BeautifulSoup(html, 'html.parser')
    # 查找所有class为'item'的div标签,即每一部电影的条目
    for item in soup.find_all('div', class_='item'):
        # 使用正则表达式提取电影详情链接
        info_01 = re.findall(re.compile(r'<a href="(.*?)">'), str(item))[0]
        # 提取电影封面图片链接
        info_02 = re.findall(re.compile(r'<img.*src="(.*?)"', re.S), str(item))[0]
        # 提取电影标题(中文名和英文名),可能有两个标题
        title = re.findall(re.compile(r'<span class="title">(.*)</span>'), str(item))
        # 根据标题数量,设置中文名和外文名
        if len(title) == 2:
            info_03 = title[0]  # 中文名
            info_04 = title[1].replace('/', '')  # 英文名,去除斜杠
        else:
            info_03 = title[0]  # 中文名
            info_04 = ' '  # 如果只有一个标题,英文名留空
        # 提取评分
        info_05 = re.findall(re.compile(r'<span class="rating_num" property="v:average">(.*)</span>'), str(item))[0]
        # 提取评价人数
        info_06 = re.findall(re.compile(r'<span>(\d*)人评价</span>'), str(item))[0]
        # 提取剧情概况,可能不存在
        inq = re.findall(re.compile(r'<span class="inq">(.*)</span>'), str(item))
        if len(inq) == 0:
            info_07 = ' '  # 如果没有概况,留空
        else:
            info_07 = inq[0].replace('。', '')  # 去除句点
        # 提取更多信息,如导演、演员等,可能存在换行和斜杠
        bd = re.findall(re.compile(r'<p class="">(.*?)</p>', re.S), str(item))[0]
        # 清理换行符和多余空格
        bd = re.sub('<br(\s+)?/>(\s+)?', '', bd)
        bd = re.sub('/', '', bd)
        info_08 = bd.strip()  # 去除首尾空格
        # 将提取的信息打包成元组
        tuples = (info_01, info_02, info_03, info_04, info_05, info_06, info_07, info_08)
        # 将元组写入CSV文件
        csv_writer.writerow(tuples)
        # 打印当前处理的元组信息
        print(tuples)

# 如果直接运行这个脚本
if __name__ == '__main__':
    # 打开CSV文件,写模式,UTF-8编码,无空行
    with open(Ch.get_dir_cache_to('test.csv'), mode='w', encoding='utf-8', newline='') as f:
        # 创建CSV写入器
        csv_writer = csv.writer(f)
        # 写入表头
        csv_writer.writerow(['电影详情链接', '图片链接', '影片中文名', '影片外国名', '评分', '评价人数', '剧情概况', '相关信息'])
        # 循环爬取10页数据
        for i in range(10):
            # 调用main函数,传入当前页的URL
            main(f'https://movie.douban.com/top250?start={i * 25}&filter=')
            # 打印完成提示
            print(f'第{i + 1}页爬取完毕.')

       请注意,Ch模块包含了处理网络请求和文件路径的自定义功能,它包含get_web_request()方法用于发送网络请求,并且get_dir_cache_to()方法用于返回缓存目录路径。


我是一名python初学者,正探索美妙旅程的起点,希望高手指教,与友互进!

-

该文章仅供学习交流使用,不得用于商业目的或非法传播。若有侵权请联系作者进行删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值