使用python抓取js动态加载的网页 您所在的位置:网站首页 python爬虫获取js动态页面 使用python抓取js动态加载的网页

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

2023-11-03 22:57| 来源: 网络整理| 查看: 265

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

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

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

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

这个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后端的通信会被记录下来。 ;lt;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;;gt; 排除掉图片,css等。 要获取当前新闻的评论数, 浏览器发送给服务器的请求里面一定会有一个和当前新闻id有关的参数,(当然理论上也有通过referer来实现id传递的,但是毕竟太奇葩,不予考虑)。 所以 1. 如果method为GET,在Name里面一定有一个特殊的字符串,用来标识要请求的是哪个新闻的评论。 2. 或者method为POST,那么在POST的参数里面会有一个能标识当前新闻的参数: ;lt;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;;gt;这是微信公众平台获取聊天信息的action,fromfakeid就是聊天对方的id。 这是微信公众平台获取聊天信息的action,fromfakeid就是聊天对方的id。 如果要用POST方法获取某个新闻的评论数,在这里也会有一个参数用来标识出这个新闻。(比如“175827642839”)。 然后一个个排查,图片css均不考虑,那么很容易就能找到 http://comment5.news.sina.com.cn/page/info?format=js&channel=gn&newsid=1-1-27642839&group=0&compress=1&ie=gbk&oe=gbk&page=1&page_size=100&jsvar=requestId_19606520 可以精简为 http://comment5.news.sina.com.cn/page/info?format=js&channel=gn&newsid=1-1-27642839 其中的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.请求 http://comment5.news.sina.com.cn/page/info?format=js&newsid=“newsid” 3.解析获取到的js



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有