使用python抓取js动态加载的网页

原文地址:http://blog.csdn.net/lambert310/article/details/49248109

我们在做网页抓取的时候,一般来说使用urllib和urllib2就能满足大部分需求。

但是有时候我们遇见那种使用js动态加载的网页。就会发现urllib只能抓出一个部分内容空白的网页。就像下面百度图片的结果页:


使用python抓取js动态加载的网页_第1张图片



审查元素之后,。发现百度图片中,显示图片的div为:pullimages

使用python抓取js动态加载的网页_第2张图片


这个div里面的内容是动态加载的。而使用urllib&urllib2是抓取不到的。

要抓取动态加载的元素,首先考虑使用selenium来调用浏览器进行抓取。

而我们运行的环境是linux,最理想的方法是在无界面情况下进行抓取。

所以使用selenium+phantomjs来进行无界面抓取

phantomjs是什么呢?它是一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器


selenium和phantomjs的安装配置可以google,这里就略过不谈了

代码如下:

from selenium import webdriver
driver = webdriver.PhantomJS(executable_path='/bin/phantomjs/bin/phantomjs')#如果不方便配置环境变量。就使用phantomjs的绝对路径也可以

driver.get('http://image.baidu.com/i?ie=utf-8&word=%E5%91%A8%E6%9D%B0%E4%BC%A6')#抓取了百度图片,query:周杰伦

driver.page_source #这就是返回的页面内容了,与urllib2.urlopen().read()的效果是类似的,但比urllib2强在能抓取到动态渲染后的内容。

driver.quit()


到这里。就抓取动态页面成功了。


js动态加载,可以用Python模拟请求。

原文地址:https://www.zhihu.com/question/21332889

像这种情况一般是异步请求json或者jsonp,直接监控network就行了:
以chrome浏览器为例。
1.右键页面-审查元素-Network,切换到network面板,刷新页面。
然后浏览器和web后端的通信会被记录下来。
<img src="https://pic2.zhimg.com/fafe221837c03f3229b0ed2dad3977e9_b.jpg" data-rawwidth="1219" data-rawheight="225" class="origin_image zh-lightbox-thumb" width="1219" data-original="https://pic2.zhimg.com/fafe221837c03f3229b0ed2dad3977e9_r.jpg"> 使用python抓取js动态加载的网页_第3张图片
排除掉图片,css等。
要获取当前新闻的评论数, 浏览器发送给服务器的请求里面一定会有一个和当前新闻id有关的参数,(当然理论上也有通过referer来实现id传递的,但是毕竟太奇葩,不予考虑)。
所以
1. 如果method为GET,在Name里面一定有一个特殊的字符串,用来标识要请求的是哪个新闻的评论。
2. 或者method为POST,那么在POST的参数里面会有一个能标识当前新闻的参数:
<img src="https://pic3.zhimg.com/8f67b309d3846bd46c5ad35bec492b3e_b.jpg" data-rawwidth="913" data-rawheight="402" class="origin_image zh-lightbox-thumb" width="913" data-original="https://pic3.zhimg.com/8f67b309d3846bd46c5ad35bec492b3e_r.jpg">这是微信公众平台获取聊天信息的action,fromfakeid就是聊天对方的id。 使用python抓取js动态加载的网页_第4张图片这是微信公众平台获取聊天信息的action,fromfakeid就是聊天对方的id。
如果要用POST方法获取某个新闻的评论数,在这里也会有一个参数用来标识出这个新闻。(比如“175827642839”)。

然后一个个排查,图片css均不考虑,那么很容易就能找到
comment5.news.sina.com.cn
可以精简为 comment5.news.sina.com.cn
其中的newsid参数1-1-27642839和175827642839关系很明显了。
这是一个js,里面有一句:"count": {"qreply": 706, "total": 823, "show": 95},你要找的就在这里。
可以直接从字符串里面截取到total,或者去掉js头部的“var data =”。得到一个json字符串,解析成对象也能获取total 。
在新闻页面的源码里面找“1-1-27642839” 可以找到“newsid:'1-1-27642839',”

分析过程基本结束。
然后,你可以:
1.分析新闻页代码,得到newsid
2.请求 comment5.news.sina.com.cn “newsid”
3.解析获取到的js

你可能感兴趣的:(python,其他)