Python 爬虫修养-处理动态网页

来源:本网整理

最关键是先要区分:静态网页 还是 动态网页 如果是静态html,get到的内容就是全部内容了,而且下一页会对应另外一个网址,接下来get它就行了。 绝大多数网页会有一些动态特性,比如,下一页网址不是一个独立的网址,简单点的可能是用onclick实现

s">

Python 爬虫修养-处理动态网页

作者:佚名 字体:[增加 减小] 来源:互联网 时间:09-12 11:51:13 我要评论 在爬虫开发中,大家可以很轻易地 bypass 所谓的 UA 限制,甚至用 scrapy 框架轻易实现按照深度进行爬行。但是实际上,这些并不够。关于爬虫的基础知识比如数据处理与数据存储多线程之类的 ">

在爬虫开发中,大家可以很轻易地 bypass 所谓的 UA 限制,甚至用 scrapy 框架轻易实现按照深度进行爬行。但是实际上,这些并不够。关于爬虫的基础知识比如数据处理与数据存储多线程之类的。

我们一直使用思路二中的方法1,也就是说用一个浏览器内容来运行JavaScript和解析动态内容,而用python模拟人在浏览器上做动作。 这个实现方案最自然,虽然有人一直在批评这样的速度比较慢,但是在实际运行环境中,大部分情况下你会担心运行得太

请大家移步 FB:

我们一直使用思路二中的方法1,也就是说用一个浏览器内容来运行JavaScript和解析动态内容,而用python模拟人在浏览器上做动作。 这 个实现方案最自然,虽然有人一直在批评这样的速度比较慢,但是在实际运行环境中,大部分情况下你会担心运行得太

该系列文章都是本人所写,能力有限请多包涵。

Python爬虫在处理由Javascript动态生成的页面时有哪些解决方案 搜索资料 我来答 分享 微信扫一扫 网络繁忙请稍后重试 新浪微博 QQ空间 举报 浏览13 次 本地

0x01 前言

总结下面答案提供的方案: 思路一:分析Javascript代码找到请求数据 1. Chrome + F12开发者选项 2. Firefox + Firebug 思路二:利用浏览器内核或JS引擎执行Javascript代码 1. Selenium + PhantomJs 2. PyQt /QtWebkit 3. CasperJS 4. PyExecJS

在进行爬虫开发的过程中,我们会遇到很多的棘手的问题,当然对于普通的问题比如 UA 等修改的问题,我们并不在讨论范围,既然要将修养,自然不能说这些完全没有意思的小问题。

如果30天后爆发全球生化危机,首先你要去把房子抵押进行借款,这时候没时间卖的,然后马上向支付宝、京东金融等等产品进行借款,能拿到多少是多少,根据情况大约你可以有300万左右。然后把父母叫上一家人组齐队伍,去申请俄罗斯的旅行,因为团体免签,你们可以准备剩下13天左右去西伯利亚进行15日游。因为出国你们带不了太多的东西所以不要准备什么,带上钱就够了,换成卢布,剩下的放到卡里面。到达俄罗斯之后可以选择去贝加尔湖附近的小镇,找个人少的小镇落脚,然后开始租车,购物,买一些消防斧和食物、燃料等,然后据静待生化危机的到来!(记得把导游留下来,他会俄语!)做到上面的这些将会让你生存几率大增。西伯利亚地广人稀,

0x02 Selenium + PhantomJS

2017年国乒在深圳举办了直通杜塞尔多夫世乒赛“地表最强12人”的选拔赛,在选拔赛中除了主力们的精彩发挥,一个不起眼的湖北女将因为一记神球而大火,这位留着一头短发的“假小子”就是冯亚兰。直通赛上,冯亚兰打出了一记换手击球令全场沸腾,尽管最终输给了丁宁,但是冯亚兰依然显得风轻云淡。其实冯亚兰和丁宁出道时间相近,是同一批的球员。1990年出生的冯亚兰今年27岁,是湖北籍乒乓球运动员,曾获得2004年亚青赛女单冠军、2006年世青赛女单冠军和2010年德国公开赛女单冠军。冯亚兰的打法十分凶狠,是女子技术男性化的典型代表,正手拥有着可以媲美男子选手的攻击力,前奥运会冠军乔红甚至称冯亚兰的正手进攻堪称女

这个东西算是老生长谈的问题吧,基本我在问身边的朋友们的时候,他们都能讲出这条解决方案:

提起奥运冠军王皓,最让人印象深刻的就是他的外号----“千年老二”。2002年,王皓一举夺得埃及公开赛男单冠军,排名也跻身世界10强,一举成名。然而,2004年王皓首次参加雅典奥运会,年仅21岁的王皓在决赛中输给柳承敏,这对于一路高奏凯歌的他来说,无疑是一次重大打击;北京奥运会成了王皓乒坛生涯的巨大障碍,此后,他患上了“决赛恐惧症”。每次比赛,他都能凭借自己的实力打入决赛,可是一到决赛的时候,他又变得魂不守舍、神情恍惚。2005年全国十运会决赛他输给王励勤;2005年、2006年,王皓两次打入世乒赛决赛,2005年他在大比分3:2,第6局8:4领先的大好形势下被德国选手波尔翻盘;2006年又被

Selenium + PhantomJS(Firefox Chrome之类的)

我个人觉得你男朋友是这样的一个心理:他把恋爱与婚姻结合起来了,就像以前的年代,牵了手就一辈子在一起,意味着他很重视爱情,同时也着眼于未来,可爱情可以不需要物质,但婚姻需要,因此他觉得没资格这样的。毕竟现在的社会比以前的社会物质得多,当时是指基层社会。。。其实他的人生想法或许就是,先成就事业,再成家吧,这种想法挺好的,,,总的来说吧,男方很重视爱情,同时也是个重情重义的人,在当今物欲横流的社会之下,是少有的一份子

但是真正的有实践过的人,是不会把这个东西投入生产环境的,首先最大的问题就是Selenium + PhantomJS 非常的慢,这种慢的原因就是因为他要加载这个网页所有的内容,比如图片资源,link 中的 CSS,JS 都会加载,而且还会渲染整个网页,在渲染结束之后才会允许你操作网页的元素。当然可能会有读者问,Selenium 作为可以自动化编写测试脚本的一个模块,他是自带 HOOK 功能的,在 Selenium 的 API 中也有介绍说 Selenium 可以控制等待某一个元素加载成功时返回页面数据。

没错的确是这样的,我们确实可以使用 Selenium 的内置 api 去操作浏览器完成各种各样的操作,比如模拟点击,模拟填表,甚至执行 js,但是最大的问题我们还是没有解决:归根结底是操作浏览器来进行工作的,启动需要打开浏览器(等待一定时间),访问网页之后渲染,下载相应资源,执行 JS,这么多的步骤,每一个步骤都需要或多或少的等待时间,这就好比,我们就是在使用浏览器做这样的事情,只不过是加上了精准的鼠标定位而已。

 

当然说了这么多,Selenium 虽然不适合做生产解决方案,也并不是没有别的解决办法了。

0x03 execjs

execjs 是一个在 Python 中执行 js 的模块,听到这个,大家可能会觉得耳目一新:欸?那我是不是可以爬虫爬下来 js 代码然后手动控制 js 执行,然后就可以控制自己想要的元素,拿到想要的结果,而且也并不丢失效率。

但是我要说这样的想法,实际上是非常的 naive,虽然有了这个 js 引擎,但是,我们需要很多很多的轮子,为什么呢?来听我一步一步解释:

1. js 的强大之处其实并不在于松散的语法与容错,而是在于对 BOM 对象和 DOM 对象的操作。举个例子来说,比如,一个网页的表单,是通过操作执行 js 来提交的。 那么,问题就在于你有办法仅仅用这个 execjs 来执行这段 js 来提交表单么? 显然,这是行不通的。为什么呢?因为对于我们来说的话 execjs 是一个独立的模块,我们没有办法把我们静态扒下来的html 文档和 execjs 建立联系。

2. 如果非要建立联系,那么你需要自己完成 js  html  DOM 对象的绑定,具体怎么完成呢?js 在浏览器中怎么与 DOM 树绑定,你就需要怎么去做。但是要怎么做啊,首先你需要一个自己构建 DOM 树,然后才能进行手动绑定。这个轮子,确实是非常的大。

但是如果你真的有大把的时间,那么应该怎么去做这个事情呢?没错要不你去 HOOK 一个webkit 要不你去自己构建一个 html 的解析器。那么我就在这里稍微提一下这个很有趣的事情:如果构建一个 HTML 解析器:

最近有用 PLY 写过一个 Lexer 当时准备做个解析 DOM 树的 HTML 解析器,自己实践第一步也是觉得这个东西理论上是完全可行的,但是能不能完成就要看个人毅力和你个人的编程能力了。

0x04 Ghost

关于 Ghost 的话,其实我个人是比较推崇的,但是其实他也并不是特别完美,它对我来说,更像是一个 Selenium 与PhantomJS 的结合体,怎么说呢,实际上 ghost 这个模块用的是QT 中的 webkit,在安装的时候就得被迫安装 pyside 或者 pyqt4,实际上我当时还是很难理解为什么一个这个东西没有图形界面要使用 qt 和 pyside 这种东西作为引擎呢?单独构造一个浏览器引擎真的就这么困难么?其实装好了也没什么关系,毕竟我觉得还是要比Selenium 配 PhantomJS 好用的。

话说回来,我们就来讨论一下这个 Ghost 的一些问题。

首先,使用 Ghost 的一个好处是我们并不需要再将一个 binary 的浏览器放在路径下了,以至于我们不需要去花费时间打开浏览器了,因为 ghost 就是一个功能完全的 Python 实现(借助 qt 的 webkit)的轻量级没有图形化的浏览器。

而且,ghost 在初始化的时候,有一个选项可以不下载图片,但是没有办法阻止它下载 js 和css, 其实这个也是可以原谅的,毕竟自己在使用的时候,也是需要自己去下载 js 在本地筛选。

于此同时 ghost 还是提供了相应的 API 这些 API 和 selenium 的 API 功能基本差别不是特别大,也会有处理表单,执行 ajax 去加载动态页面,这样来说 ghost 是一个完美的解决方案么?

其实还是有他自己的缺点的,就是我们还是不能完全控制每一个过程,比如我们如果只想让它解析 DOM 树,不动态执行 js 脚本,而且,我想获取他的 DOM 树手动进行一些操作。这些都是没有办法的。但是也并不是完全没有办法,比如国内某厂他们就做了 HOOK 了一个浏览器去检测 XSS 这个思路我们可以在以后的文章中提出,具体的操作的话,这就要看大家的编程功底了。

 

0x05 原理总结

当然,懂得归纳的读者其实早就已经看出来了,对动态网页(通过 js 加载)的网页的信息采集,主要分成三种方案:

1. 基于实体浏览器操作解决方案(适用于测试环境不适用于大量信息采集)。

2. 基于深度控制 JS 脚本执行的解决方案(速度最快,编写难度最大)。

3. 基于 webkit 的解决方案。(相对较为折衷)

本文转自:i春秋社区

原文地址:http://bbs.ichunqiu.com/thread-11098-1-1.html?from=jbzj

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

python写爬虫怎么处理动态加载的网页,就是边拉动滚动条边加载的那种

这个用phantomjs或者selenium都可以,这两个工具能模拟浏览器操作,就像你在操作浏览器一样,具体资料,百度之。

Python爬虫在处理由Javascript动态生成的页面时有哪些解决方案

思路一:分析Javascript代码找到请求数据

1. Chrome + F12开发者选项

2. Firefox + Firebug

思路二:利用浏览器内核或JS引擎执行Javascript代码

1. Selenium + PhantomJs

2. PyQt /QtWebkit

3. CasperJS

4. PyExecJS

python爬虫怎么获取动态的网页源码

一个月前实习导师布置任务说通过网络爬虫获取深圳市气象局发布的降雨数据,网页如下:

心想,爬虫不太难的,当年跟zjb爬煎蛋网无(mei)聊(zi)图的时候,多么清高。由于接受任务后的一个月考试加作业一大堆,导师也不催,自己也不急。

但是,导师等我一个月都得让我来写意味着这东西得有多难吧。。。今天打开一看的确是这样。网站是基于Ajax写的,数据动态获取,所以无法通过下载源代码然后解析获得。

从某不良少年写的抓取淘宝mm的例子中收到启发,对于这样的情况,一般可以同构自己搭建浏览器实现。phantomJs,CasperJS都是不错的选择。

导师的要求是获取过去一年内深圳每个区每个站点每小时的降雨量,执行该操作需要通过如上图中的历史查询实现,即通过一个时间来查询,而这个时间存放在一个hidden类型的input标签里,当然可以通过js语句将其改为text类型,然后执行send_keys之类的操作。然而,我失败了。时间可以修改设置,可是结果如下图。

为此,仅抓取实时数据。选取python的selenium,模拟搭建浏览器,模拟人为的点击等操作实现数据生成和获取。selenium的一大优点就是能获取网页渲染后的源代码,即执行操作后的源代码。普通的通过 url解析网页的方式只能获取给定的数据,不能实现与用户之间的交互。selenium通过获取渲染后的网页源码,并通过丰富的查找工具,个人认为最好用的就是find_element_by_xpath("xxx"),通过该方式查找到元素后可执行点击、输入等事件,进而向服务器发出请求,获取所需的数据。

[python] view plain copy

  • # coding=utf-8  

  • from testString import *  

  • from selenium import webdriver  

  • import string  

  • import os  

  • from selenium.webdriver.common.keys import Keys  

  • import time  

  • import sys  

  • default_encoding = 'utf-8'  

  • if sys.getdefaultencoding() != default_encoding:  

  • reload(sys)  

  • sys.setdefaultencoding(default_encoding)  

  • district_navs = ['nav2','nav1','nav3','nav4','nav5','nav6','nav7','nav8','nav9','nav10']  

  • district_names = ['福田区','罗湖区','南山区','盐田区','宝安区','龙岗区','光明新区','坪山新区','龙华新区','大鹏新区']  

  • flag = 1  

  • while (flag > 0):  

  • driver = webdriver.Chrome()  

  • driver.get("hianCe/")  

  • # 选择降雨量  

  • driver.find_element_by_xpath("//span[@id='fenqu_H24R']").click()  

  • filename = time.strftime("%Y%m%d%H%M", time.localtime(time.time())) + '.txt'  

  • #创建文件  

  • output_file = open(filename, 'w')  

  • # 选择行政区  

  • for i in range(len(district_navs)):  

  • driver.find_element_by_xpath("//div[@id='" + district_navs[i] + "']").click()  

  • # print driver.page_source  

  • timeElem = driver.find_element_by_id("time_shikuang")  

  • #输出时间和站点名  

  • output_file.write(timeElem.text + ',')  

  • output_file.write(district_names[i] + ',')  

  • elems = driver.find_elements_by_xpath("//span[@onmouseover='javscript:changeTextOver(this)']")  

  • #输出每个站点的数据,格式为:站点名,一小时降雨量,当日累积降雨量  

  • for elem in elems:  

  • output_file.write(AMonitorRecord(elem.get_attribute("title")) + ',')  

  • output_file.write('\n')  

  • output_file.close()  

  • driver.close()  

  • time.sleep(3600)  

  • 文件中引用的文件testString只是修改输出格式,提取有效数据。
  • [python] view plain copy

  • #Encoding=utf-8  

  • def OnlyCharNum(s, oth=''):  

  • s2 = s.lower()  

  • fomart = 'abcdefghijklmnopqrstuvwxyz0123456789,.'  

  • for c in s2:  

  • if not c in fomart:  

  • s = s.replace(c, '')  

  • return s  

  • def AMonitorRecord(str):  

  • str = str.split(":")  

  • return str[0] + "," + OnlyCharNum(str[1])  

  • 一小时抓取一次数据,结果如下:

Python爬虫在处理由Javascript动态生成的页面时有哪些解决方案

思路一:分析Javascript代码找到请求数据

1. Chrome + F12开发者选项

2. Firefox + Firebug

思路二:利用浏览器内核或JS引擎执行Javascript代码

1. Selenium + PhantomJs

2. PyQt /QtWebkit

3. CasperJS

4. PyExecJS

Python爬虫在处理由Javascript动态生成的页面时有哪些解决方案

动态页面的话,要看是什么人写的

一般简单的是直接去找js

例如:

火狐浏览器安装了firebug后

F12-->网络-->将其打开的网页一个一个去找

能找到你需要的js

其次还有一个就是伪装post

伪装post直接获取你要的东西

但是这个也是局限于写js的这个人很厉害

后端也足够的厉害

  • 本文相关:
  • 黑客通过Paypal可传输恶意图像
  • Swagger JSON高危漏洞被发现 Java/PHP/NodeJS/Ruby或中招
  • Nessus扫描漏洞使用教程
  • PHP邮件注入实战演练
  • 解析OpenSSL程序概念及震惊业界的“心脏出血”漏洞
  • Kindeditor遍历目录0DAY问题
  • Kindeditor特定情况可能会导致全盘浏览的漏洞
  • 历史悠久的3个经典网站安全漏洞介绍
  • 剖析PHP纯符号一句话webshell的代码
  • openssl曝光重大安全漏洞 openssl漏洞详情
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved