目标意义

为了理解动态网站中一些数据如何获取,做一个简单的分析。

说明

思路,原始代码来源于:https://book.douban.com/subject/27061630/。

构造-下载器

构造分下载器,下载原始网页,用于原始网页的获取,动态网页中,js部分的响应获取。

通过浏览器模仿,合理制作请求头,获取网页信息即可。

代码如下:

  1. import requests
  2. import chardet
  3. class HtmlDownloader(object):
  4. def download(self,url):
  5. if url is None:
  6. return None
  7. user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'
  8. headers={'User-Agent':user_agent}
  9. r=requests.get(url,headers=headers)
  10. if r.status_code is 200:
  11. r.encoding=chardet.detect(r.content)['encoding']
  12. return r.text
  13. return None

构造-解析器

解析器解析数据使用。

获取的票房信息,电影名称等,使用解析器完成。

被解析的动态数据来源于js部分的代码。

js地址的获取则通过F12控制台-->网络-->JS,然后观察,得到。

地址如正上映的电影:

http://service.library.mtime.com/Movie.api?Ajax_CallBack=true&Ajax_CallBackType=Mtime.Library.Services&Ajax_CallBackMethod=GetMovieOverviewRating&Ajax_CrossDomain=1&Ajax_RequestUrl=http://movie.mtime.com/257982/&t=201907121611461266&Ajax_CallBackArgument0=257982

返回信息中,解析出json格式的部分,通过json的一些方法,获取其中的票房等信息。

其中,json解析工具地址如:https://www.json.cn/

未上映的电影是同理的。

这些数据的解析有差异,所以定制了函数分支,处理解析过程中可能遇到的不同情景。

代码如下:

  1. import re
  2. import json
  3. class HtmlParser(object):
  4. def parser_url(self,page_url,response):
  5. pattern=re.compile(r'(http://movie.mtime.com/(\d+)/)')
  6. urls=pattern.findall(response)
  7. if urls != None:
  8. return list(set(urls))#Duplicate removal
  9. else:
  10. return None
  11.  
  12. def parser_json(self,url,response):
  13. #parsing json. input page_url as js url and response for parsing
  14. pattern=re.compile(r'=(.*?);')
  15. result=pattern.findall(response)[0]
  16. if result != None:
  17. value=json.loads(result)
  18. isRelease=value.get('value').get('isRelease')
  19. if isRelease:
  20. isRelease=1
  21. return self.parser_json_release(value,url)
  22. else:
  23. isRelease=0
  24. return self.parser_json_notRelease(value,url)
  25. return None
  26. def parser_json_release(self,value,url):
  27. isRelease=1
  28. movieTitle=value.get('value').get('movieTitle')
  29. RatingFinal=value.get('value').get('movieRating').get('RatingFinal')
  30. try:
  31. TotalBoxOffice=value.get('value').get('boxOffice').get('TotalBoxOffice')
  32. TotalBoxOfficeUnit=value.get('value').get('boxOffice').get('TotalBoxOfficeUnit')
  33. except:
  34. TotalBoxOffice="None"
  35. TotalBoxOfficeUnit="None"
  36. return isRelease,movieTitle,RatingFinal,TotalBoxOffice,TotalBoxOfficeUnit,url
  37.  
  38. def parser_json_notRelease(self,value,url):
  39. isRelease=0
  40. movieTitle=value.get('value').get('movieTitle')
  41. try:
  42. RatingFinal=Ranking=value.get('value').get('hotValue').get('Ranking')
  43. except:
  44. RatingFinal=-1
  45. TotalBoxOffice='None'
  46. TotalBoxOfficeUnit='None'
  47. return isRelease,movieTitle,RatingFinal,TotalBoxOffice,TotalBoxOfficeUnit,url

构造-存储器

存储方案为Sqlite,所以在解析器中isRelease部分,使用了0和1进行的存储。

存储需要连接sqlite3,创建数据库,获取执行数据库语句的方法,插入数据等。

按照原作者思路,存储时,先暂时存储到内存中,条数大于10以后,将内存中的数据插入到sqlite数据库中。

代码如下:

  1. import sqlite3
  2. class DataOutput(object):
  3. def __init__(self):
  4. self.cx=sqlite3.connect("MTime.db")
  5. self.create_table('MTime')
  6. self.datas=[]
  7.  
  8. def create_table(self,table_name):
  9. values='''
  10. id integer primary key autoincrement,
  11. isRelease boolean not null,
  12. movieTitle varchar(50) not null,
  13. RatingFinal_HotValue real not null default 0.0,
  14. TotalBoxOffice varchar(20),
  15. TotalBoxOfficeUnit varchar(10),
  16. sourceUrl varchar(300)
  17. '''
  18. self.cx.execute('create table if not exists %s(%s)' %(table_name,values))
  19.  
  20. def store_data(self,data):
  21. if data is None:
  22. return
  23. self.datas.append(data)
  24. if len(self.datas)>10:
  25. self.output_db('MTime')
  26.  
  27. def output_db(self,table_name):
  28. for data in self.datas:
  29. cmd="insert into %s (isRelease,movieTitle,RatingFinal_HotValue,TotalBoxOffice,TotalBoxOfficeUnit,sourceUrl) values %s" %(table_name,data)
  30. self.cx.execute(cmd)
  31. self.datas.remove(data)
  32. self.cx.commit()
  33.  
  34. def output_end(self):
  35. if len(self.datas)>0:
  36. self.output_db('MTime')
  37. self.cx.close()

主函数部分

创建以上对象作为初始化

然后获取根路径。从根路径下找到百余条电影网址信息。

对每个电影网址信息一一解析,然后存储。

  1. import HtmlDownloader
  2. import HtmlParser
  3. import DataOutput
  4. import time
  5. class Spider(object):
  6. def __init__(self):
  7. self.downloader=HtmlDownloader.HtmlDownloader()
  8. self.parser=HtmlParser.HtmlParser()
  9. self.output=DataOutput.DataOutput()
  10.  
  11. def crawl(self,root_url):
  12. content=self.downloader.download(root_url)
  13. urls=self.parser.parser_url(root_url, content)
  14. for url in urls:
  15. print('.')
  16. t=time.strftime("%Y%m%d%H%M%S1266",time.localtime())
  17. rank_url='http://service.library.mtime.com/Movie.api'\
  18. '?Ajax_CallBack=true'\
  19. '&Ajax_CallBackType=Mtime.Library.Services'\
  20. '&Ajax_CallBackMethod=GetMovieOverviewRating'\
  21. '&Ajax_CrossDomain=1'\
  22. '&Ajax_RequestUrl=%s'\
  23. '&t=%s'\
  24. '&Ajax_CallBackArgument0=%s' %(url[0],t,url[1])
  25. rank_content=self.downloader.download(rank_url)
  26. try:
  27. data=self.parser.parser_json(rank_url, rank_content)
  28. except:
  29. print(rank_url)
  30. self.output.store_data(data)
  31.  
  32. self.output.output_end()
  33. print('ed')
  34. if __name__=='__main__':
  35. spider=Spider()
  36. spider.crawl('http://theater.mtime.com/China_Beijing/')

当前效果

如下:

python网络爬虫(11)近期电影票房或热度信息爬取的更多相关文章

  1. Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页

    爬取目标站点里所有的网页 使用的系统:Windows 10 64位 Python语言版本:Python 3.5.0 V 使用的编程Python的集成开发环境:PyCharm 2016 04 一 . 首 ...

  2. 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

  3. 转:【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

  4. 《精通Python网络爬虫》|百度网盘免费下载|Python爬虫实战

    <精通Python网络爬虫>|百度网盘免费下载|Python爬虫实战 提取码:7wr5 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...

  5. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...

  6. 一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接

    [一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来 ...

  7. 从零开始学Python网络爬虫PDF高清完整版免费下载|百度网盘

    百度网盘:从零开始学Python网络爬虫PDF高清完整版免费下载 提取码:wy36 目录 前言第1章 Python零基础语法入门 11.1 Python与PyCharm安装 11.1.1 Python ...

  8. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  9. Python网络爬虫

    http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...

随机推荐

  1. win32Helper

    点击别的winform窗口的按钮 #region 点击别的窗口的按钮 [DllImport("user32.dll", EntryPoint = "FindWindowA ...

  2. 深入理解Amazon Alexa Skill(四)

    本节利用三星Smartthings Classic物联网平台的web service smartapp,实现了一个Alexa智能家居skill的例子,由此来了解Alexa是如何控制其他云的智能家居设备 ...

  3. erp的核心代码,替代orm

    public static SqlParameter[] get_array_list<T>(ArrayList rows) where T : class { Hashtable sql ...

  4. Win8 Metro(C#)数字图像处理--2.44图像油画效果算法

    原文:Win8 Metro(C#)数字图像处理--2.44图像油画效果算法  [函数名称]   图像油画效果      OilpaintingProcess(WriteableBitmap src ...

  5. SqlServer 使用脚本创建分发服务及事务复制的可更新订阅

    原文:SqlServer 使用脚本创建分发服务及事务复制的可更新订阅 [创建使用本地分发服务器] /************************[使用本地分发服务器配置发布]*********** ...

  6. Cindy components(配色很不错)

    https://sourceforge.net/projects/tcycomponents/

  7. 卸载win10内置windows app的方法

    原文:卸载win10内置windows app的方法 2015年,微软推出了windows10操作系统,其以漂亮的界面.良好的操作方式.方便的推送升级迅速获得了好多人的好评,因此,好多同学都换了win ...

  8. ML:吴恩达 机器学习 课程笔记(Week9~10)

    Anomaly Detection Recommender Systems Large Scale Machine Learning

  9. How to Capture the Integer-Divide-By-Zero Error in C++(提前定义信号)

    How to Capture the Integer-Divide-By-Zero Error in C++? MANUAL CAPTURE The simple and straightforwar ...

  10. 百度网盘背后的存储系统atlas

    原文  http://www.bitstech.net/2015/07/25/baidu-atlas/   百度网盘免费提供2TB存储, 它的存储量一定是惊人的, 支持它的存储系统atlas也是相当不 ...