前面所讲的都是对静态网页进行抓取,本博客介绍动态网站的抓取。 动态网站的抓取 相比静态网页来说困难一些,主要涉及的技术是Ajax和动态Html。简单的网页访问是无法获取完整的数据,需要对数据加载流程进行分析。针对不同的动态网页爬取方法,将分别用具体实例进行介绍。本博客主要是直接利用Ajax来获取数据。

页面分析

本博客以MTime电影网为例,主要爬取电影的评分票房等信息。首先使用火狐浏览器的控制台来查看页面信息。

对于页面中的票房信息是无法在HTML中获取到,其是通过js进行动态加载获得的,那么就查找相应的js响应。就是从一堆js请求中查看一些含有Ajax字段的请求。http://service.library.mtime.com/Movie.api?Ajax_CallBack=true&Ajax_CallBackType=Mtime.Library.Services&Ajax_CallBackMethod=GetMovieOverviewRating&Ajax_CrossDomain=1&Ajax_RequestUrl=http%3A%2F%2Fmovie.mtime.com%2F242129%2F&t=2020512134567406&Ajax_CallBackArgument0=242129

点进去之后查看返回的数据:

找到相应的链接和返回数据之后,就需要分析这个链接的构造方法和分析返回的数据。

(1)在链接中一共有7个参数,我们首先需要分析那些参数是不变的哪些是更具不同电影变化的。通过对比两个不同的电影链接可以发现其中有4个参数不变,有3个参数是动态变化的,分别是Ajax_RequestRrl、t和Ajax_CallBackArgument0。通过分析可以发现这三个参数分别表示的是当前页面url、当前请求时间和电影表示的数字。

(2)提取响应数据。响应内容主要分为三种,分别是正在上映的电影信息,一种即将上映的电影信息,最后一种是还有比较长时间才能上映的电影信息。具体的在代码中展示。

具体实现代码

本文代码是基于博客实现的,本博客只是将其中需要更改的部分修改了。

网页解析

在HtmlParser类中定义一个parser_url方法,代码如下:

 def parser_url(self, page_url, response):pattern = re.compile(r'(http://movie.mtime.com/(\d+)/)')urls = pattern.findall(response)if urls != None:return list(set(urls))else:return None

提取响应数据中的有效数据:

 def parser_json(self, page_url, respone):"""解析响应:param page_url::param respone::return:"""#将“=”和“;”之间的内容提取出来pattern = re.compile(r'=(.*?);')result = pattern.findall(respone)[0]if result != None:value = json.loads(result)try:isRelease = value.get('value').get('isRelease')except Exception,e:print(e)return Noneif isRelease:if value.get('value').get('hotValue') == None:return self._parser_release(page_url, value)else:self._parser_no_release(page_url, value, isRelease = 2)else:return self._parser_no_release(page_url, value)def _parser_release(self, page_url, value):"""解析已上映的影片:param page_url::param value::return:"""try:isRelease = 1movieRating = 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 = 0return (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 Nonedef _parser_no_release(self,page_url,value,isRelease = 0):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 = 0return (MovieId,movieTitle,RatingFinal,ROtherFinal,RPictureFinal,RDirectorFinal,RStoryFinal,Usercount,AttitudeCount,u'无',u'无',Rank,0,isRelease)except Exception,e:print(e, page_url, value)return None

爬虫调度器

    def dynamic_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())rank_url ='http://service.library.mtime.com/Movie.api'\'?Ajax_CallBack=true'\'&Ajax_CallBackType=Mtime.Library.Services'\'&Ajax_CallBackMethod=GetMovieOverviewRating'\'&Ajax_CrossDomain=1'\'&Ajax_RequestRrl=%s'\'&t=%s'\'&Ajax_CallBackArgument0=%s'%(url[0],t,url[1])rank_content = self.downloader.download(rank_url)data = self.parser.parser_json(rank_url,rank_content)print(data)except Exception,e:print('Crawl failed')if __name__=="__main__":spider_main = SpiderMain()spider_main.dynamic_crawl("http://theater.mtime.com/China_Beijing/")

Python动态网页爬取相关推荐

  1. python动态网页爬取_Python 动态页面内容爬取

    实在没啥技术含量.用python3写的.现在已经不用python2了.直接终端下随手ipython调试 ╰─$ ipython3 Python 3.4.3 (default, Oct 14 2015, ...

  2. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  3. Python动态爬虫爬取京东商品评论

    Python 动态爬虫爬取京东商品评论 1. 概述 京东商城是Python爬虫初学者试手的经典平台,反爬虫程度较低,但评论采取了动态加载的方式,爬取京东商品评论是学习动态爬虫的一个极佳方法. 动态爬虫 ...

  4. Python 单网页爬取

    目录 任务描述 相关知识 网络爬虫 网络爬虫:载入 网络爬虫:动态载入 网络爬虫:解析 编程要求 测试说明 任务描述 本关任务:编写一个爬虫,爬取 www.jd.com 网的 title. 相关知识 ...

  5. mac如何用python爬网页数据_Mac——利用Python进行网页爬取

    Mac--利用Python进行网页爬取 目标:利用Python爬取网页中的指定内容,例如,爬取百度百科网页中四川省的别名.html 输出:四川省的别名为:川.蜀.天府之国python 我的经验,网页爬 ...

  6. python手机壁纸超清_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  7. 网络爬虫(动态网页爬取关于混合动力汽车的论文数据)

    一.实验目的 (1) 熟悉网页浏览器开发工具的使用: (2) 掌握动态网页加载过程: (3) 掌握 post 请求参数设置: (4) 掌握基本的反反爬技术: (5) 能够根据问题需求,指定网络爬虫方案 ...

  8. Python网络爬虫数据采集实战:同花顺动态网页爬取

    前文的爬虫都建立在静态网页基础之上,首先通过请求网站url获取到网页源代码.之后对源代码进行信息提取进而存储即可,本文则针对动态网页进行数据采集,首先介绍Ajax相关理论,之后实战爬取同花顺动态网页, ...

  9. webmagic+selenium模拟浏览器启动(动态网页爬取方法之一的第一步)

    现在绝大多数网页都是动态生成的,那么学习爬虫就意味着更加困难.若是静态网页,只需要了解如何连接网络和分析网页源代码提取标签信息即可,但是动态网页的话,就需要使用到一些特定的框架来爬取了.比较实用的爬取 ...

  10. 【Python】网页爬取CVPR论文

    动机 利用python自动下载 cvpr论文 流程 获取网页内容 找到所有论文链接 下载 1. 获取网页内容 所用模块:requests 重要函数:requests.get 输出:web_contex ...

最新文章

  1. 页面性能优化详细总结
  2. IDApython 命令
  3. 自动化测试之鼠标悬浮操作、双击、鼠标拖拽
  4. 【Linux】Linux下建立和管理逻辑卷
  5. 作用域和作用域链 —javascript面向对象高级
  6. 深入Java核心 Java内存分配原理精讲(3)
  7. 最近点对问题(分治法)
  8. openstack用户列表_什么是OpenStack超级用户?
  9. linux postgre服务名,linux中service配置之postgresql
  10. docker host模式拿到nginx远程ip端口_FastDFS基于Docker安装,免采坑版
  11. c语言中 程序各步作用,c程序的上机执行过程_上机运行C程序的步骤与方法
  12. 设置linux服务器下开放端口
  13. SQL十进制和十六进制相互转换
  14. 如何在VScode中配置python第三方库
  15. 道路千万条,转行第一条。材料不劝退,亲人两行泪。
  16. 锐捷交换机密码恢复操作
  17. 新版HCIE考试有什么题型?各题型具体怎么考?
  18. 改版后的51la统计,与旧版有何区别呢?
  19. 仿JD商城UI布局达到90%——Android源码
  20. Java介绍和概述——基本

热门文章

  1. 2022牛客多校9 BTwo Frogs(概率DP)
  2. STM32F103_study67_The punctual atoms(STM32 OLED display experiment)
  3. spark-streaming 编程(六)mapwithState
  4. python flask豆瓣微信小程序案例
  5. python黑魔法指南_python黑魔法
  6. ZipOutputStream导出压缩文件
  7. Python学习笔记(5)-集成开发环境IDLE的使用与调试
  8. Ubuntu18中添加中文输入法
  9. linux下 安装企业微信
  10. stm32摄像头调试 | 串口传输照片数据 | 用python来设计上位机通信软件