本案例介绍从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爬虫---实现项目(一) Requests爬取HTML信息

    上面的博客把基本的HTML解析库已经说完了,这次我们来给予几个实战的项目. 这次主要用Requests库+正则表达式来解析HTML. 项目一:爬取猫眼电影TOP100信息 代码地址:https://g ...

  2. Python爬虫学习三------requests+BeautifulSoup爬取简单网页

    第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...

  3. Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

    目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...

  4. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  5. Python之爬虫(二十) Scrapy爬取所有知乎用户信息(上)

    爬取的思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关注的人的账号信息,然后爬取被关注人的账号 ...

  6. Python 爬虫实例(8)—— 爬取 动态页面

    今天使用python 和selenium爬取动态数据,主要是通过不停的更新页面,实现数据的爬取,要爬取的数据如下图 源代码: #-*-coding:utf-8-*- import time from ...

  7. 小白学 Python 爬虫(25):爬取股票信息

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. Python爬虫教程:验证码的爬取和识别详解

    今天要给大家介绍的是验证码的爬取和识别,不过只涉及到最简单的图形验证码,也是现在比较常见的一种类型. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻 ...

  9. Python爬虫学习(6): 爬取MM图片

    为了有趣我们今天就主要去爬取以下MM的图片,并将其按名保存在本地.要爬取的网站为: 大秀台模特网 1. 分析网站 进入官网后我们发现有很多分类: 而我们要爬取的模特中的女模内容,点进入之后其网址为:h ...

随机推荐

  1. ASP.NET Core 2.0 MVC「远程」验证

    问题 如何 在ASP.NET Core MVC中使用[Remote]属性来实现模型验证 . 解 在 启动时, 为MVC配置中间件和服务. 添加一个模型. 添加一个控制器. 为jQuery添加一个Raz ...

  2. Getting Started With setuptools and setup.py

    https://pythonhosted.org/an_example_pypi_project/setuptools.html http://www.ianbicking.org/docs/setu ...

  3. x01.AntWorld: An Python AI Game

    1. 学习了一下 AI 五子棋,顺手改作 19 路的棋盘,便于围棋通用.render.py 主要修改如下: # 常量部分: IMAGE_PATH = 'img/' StoneSize = 32 WID ...

  4. Composer笔记

    安装 windows中安装Composer 一般来说,windows下安装composer有两种办法,一种是直接下载并运行Composer-Setup.exe,这种方法在中国似乎很难完成安装.另一种就 ...

  5. 转: .Net 4.0 ExpandoObject 使用

    本篇文章中就ExpandoObject的基本使用进行一些demo.我们几乎都知道dynamic特性是.net 4.0中一个主要的新特性,而ExpandoObject正是这样的一个动态的类型.Expan ...

  6. 用JAVA中BufferedImage画出漂亮的验证码点击变化

    如果我们想用JAVA中BufferedImage画出漂亮的验证码点击变化怎么实现呢,类似这样: 点击变化,以下是实现过程,直接上代码: 首先前台:<i><img style=&quo ...

  7. 《java.util.concurrent 包源码阅读》22 Fork/Join框架的初体验

    JDK7引入了Fork/Join框架,所谓Fork/Join框架,个人解释:Fork分解任务成独立的子任务,用多线程去执行这些子任务,Join合并子任务的结果.这样就能使用多线程的方式来执行一个任务. ...

  8. 用lua+redis实现一个简单的计数器功能 (一)

    首先安装环境 依赖环境有 luajit http://luajit.org ngx_devel_kit https://github.com/simpl/ngx_devel_kit echo-ngin ...

  9. SpringCloud学习笔记(3)——Hystrix

    参考Spring Cloud官方文档第13.14.15章 13. Circuit Breaker: Hystrix Clients Netflix提供了一个叫Hystrix的类库,它实现了断路器模式. ...

  10. ASE加密

    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.