首页 > 编程语言 >(2024)豆瓣电影详情页内容爬虫详解和源码

(2024)豆瓣电影详情页内容爬虫详解和源码

时间:2024-06-21 10:59:01浏览次数:11  
标签:info content 详情页 doc 2024 extracted 源码 text match

(2024)豆瓣电影详情页内容爬虫详解和源码

这是一个Python爬虫程序,用于抓取豆瓣电影详情页面如https://movie.douban.com/subject/1291560/的数据。它首先发送GET请求,使用PyQuery解析DOM,然后根据<br>标签分割HTML内容,提取电影信息如导演、演员、类型等,并将中文键转换为英文键存储在字典中。完整代码包括请求、解析、数据处理和测试部分。当运行时,会打印出电影详情,如导演、演员列表、类型、时长等。

爬虫目的

获取 https://movie.douban.com/subject/1291560/ 电影详情的所有电影的属性。

image-20240621104936570

爬虫思路

  • 第一步,请求详情页面拿到响应
  • 第二步, 根据响应 + pyquery 解析dom拿到对应节点文本
  • 第三步,处理文本为想要的数据形式。

函数:getMovieInfoByUrl

分析dom

image-20240621104028761

OK,经过分析,我们找到了,使用jquery 获取电影信息dom的方式,但是没什么清晰的规律。所以需要特殊处理

  • 第一步:获取电影info的HTML
info_items_doc = doc("#content #info")
info_items_html_content = info_items_doc.html()
  • 第二步:根据br 标签划分为多个HTML片段,然后组成新的dom节点,再获取其文本,最后通过正则对文本处理,提取数据。
# 根据<br>标签划分内容
content_list = re.split(r'<br/>', info_items_html_content)
extracted_info = {}
# 定义正则表达式模式
regex_pattern = re.compile(r'(.*?):\s(.*?)(?:\n|$)')
# 输出划分后的内容
for content in content_list:
    info_item_doc = pq(f'<div>{content}<div>')
    info_item_text = info_item_doc.text()
    match = regex_pattern.match(info_item_text)
    if match:
        extracted_info[match.group(1)] = match.group(2)
print("extracted_info",extracted_info)        

输出

extracted_info {'导演': '宫崎骏', '编剧': '宫崎骏', '主演': '日高范子 / 坂本千夏 / 糸井重里 / 岛本须美 / 北林谷荣 / 高木均 / 雨笠利幸 / 丸山裕子 / 广濑正志 / 鹫尾真知子 / 铃木玲子 / 千叶繁 / 龙田直树 / 鳕子 / 西村朋纮 / 石田光子 / 神代知衣 / 中村大树 / 水谷优子 / 平松晶子 / 大谷育江', '类型': '动画 / 奇幻 / 冒险', '制片国家/地区': '日本', '语言': '日语', '上映日期': '2018-12-14(中国大陆) / 1988-04-16(日本)', '片长': '86分钟', '又名': '邻居托托罗 / 邻家的豆豆龙 / 隔壁的特特罗 / Tonari no Totoro / My Neighbor Totoro', 'IMDb': 'tt0096283'}

完整代码

# 豆瓣电影详情也爬数据
# https://movie.douban.com/subject/1291560/
import requests
from pyquery import PyQuery as pq
import re
from pprint import pprint

# 第一步,请求详情页面拿到响应
# 第二步, 根据响应 + pyquery 解析dom拿到对应节点文本
# 第三步,处理文本为想要的数据形式。

def getMovieInfoByUrl(detailUrl):
    movieInfo = {}
    # 定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        # 其他需要的请求头...
    }
    # 发送 GET 请求并获取响应内容
    response = requests.get(detailUrl, headers=headers)
    # 确保请求成功
    if response.status_code == 200:
        doc = pq(response.text)
        movieInfo['release_year'] = re.findall(r'\d+', doc("#content h1 .year").text())[0]
        #======处理 info 标签信息
        info_items_doc = doc("#content #info")
        info_items_html_content = info_items_doc.html()
        # 根据<br>标签划分内容
        content_list = re.split(r'<br/>', info_items_html_content)
        extracted_info = {}
        # 定义正则表达式模式
        regex_pattern = re.compile(r'(.*?):\s(.*?)(?:\n|$)')
        # 输出划分后的内容
        for content in content_list:
            info_item_doc = pq(f'<div>{content}<div>')
            info_item_text = info_item_doc.text()
            match = regex_pattern.match(info_item_text)
            if match:
                extracted_info[match.group(1)] = match.group(2)

        print("extracted_info",extracted_info)
        # 映射中文键到英文键
        key_mapping = {
            '主演': 'leading_actor',
            '制片国家/地区': 'release_region',
            '导演': 'director',
            '片长': 'duration',
            '类型': 'genre',
        }
        for key,value in extracted_info.items():
            if key in key_mapping:
                movieInfo[key_mapping[key]] = value
        movieInfo['duration'] = int(movieInfo['duration'].split('分钟')[0])
        #======处理 info 标签信息
        pprint(movieInfo)

    else:
        # 我的联系方式:wx: Wusp1994 企鹅号: 812190146
        print(f"请求失败,状态码:{response.status_code}")
    return movieInfo


测试代码

if __name__ == "__main__":
    call_me = "卫星:Wusp1994 企鹅: 812190146"
    movie_url = 'https://movie.douban.com/subject/1291560/'
    getMovieInfoByUrl(movie_url)

输出结果

最后得到电影信息的字典,如果有缺失信息,可以联系我交流。

image-20240621104741549

标签:info,content,详情页,doc,2024,extracted,源码,text,match
From: https://blog.csdn.net/qq_36463299/article/details/139855211

相关文章

  • Lru-k在Rust中的实现及源码解析
    LRU-K是一种缓存淘汰算法,旨在改进传统的LRU(LeastRecentlyUsed,最近最少使用)算法的性能。将其中高频的数据达到K次访问移入到另一个队列进行保护。算法思想LRU-K中的“K”代表最近使用的次数。因此,LRU可以认为是LRU-1的特例。LRU-K的主要目的是为了解决LRU算法“缓存污染”的......
  • #2024-6-21 sysaux表空间快满了
    78.21sysaux表空间80%都是转的--首选查看下这个表空间近期是否有过暴增setlinesize640setpagesize36colsnap_idfor999999colcon_idfor99999colpdbnamefora16colts_namefora20colrtimefora18colts_size_mbfor999999.9colts_used_mbfor999999.......
  • 2024年大数据、遥感与图像处理国际会议(BDRSIP 2024)
    2024InternationalConferenceonBigData,RemoteSensing,andImageProcessing【1】大会信息会议简称:BDRSIP 2024大会地点:中国·西安会议官网:www.bdrsip.com投稿邮箱:[email protected] 【2】会议简介2024年大数据、遥感与图像处理国际会议即将召开,本次会......
  • 【2024最新精简版】网络_Linux操作系统面试篇
    文章目录简述tcp和udp的区别?get和post请求有哪些区别?常用HTTP请求方式有哪些?进程跟线程的区别?僵尸进程?IO的多路复用?虚拟内存什么是OSI模型说一说HTTP协议说一说HTTPS协议HTTPS协议和HTTP协议有什么区别?......
  • 迅狐多商户直播商城系统源码:电商领域的创新融合
    随着直播技术的兴起和电子商务的蓬勃发展,迅狐多商户直播商城系统源码应运而生,为商家和消费者提供了一个全新的互动购物平台。多商户直播商城系统源码概述迅狐多商户直播商城系统源码是一个高度集成的解决方案,它结合了直播的即时性和电子商务的便捷性。源码的设计初衷是为商家......
  • 032java jsp ssm大学生第二课堂成绩单系统学生思想道德技术修养文体活动管理(源码+数据
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 026java jsp ssm网络硬盘系统网站系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 027java jsp ssm洗衣店管理系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 023java jsp ssm学校园教室管理系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • #2024-6-21 diff
    diff小工具使用开始在群里看到有人说用这个找出两个文件的差异,当时还没有留意,后来看到大佬的文档里边有这个的使用骚气啊学一下--1.一句话它对给出的文件进行系统的检查,逐行比较两个文本的不同之处,会显示出所有不同的行,不要求事先排序--2.检查是否安装这是安装过了,没有的话......