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

原文地址: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后端的通信会被记录下来。
<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">
排除掉图片,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。 这是微信公众平台获取聊天信息的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

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫是一种用于自动化获取网页数据的程序。它可以通过发送HTTP请求,解析HTML页面,并提取所需的信息。对于静态网页,爬虫可以直接通过请求获取到页面的HTML代码,然后使用解析库(如BeautifulSoup)来提取所需的数据。但是对于动态网页,情况稍有不同。 动态网页是指在页面过程中,通过JavaScript等技术动态生成内容的网页。这些内容可能是通过Ajax请求获取的,或者是在页面完成后通过JavaScript代码生成的。因此,对于动态网页抓取,我们需要模拟浏览器行为来执行JavaScript代码,并获取最终生成的HTML内容。 在Python中,有一些库可以帮助我们实现动态网页抓取,其中比较常用的是Selenium和Pyppeteer。这两个库都可以模拟浏览器行为,并且支持执行JavaScript代码。你可以根据自己的需求选择其中一个进行使用使用Selenium进行动态网页抓取的基本步骤如下: 1. 安装Selenium库:使用pip命令安装selenium库。 2. 下浏览器驱动:根据你使用的浏览器(如Chrome、Firefox等)下对应的浏览器驱动,并将其添到系统路径中。 3. 创建WebDriver对象:使用Selenium的WebDriver类创建一个浏览器对象,如ChromeDriver。 4. 打开网页使用WebDriver对象的get方法打开目标网页。 5. 执行JavaScript代码:如果页面中有动态生成的内容,可以使用WebDriver对象的execute_script方法执行JavaScript代码。 6. 提取数据:使用Selenium提供的方法或者其他解析库(如BeautifulSoup)来提取所需的数据。 使用Pyppeteer进行动态网页抓取的基本步骤如下: 1. 安装Pyppeteer库:使用pip命令安装pyppeteer库。 2. 安装Chromium浏览器:Pyppeteer依赖于Chromium浏览器,需要先安装Chromium浏览器。 3. 创建Browser对象:使用Pyppeteer的launch方法创建一个浏览器对象。 4. 创建Page对象:使用Browser对象的newPage方法创建一个页面对象。 5. 打开网页使用Page对象的goto方法打开目标网页。 6. 执行JavaScript代码:如果页面中有动态生成的内容,可以使用Page对象的evaluate方法执行JavaScript代码。 7. 提取数据:使用Pyppeteer提供的方法或其他解析库(如BeautifulSoup)来提取所需的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值