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

来源:本网整理

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

s">

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

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

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

为自动提取网页的程序,它为搜索引擎从万维网上下载网页。 网络爬虫为一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断

请大家移步 FB:

Python代码里的中文 代码第一行(如果有脚本标记则是第二行)可以按照PEP8形式指定本代码文件的编码类型。若不指定则按照ascii(py2.x)或utf-8(py3) 你需要了解的内容 清楚知道包含中文的文件是用的什么编码 清楚知道自己输出端(命令行?htm

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

打开浏览器,以google chrome为例,输入你上面的网址。然后按F12打开调试窗口,然后尝试勾选左边某一个选项,马上可以看到右边的调试窗口有东西输出。找到第一个输出的行,点击header,可以看到每一个都是用的post方法。所以只需要构造相应的hea

0x01 前言

把每次抓取的结果存储起来,然后与上一次的结果比较不就可以了。

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

对于这个问题,我想最直接的回答就是不错,虽有有一些小问题,但总体来看博瑞在市场上的反应和认可度还是挺高的。作为自主品牌中最畅销的B级车,博瑞无论在外观、内饰、配置、动力上都有不错的表现。而且经过两年时间的考验,如今已经推出了中期改款车型。前几天我也去上海试驾了这款最新产品,新博瑞真是进行了一次全面的改变,让其在竞争力更强。我想楼主既然问到博瑞的市场反映,相必对博瑞也有考虑,想去入手这款车型。所有今天在这我们就来说说这款新博瑞,看看经过改款之后,都有哪些改变。说到博瑞的改变,我想最直接的真是在驾驶质感上的提升。从数据上来看,吉利搭载了自行研发的G-Power第二代1.8T发动机,最大功率184马

0x02 Selenium + PhantomJS

让他重新认识你。买玩具给它,陪他玩,逗猫棒之类的。和他捉迷藏就像逗小婴儿一样。在他睡觉的时候抚摸他,让他知道你在抚摸他。给它耳朵后下方连接脖子的那一块地方挠痒以及下巴连接颈部的地方挠痒,那里都是他最舒服的地方比较容易对人放下心房。奖励多于惩罚,买点零食罐头猫饼干小鱼干之类的,抚摸他的时候喂一点,有事没事喂一点,陪他玩的时候喂一点。惩罚的时候不要打,没用,他只会觉得你是个坏人,不会觉得是自己错了。犯错的时候用小喷壶对他脸喷水,大声说不可以这样这样是不对的,口头上凶他,可以拍桌子或跺脚,久了之后他要是再犯,你一拍桌子他就会条件反射了,喷水真的挺好用的。多和他交流,没事就和他说话,虽然他可能听不懂,

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

一、什么样的水适合养鱼?1.水质清澈,不瘦不肥。水质清澈,悬浮颗粒较少。水不能太瘦(像纯净水就太瘦),也不能过肥(出现油膜、泡沫、藻类爆发等现象)。2.气味正常。无味,或带一点淡淡的鱼腥味。如果出现腥臭味,则肯定水质出现问题。3.水色正常。水色是由浮游生物(藻类)的种类和数量决定的。好的水色应该是呈现淡淡的茶褐色、黄绿色、油绿色,坏水则出现灰白色、灰黄色、黑褐色。如果鱼缸的水像纯净水那样无色透明的话,说明水太瘦,水里的含菌量太少,不是我们希望的好水。养鱼很重要的一个基本功就是养水,养水就是在养菌,不但要养硝化菌,还要养其他有利于维持水质的各种微生物。二、好水的鉴定指标与应对策略1、氨和亚硝酸盐

Selenium + PhantomJS(Firefox Chrome之类的)

沃尔沃重卡是真的安全,评论里面都在吹捧沃尔沃轿车,那么好还会被卖掉嘛?开沃尔沃S801年,车厚重隔音什么的和这个价位级别的车没有什么特别之处,高速被追尾一个样子的,那么安全的刹车系统不是还是把自己人给撞了,目前有的国产BYD都可以做到,别收购个外国的LoGO就感觉国家强大了,中国手机电脑系统不行,收购IOS、安卓、微软这样的企业才是强企,要不学王健林现在全球影院基本上70%都在人家的名下啦。沃尔沃轿车很客观的评价:性能大多是在一个时期找的差异化,沃尔沃的主业是重卡,沃尔沃轿车的价格定位级别定位,?一点奥迪宝马奔驰,减一点帕萨特、雅阁君越皇冠

但是真正的有实践过的人,是不会把这个东西投入生产环境的,首先最大的问题就是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爬虫在处理由Javascript动态生成的页面时有哪些解决方案

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

1. Chrome + F12开发者选项

2. Firefox + Firebug

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

1. Selenium + PhantomJs

2. PyQt /QtWebkit

3. CasperJS

4. PyExecJS

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

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

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动态生成的页面时有哪些解决方案

我们一直使用思路二中的方法1,也就是说用一个浏览器内容来运行JavaScript和解析动态内容,而用python模拟人在浏览器上做动作。

个实现方案最自然,虽然有人一直在批评这样的速度比较慢,但是在实际运行环境中,大部分情况下你会担心运行得太快了,我们采集这些网站的目的往往是为了

BI项目或者数据分析,会集中且持续地从同一个目标网站上抓取数据,会给这个网站造成很大压力,从而会被封锁或者遇到验证码,所以,速度问题并不是关键问

题。

用一个浏览器内容去模拟人的动作,省去用Firebug甚至底层抓包工具去一点点分析每个ajax消息。要知道,现在越来越多的网站使用ajax技术,持续不断的发送xmlhttprequest请求,要是挨个抓包分析,工作量太大了。

  • 本文相关:
  • 黑客通过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