Python自定义豆瓣电影种类,排行,点评的爬取与存储(基础)
来源:互联网 发布:java微信开发教程csdn 编辑:程序博客网 时间:2024/05/30 23:08
本文转载于:http://blog.csdn.net/mrlevo520/article/details/52003702
Python 2.7
IDE Pycharm 5.0.3
具体Selenium和PhantomJS配置及使用请看调用PhantomJS.exe自动续借图书馆书籍
我一直以为,PhantomJS就是无界面的浏览器而已,用Selenium调用PhantomJS和调用Firefox并没有区别
起因
今天想写个爬豆瓣高分电影及评论的小爬虫,刚开始一直调用浏览器进行模拟登陆测试,之后换成调用PhantomJS之后,竟然奇迹般的不好使了!换回浏览器,又正常了!WTF,说好的只是无界面浏览器呢!怎么和导演说的不一样啊!
引用
这是两段网上和书上都有的话,应该没有什么问题
PhantomJS是一个服务器端的 JavaScript API 的WebKit(开源的浏览器引擎)。其支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。
因为脚本好像是一个Web浏览器上运行的一样,标准的DOM脚本和CSS选择器可以很好的工作。这使得PhantomJS适合支持各种页面自动化任务。
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性、测试系统功能,它ThoughtWorks专门为Web应用程序编写的一个验收测试工具。
参考这种资料来看,个人认为,PhantomJS完全可以模拟正常浏览器,简单说就是个无界面轻量级浏览器,不知我理解的可对。
实例分析
目的
根据用户输入,列出豆瓣高分TOP(用户自定义)的电影,链接,及热评若干。(后面几篇博文会更加完善这一想法,这里只是针对豆瓣高分电影)
方案
使用PhantomJS+Selenium+Firefox实现
实现过程
1.get到首页后,先点击豆瓣高分,然后点击按照评分,进行排序
2.抓取每个电影及超链接,进入超链接后,抓取当前电影的热评
3.当用户所要求TOP数目大于第一页的20个时候,点击加载更多,再出现20个电影,重复2操作。
点击过程
实现代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
上述代码是我最后调试出来可行的,比如说我输入22,那么最后结果输出是:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
上面的代码是可以实现的,但需要Firefox的配合,因为我其中一个引擎调用了Firefox,另一个抓评论的用了PhantomJS。
出现问题
- 1
- 1
当我driver_item使用PhantomJS而不是Firefox的时候,奇怪的事情出现了,21个电影,又重新回了第一个!
就像这样!
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
可以看到,评论都是不一样的,说明抓取的是动态网页而且进行了二次抓取,我不明白为什么我代码没有改变,只是调用的引擎不一样,会产生两个不同的结果,难道是js渲染问题么?
首选我分析了一下我的“加载更多”是否合理
我采用的方法是,建立一个循环,当用户需求数大于页面存在元素数目就点击一下操作,然后再进行获取
经过观察,我写下如下一个循环,觉得应该算简便(其实是错误的,抱歉)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
也就是说,如果用户想看TOP22的,那第一页的20个电影已经不能满足了,需要点击加载更多,隐藏的元素才会被捉到,不然会出现无法定位元素的老问题。
↑补充↑,我犯了个严重的错误
上述那个循环是错误的!我测试到41时候才发现,点击一次之后,查询num=41元素是否存在是不合理的,肯定是不会存在的!,我当时只想着需要查询21的时候,点击一次“加载更多”之后,会出现40个元素,那么我要的21肯定在其中的,所以,我犯了想当然的错误,根本没有考录40以上情况,所以经过改进,应该是这样的,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
我是分步分模块来测试的,这个完全没有问题的,只要设置一下休眠时间,等待缓冲完成,一点毛病没有。那问题真的出在调用引擎的问题上么?我来回测试过十多次,每次只要我换引擎了,那么一定出错,电影循环被抓,其中的奥秘我现在还不知道,如果有谁知道,请麻烦留言告诉我一声,我捉摸了半下午还没有头绪。。。
Pay Attention
暂且不说刚才的问题,解决方案找到了暂且能用还是好的,这里说一下我写这个爬虫遇到的问题
1.元素无法定位问题
1.解决方案,首先查看是不是隐藏元素,其次再看自己的规则有没有写错,还有就是是不是页面加载未完成,详见解决网页元素无法定位(NoSuchElementException: Unable to locate element)的几种方法
2.只采集自己需要的数据,剔除无用数据,比如说,刚开始我用
- 1
- 1
然后写个取出list中元素的方法,但是这样的话,一个便签下内容未必太多,并不是我想要的如图:
比如说,我只想要红色的部分,那么,采取elements就不太好处理。
2.解决方案,我采用的方法是格式化字符串!这个方法我在Selenium+PhantomJS自动续借图书馆书籍(下)也用过,根据元素的特性,可以发现,每个热评的正文标签不一样的,其余标签一样,只要格式化正文标签即可,像这样
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
3.一个引擎干有个事!我现在没办法,只有将第一个需要处理的页面用Firefox来处理,之后评论用PhantomJS来抓取,之后可以用quit来关闭浏览器,但是启动浏览器还是会耗费好多资源,而且挺慢,虽然PhantomJS也很慢,我12G内存都跑完了。。。。。。看样子是给我买8x2 16G双通道的借口啊。
4.备注不标准也会导致程序出错,这个是我没想到的,我一直以为在”’备注”’之间的都可以随便来,结果影响程序运行了,之后分模块测试才注意到这个问题,也是以前没有遇到过的,切记!需要规范自己代码,特别是像Python这样缩进是灵魂的语言。。。。
最后
耗费好多时间整这个,特别是调用引擎的问题折磨了我半下午,还有就是等待页面加载的问题,代码很简单,但是调试的时间却很久,差不多这个小爬虫花了我五六个小时!!主程序没啥问题,但是调试和修BUG花了好多时间!还是不够成熟啊技术。。。。
PS
科四一点没看,得停下来看看科四啦,我还想暑假回家开挖掘机呢——-0.0买了本Python的数据结构的书和网络数据采集的书,看来得好好的补补基础!
致谢
@MrLevo520–解决网页元素无法定位(NoSuchElementException: Unable to locate element)的几种方法
@Eastmount–[Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论
@Eastmount–[Python爬虫] 在Windows下安装PIP+Phantomjs+Selenium
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(基础)
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(初级)
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶上)
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(高阶上)
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(初级)
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶上)
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶下)
- Python爬取豆瓣电影
- Python爬取豆瓣电影
- Python爬取豆瓣电影
- 爬取豆瓣的电影
- python-scrapy 实现对豆瓣电影的爬取
- 使用python爬取豆瓣电影图片(-)
- Python 爬取豆瓣电影Top250(一)
- Python Scrapy(2)-爬取豆瓣电影详解
- Python爬取豆瓣电影top250
- python爬取豆瓣电影信息
- matlab2016a运行时,出现问题错误记录
- MairaDB 函数(四)
- Filter过滤器执行的顺序
- 文章标题
- 详解JUC之原子类概述
- Python自定义豆瓣电影种类,排行,点评的爬取与存储(基础)
- 使用STM32CubeMX创建STM32F407工程
- centos shell 编程-通过端口号kill对应的进程
- 鸡仔单片机成长记----------------学会使用宏晶ISP软件
- LeetCode刷题(C++)——Maximum Subarray(Easy)
- css3选择器
- 用Redis bitmap统计活跃用户、留存
- Arduino分割字符串
- Java多线程基础解析