Python爬虫(二十)_动态爬取影评信息

news2024/9/25 13:26:28

本案例介绍从JavaScript中采集加载的数据。更多内容请参考:Python学习指南

#-*-  coding:utf-8 -*-
import requests
import re
import time
import json

#数据下载器
class HtmlDownloader(object):
    def download(self, url, params=None):
        if url is None:
            return None
        user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0'
        headers = {'User-Agent':user_agent}
        if params is None:
            r = requests.get(url, headers = headers)
        else:
            r = requests.get(url, headers = headers, params = params)
        if r.status_code == 200:
            r.encoding = 'utf-8'
            return r.text
        return None

#数据存储器
class HtmlParser(object):

    #从选购电影页面中解析出所有电影信息,组成一个list
    def parser_url(self, page_url, response):
        pattern = re.compile(r'(http://movie.mtime.com/(\d+)/)')
        urls = pattern.findall(response)
        if urls != None:
            #将urls去重
            return list(set(urls))
        else:
            return None

    #解析正在上映的电影
    def __parser_release(self, page_url, value):
        '''
            解析已经上映的电影
            :param page_url:电影链接
            :param value: json数据
            :return
        '''
        try:
            isRelease = 1
            movieRating = value.get('value').get('movieRating')
            boxOffice = value.get('value').get('boxOffice')
            movieTitle = value.get('value').get('movieTitle')
            
            RPictureFinal = movieRating.get('RPictureFinal')
            RStoryFinal = movieRating.get('RStoryFinal')
            RDirectorFinal = movieRating.get('RDirectorFinal')
            ROtherFinal = movieRating.get('ROtherFinal')
            RatingFinal = movieRating.get('RatingFinal')

            MovieId = movieRating.get("MovieId")
            UserCount = movieRating.get("Usercount")
            AttitudeCount = movieRating.get("AttitudeCount")

            TotalBoxOffice = boxOffice.get("TotalBoxOffice")
            TotalBoxOfficeUnit = boxOffice.get("TotalBoxOfficeUnit")
            TodayBoxOffice = boxOffice.get("TodayBoxOffice")
            TodayBoxOfficeUnit = boxOffice.get("TodayBoxOfficeUnit")

            ShowDays = boxOffice.get('ShowDays')
            try:
                Rank = boxOffice.get('Rank')
            except Exception,e:
                Rank = 0
            #返回所提取的内容
            return (MovieId, movieTitle, RatingFinal, ROtherFinal, RPictureFinal, RDirectorFinal, RStoryFinal, UserCount, AttitudeCount, TotalBoxOffice+TotalBoxOfficeUnit, TodayBoxOffice+TodayBoxOfficeUnit, Rank, ShowDays, isRelease)
        except Exception, e:
            print e, page_url, value
            return None

    #解析未上映的电影
    def __parser_no_release(self, page_url, value, isRelease=0):
        '''
            解析未上映的电影信息
            :param page_url
            :param value
            : return
        '''
        try:
            movieRating = value.get('value').get('movieRating')
            movieTitle = value.get('value').get('movieTitle')
            
            RPictureFinal = movieRating.get('RPictureFinal')
            RStoryFinal = movieRating.get('RStoryFinal')
            RDirectorFinal = movieRating.get('RDirectorFinal')
            ROtherFinal = movieRating.get('ROtherFinal')
            RatingFinal = movieRating.get('RatingFinal')

            MovieId = movieRating.get("MovieId")
            UserCount = movieRating.get("Usercount")
            AttitudeCount = movieRating.get("AttitudeCount")

            try:
                Rank = value.get('value').get('hotValue').get('Ranking')
            except Exception,e:
                Rank = 0
            #返回所提取的内容
            return (MovieId, movieTitle, RatingFinal, ROtherFinal, RPictureFinal, RDirectorFinal, RStoryFinal, UserCount, AttitudeCount, u'无', u'无', Rank, 0, isRelease)
        except Exception, e:
            print e, page_url, value
            return None

    #解析电影中的json信息
    def parser_json(self, page_url, response):
        """
            解析响应
            :param response
            :return
        """
        #将"="";"之间的内容提取出来
        pattern = re.compile(r'=(.*?);')
        result = pattern.findall(response)[0]
        if result != None:
            #json模块加载字符串
            value = json.loads(result)
            # print(result)
            try:
                isRelease = value.get('value').get('isRelease')
            except Exception, e:
                print e
                return None
            if isRelease:
                '''
                    isRelease:0 很长时间都不会上映的电影;1 已经上映的电影; 2 即将上映的电影
                '''
                if value.get('value').get('hotValue') == None:
                    #解析正在上映的电影
                    # print(self.__parser_release(page_url, value))
                    return self.__parser_release(page_url, value)
                else:
                    #解析即将上映的电影
                    # print(self.__parser_no_release(page_url, value, isRelease = 2))
                    return self.__parser_no_release(page_url, value, isRelease = 2)
            else:
                #解析还有很长时间才能上映的电影
                return self.__parser_no_release(page_url, value)

#数据存储器
#数据存储器将返回的数据插入mysql数据库中,主要包括建表,插入和关闭数据库等操作,表中设置了15个字段,用来存储电影信息,代码如下:  
#这里以后补充

class SpiderMain(object):
    def __init__(self):
        self.downloader = HtmlDownloader()
        self.parser = HtmlParser()

    def crawl(self, root_url):
        content = self.downloader.download(root_url)
        urls = self.parser.parser_url(root_url, content)

        #构造一个活的评分和票房链接
        for url in urls:
            try:
                t = time.strftime("%Y%m%d%H%M%S3282", time.localtime())
                param = {
                    'Ajax_CallBack':'true',
                    'Ajax_CallBackType': 'Mtime.Library.Services',
                    'Ajax_CallBackMethod': 'GetMovieOverviewRating',
                    'Ajax_CallBackArgument0' : '%s'%(url[1]),
                    'Ajax_RequestUrl' : '%s'%(url[0]),
                    'Ajax_CrossDomain' : '1',
                    't' : '%s'%t
                }
                rank_url = 'http://service.library.mtime.com/Movie.api?'
                rank_content = self.downloader.download(rank_url, param)
                data = self.parser.parser_json(rank_url, rank_content)

                self.output.output_end()
            except Exception, e:
                print("Crawl failed")

if __name__ == '__main__':
    spier = SpiderMain()
    spier.crawl('http://theater.mtime.com/China_Jiangsu_Province_Nanjing/')

最后

分享一份Python的学习资料,但由于篇幅有限,完整文档可以扫码免费领取!!!

1)Python所有方向的学习路线(新版)

总结的Python爬虫和数据分析等各个方向应该学习的技术栈。

在这里插入图片描述

比如说爬虫这一块,很多人以为学了xpath和PyQuery等几个解析库之后就精通的python爬虫,其实路还有很长,比如说移动端爬虫和JS逆向等等。

img

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然达不到大佬的程度,但是精通python是没有问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Echarts 雷达图的详细配置过程

文章目录 雷达图 简介配置步骤简易示例 雷达图 简介 Echarts雷达图是一种常用的数据可视化图表类型,用于展示多个维度的数据在同一坐标系下的分布情况。雷达图通过不同的坐标轴表示不同的维度,数据点的位置表示了各个维度的数值大小。 Echarts雷达图的…

035:vue项目中 radio和checkbox美化方法

第035个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

基于matlab实现的中点放炮各类地震波时距曲线程序

完整程序&#xff1a; clear all dx50;x-500:dx:500;%炮检距 h100;V11500; theta25*pi/180; V2V1/sin(theta); t1sqrt(x.*x4*h*h)/V1;%反射波时距曲线 t2abs(x)./V1;%直达波时距曲线 %折射波时距曲线 xm2*h*tan(theta);%求盲区 k1; for i1:length(x) if x(i)<-xm …

JVM 篇

一、知识点汇总 其中内存模型&#xff0c;类加载机制&#xff0c;GC是重点方面。性能调优部分更偏向应用&#xff0c;重点突出实践能力。编译器优化和执行模式部分偏向于理论基础&#xff0c;重点掌握知识点。 内存模型&#xff1a;各部分作用&#xff0c;保存哪些数据。类加载…

Python if条件分支结构

视频版教程 Python3零基础7天入门实战视频教程 如果 Python程序的多行代码之间没有任何流程控制&#xff0c;则程序总是从上向下依次执行。 但是现实生活中&#xff0c;我经常遇到一些需要做判断的业务流程。比如去银行ATM取款&#xff0c;如果密码输入正确&#xff0c;则可以…

基于matlab实现的额特征线法管道瞬变流计算程序

完整曲线&#xff1a; % 假设阀门瞬间关闭 % 初始数据: clear tic L3000; % 管线长度 Hr70; % 泵压力 N10; % 分段数 NSN1; % 节点数 e0.001651; % 壁厚m,0.065 D0.00635-2*e; % 管道内径 K2.1e9; % 流体体积弹性系数 Rho…

软考高级架构师下篇-15嵌入式系统架构设计的理论

目录 1. 引言2. 嵌入式系统发展历程3. 嵌入式系统硬件4.嵌人式系统软件5.嵌入式系统软件架构设计方法6.嵌入式系统软件架构实践7. 前文回顾1. 引言 此章节主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲,本小时知识点会涉及案例分析题(25分)。在历年考…

Redis 配置文件详解 - 持久化(RDB、AOF)

目录 Redis 配置文件详解 单位 包含 INCLUDES 网络 NETWORK 通用 GENERAL 快照 SNAPSHOTTING &#xff08;持久化&#xff09; 复制 REPLICATION&#xff08;主从复制&#xff09; 安全 SECURITY&#xff08;账号密码设置&#xff09; ​编辑 限制 CLIENTS 追加模…

Redis - 超越缓存的多面手

文章目录 Redis 使用场景图解 Redis 使用场景 Redis可以在各种场景中使用 &#x1f539;会话 我们可以使用Redis在不同服务之间共享用户会话数据。 &#x1f539;缓存 我们可以使用Redis缓存对象或页面&#xff0c;特别是对于热点数据。 &#x1f539;分布式锁 我们可以使用…

gin框架再探

Gin框架介绍及使用 | 李文周的博客 (liwenzhou.com) lesson03_gin框架初识_哔哩哔哩_bilibili 1.路由引擎 //路由引擎 rgin.Default() 2.一些http请求方法 get post put delete等等 遇到什么路径&#xff0c;执行什么函数 r.GET("/hello",func{做你想做的事返回…

【Linux】缓冲区/回车换行

1、缓冲区 C程序默认有输出缓冲区。数据输出时&#xff0c;被及时看到&#xff0c;是立马刷新了&#xff1b;如果没被看到&#xff0c;是被暂存在数据缓冲区中。fflush(stdout); 【强制刷新】\n【行刷新&#xff0c;也是一种刷新方式】 2、回车换行 \n【回车换行】输入完一行内…

如何根据性能需求进行场景设计?

场景设计一 探索 测试环境 客户端: win10 这里可以用linux,但没用,因为想直观查看结果。 被测环境:linux X86 4核CPU16G内存 被测接口:登录接口,没有做数据驱动。 在测试执行前,先使用influxSQL把influxdb的数据清理一下,以防影响结果查看。 有这么一个需求,要求系…

docker中安装Ubuntu20,浏览器访问其图形界面

介绍 Kasm&#xff08;https://kasmweb.com/&#xff09;是一家提供虚拟化和远程访问解决方案的公司。他们的主要产品是 Kasm Workspaces&#xff0c;它是一个基于浏览器的虚拟桌面和应用程序交付平台。 Kasm Workspaces 基于开源项目 Apache Guacamole 和 Chromium 浏览器引…

python连接mysql数据库的练习

一、导入pandas内置的sqlite3模块&#xff0c;连接的信息&#xff1a;ip地址是本机, 端口号port 是3306, 用户user是root, 密码password是123456, 数据库database是lambda-xiaozhang import pymysql# 打开数据库连接&#xff0c;参数1&#xff1a;主机名或IP&#xff1b;参数…

安装Anaconda与pytorch,在IDEA中配置环境进行编程

1.官网下载与自己python版本匹配的Anaconda(注意&#xff0c;要想成功安装pytorch&#xff0c;python版本也要对应pytorch的相关版本) Anaconda官网最新版本 与自己python版本不否请查找自己版本anaconda版本对应 清华大学镜像下载 2.安装时勾选添加环境变量或者手动添加&am…

Vue.js vs React:哪一个更适合你的项目?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

红外检漏技术

SF6气体绝缘设备发生泄漏后会造成运行开关闭锁、 内部绝缘击穿&#xff0c; 泄漏到空气中会造成环境污染&#xff0c; 并严重危害现场人员安全。 再加之SF6气体成本高&#xff0c; 频繁补气&#xff0c; 使维护成本增加&#xff0c; 造成经济损失。 红外检漏是依据SF6气体对红外…

SpringBoot如何保证接口安全?

对于互联网来说&#xff0c;只要你系统的接口暴露在外网&#xff0c;就避免不了接口安全问题。如果你的接口在外网裸奔&#xff0c;只要让黑客知道接口的地址和参数就可以调用&#xff0c;那简直就是灾难。 举个例子&#xff1a;你的网站用户注册的时候&#xff0c;需要填写手…

byte buddy字节码增强——输出方法执行时间

目标&#xff1a; 输出各函数执行时间 引包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

Vue Router入门:为Vue.js应用添加导航

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…