时间:2022-10-09 17:37:41 | 浏览:441
很多网站的数据,比如电商网站商品的价格,评论等等会采用动态加载的方式来加载,这样可能在爬虫程序刚刚访问时无法直接获取到相关数据。那么怎么应对这样的问题呢?
5.1 动态网页的使用场景
这是京东上看一本书的场景。我们发现打开一本书之后,书的价格,排名等信息及书的评论信息不是在我们第一次打开网站时就立即加载进来的。而是通过二次请求或多次的异步请求获取的。这样的页面就是动态页面。
关于动态页面使用的场景:
希望异步刷新的场景。有些网页内容很多,一次加载完对服务器压力很大,而且有的用户不会去查看所有内容;
5.2 回到与HTTP服务器发送请求数据的原始方法
5.2.1 GET方法
GET把参数数据队列添加到URL中,Key和Value的各个字段一一对应;在URL中可以看到。
浏览器的URL中有些符号,字符不能被很好的识别。那么我们需要有一套编码的方式来传递信息。所以发送端需要做urlencode; 接收端需要做urldecode;1.https://www.baidu.com/s?wd=DNS
?xxx=yyy&time=zzz get 请求的标识
2.http://acb.com/login?name=zhangsan&password=123
login: name=zhangsan password=123
示例代码:SpiderCodesaiduSearchp2.py
5.2.2 POST方法
这是有道翻译的页面,仔细观察会发现,当用户每次输入一个想要翻译的词语时,页面的URL信息并不发生任何改变。这是一个典型的异步使用Ajax的技术,用JSON格式进行数据的传递。
我们如何利用爬虫程序来实现一个自己的翻译器呢?
来看代码示例:SpiderCodesyoudaofanyip2.py5.3 更加难以对付的动态网站
5.3.1 应对需要多次数据的交互模拟的网站
我们有时会遇到像淘宝这样的大型网站,对数据版权看得特别重的,它们的网站有大量的工程师和技术人员去维护,它们也可能在技术手段上采用多次交互数据包的方式来完成网站服务器与用户浏览器之间的交互。如果此时还采用传统的分析数据包的方式会比较的复杂,难度较高。那么,有没有一劳永逸的方法,来解决此类问题呢?
我们的解决方案是:Selenium + PhantomJS。
我们的爬虫其实就是在做模拟浏览器的行为。
5.3.2 Selenium
一个Web自动化测试工具,最初是为了网站自动化测试而开发的;我们玩游戏有按键精灵;Selenium也可以做类似的事情,但是它是在浏览器中做这样的事情。
安装: sudo pip install selenium(pip install selenium)
在Python中 from selenium import webdriver 来测试是否装好
说明:想要用Python做自动化测试的童鞋们可以好好研究一下Selenium的使用。
5.3.3 PhantomJS
一个基于webkit无界面(headless)的浏览器,它可以把网站加载到内存中并执行页面上的JS,但它没有图形用户界面,所以耗费的资源比较少;
安装: sudo apt install phantomjs (此方法可能安装不完整,导致部分功能无法使用)
Linux Ubuntu下完全安装的方法(参看
http://blog.csdn.net/m0_38124502/article/details/79276499
)
Wget
https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
cd 下载
tar -xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/
cd bin/
sudo cp phantomjs /usr/bin
python -启动-> 浏览器进程phantomjs,
测试:
SpiderCodesPhantomjs.. 对其中的例子helloworld.js, pageload.js
进行测试;
注意: ****有可能造成资源泄漏;为了避免这种事的发生,需要有个策略适当的时候去kill phantomjs进程。
5.3.4 Selenium + PhantomJS
双剑合璧利用二者同时完成某个任务,示例代码如下:
SpiderCodes estPhantomJS.py
5.4 关于动态网站信息抓取的总结
总的来说,我们的爬虫要尽量模拟的看起来就像是真正的用户在浏览器上访问服务器网站的行为。如果我们使用GET或POST的方式来模拟浏览器与服务器间通信的行为,成本比较低,但是应对复杂的网站或者服务器精心防御的网站来说是很难骗过服务器的。Selenim+PhantomJS的方案则会让我们的程序看起来更像是普通的用户,但是它的效率相对而言会降低很多,速度也会慢很多。在大规模爬去数据时可能遇到许多新的挑战。(比如网站尺寸的设置,等待时间的设定等)
练习: 抓取猫眼电影 http://maoyan.com/board/4?offset 中TOP100的电影榜单;
Python是一门很出色的胶水语言,也就是当我们有现成的组件后,Python非常适合将他们组装起来。机器学习的例子就比较典型。我们用C++写好Tensorflow,用C写好Numpy,用Scala写好Spark,现在想用这些组件训练一个机器
普通程序员,不学算法,也可以成为大神吗?对不起,这个,绝对不可以。可是算法好难啊~~看两页书就想睡觉……所以就不学了吗?就一直当普通程序员吗?如果有一本算法书,看着很轻松……又有代码示例……又有讲解……怎么会有那样的书呢?哎呀,最好学了算法
我不喜欢一上来就推荐一堆参考资料的东西,那只会让初学者更迷茫。好比一个婴儿,你告诉他学会走路的方法有100种,他只会变的对走路毫无兴趣,他要的只是一种最有效的学会走路的办法,而不是100种。同样的,下面介绍的是我之前刚开始自己学习pytho
Python学习第一天,首先安装python环境和编程软件PyCharm,安装好之后就可以开始手敲代码啦!安装python环境和编程软件比较简单,这里就不展开了,大家可以自行搜索度娘哦.......下面的代码是在PyCharm中进行的,每一
现在将几万条数据从日语翻译成中文。因为数据的获取和处理用的是python代码,所以想先尝试翻译部分也用python实现。网上查到的翻译方法有百度、有道以及谷歌翻译(个人)下面会对这三个方法进行简单的测试和分析。模块导入手动安装,命令pip
Python 是一门对初学者友好的编程语言,是一种多用途的、解释性的和面向对象的高级语言。它拥有非常小的程序集,非常易于学习、阅读和维护。其解释器可在Windows、Linux 和 Mac OS 等多种操作系统上使用。它的可移植性和可伸缩性
写在最前面其实想学习编程很久了,以前也陆陆续续学习过一段时间的编程,但总是半途而废,经过我长达三秒钟的思考,总结出以下两个方面的原因:1、没有学习的压力。因为我不是程序员,编程不是我吃饭的家伙,会不会编程并不会影响什么,但我又觉得编程是一件
苹果与安卓最大的不同在于对于媒体评测机有严格的要求,必须在官方统一安排的时间之内发出,如果提前发出那不仅仅是面临罚款的问题,甚至是以后合作的机会都没有了。这不iPhone 14系列的评测解禁就安排在了9月14日晚,现在给大家汇总下评测体验部
还有人在问,想买苹果手机推荐哪款好,越贵得越好,仔细想想,是不是这个道理,不过大家之所以纠结,主要还是受到了资金预算限制,下面根据不同的预算范围,我来推荐几款苹果手机。一、预算2500元以内iPhoneXR如果你能忍受屏幕粗大的黑边,iPh