Python网络数据采集之采集JavaScript|第09天

User:你好我是森林 Date:2018-04-11 Mark:《Python网络数据采集》 原文:https://chensenlin.cn/posts/12496/

网络采集系列文章

Python网络数据采集之创建爬虫

Python网络数据采集之HTML解析

Python网络数据采集之开始采集

Python网络数据采集之使用API

Python网络数据采集之存储数据

Python网络数据采集之读取文件

Python网络数据采集之数据清洗

Python网络数据采集之处理自然语言

Python网络数据采集之登录采集处理

采集JavaScript

客户端脚本语言是运行在浏览器而非服务器上的语言。客户端语言成功的前提是浏览器拥有正确地解释和执行这类语言的能力。

到目前为止,JavaScript 是网络上最常用也是支持者最多的客户端脚本语言。它可以收集 用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏。那些看起来非常简单的页面背后通常使用了许多 JavaScript 文件。

例如:

<script type="text/javascript" >

    alert("这是一个JavaScript的文件!")

<script>

JavaScript简介

几个关键字了解一下:弱类型语言,其他语言有的基本都有。JavaScript里所有的变量都用 var关键词字进行定义,可以把函数作为变量使用。

<script>

    var fibonacci = function() {

    var a = 1;

    var b = 1;

    return function() {

        var temp = b; b = a + b;

        a = temp; return b;

    } }



var fibInstance = fibonacci();

console.log(fibInstance()+" is in the Fibonacci sequence");

console.log(fibInstance()+" is in the Fibonacci sequence");

console.log(fibInstance()+" is in the Fibonacci sequence"); 

</script>

上面的例子看一下就好,熟悉一下就可以,就是这么简单。

常用的JavaScript库有很多。例如jQuery,Google Analytics,React等等,了解一下。

Ajax和动态HTML

与网站服务器通信的唯一方式,就是发出HTTP请求获取新页面,如果提交表单之后,或从服务器获取信息之后,网站的页面不需要重新刷新,那么你访问的网站就在用Ajax 技术。

Ajax全称是Asynchronous JavaScript and XML(异步 JavaScriptXML),网站不需要使用单独的页面请求就可以和网络服务器进行交互 (收发信息)。

Python中用Selenium执行JavaScriptSelenium是一个强大的网络数据采集工具,其最初是为网站自动化测试而开发的。近几年,它还被广泛用于获取精确的网站快照,因为它们可以直接运行在浏览器上。Selenium可以让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,它需要与第三方浏览器结合在一起使用。

我们可以用一个叫PhantomJS的工具代替真实的浏览器。PhantomJS 是一个“无头”(headless)浏览器。它会把网站加载到内存并执行页面上的 JavaScript,但是它不会向用户展示网页的图形界面。把 SeleniumPhantomJS 结合在一 起,就可以运行一个非常强大的网络爬虫了,可以处理 cookieJavaScripheader,以及任何你需要做的事情。

安装Selenium可以去其官网下载安装,也可以直接pip来安装这个库,非常简单。但是PhantomJS不是库,不能直接用pip安装,可以直接去官网下载页面下载安装,同时如果你是Mac的用户可以通过homebrew安装:

brew install phantomjs

Selenium 库是一个在 WebDriver 上调用的 APIWebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。

from selenium import webdrive

import time



driver = webdriver.PhantomJS(executable\_path='/usr/local/Cellar/phantomjs/2.1.1/bin/phantomjs') #创建了一个新的Selenium WebDriver,需要指定自己的phantomjs路径

driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html") #用WebDriver加载页面

time.sleep(3) #暂停3秒执行

print(driver.find\_element\_by\_id('content').text) #查看页面内容

driver.close()

处理重定向

客户端重定向是在服务器将页面内容发送到浏览器之前,由浏览器执行 JavaScript 完成的 页面跳转,而不是服务器完成的跳转。当使用浏览器访问页面的时候,有时很难区分这两种重定向。由于客户端重定向执行很快,加载页面时你甚至感觉不到任何延迟,所以会让你觉得这个重定向就是一个服务器端重定向。

服务端重定向可以通过urllib库来解决,但是客户端的重定向不能这样处理。Selenium 可以执行这种 JavaScript 重定向,和它处理其他 JavaScript 的方式一样;但是这类重定向的主要问题是什么时候停止页面监控,也就是说,怎么识别一个页面已经完成重定向。

我们可以用一种智能的方法来检测客户端重定向是否完成,首先从页面开始加载 时就“监视”DOM 中的一个元素,然后重复调用这个元素直到 Selenium 抛出一个StaleElementReferenceException 异常;也就是说,元素不在页面的 DOM 里了,说明这时网站已经跳转:

from selenium import webdrive

import time

from selenium.webdriver.remote.webelement import WebElement

from selenium.common.exceptions import StaleElementReferenceException



def waitForLoad(driver):

    elem = driver.find\_element\_by\_tag\_name("html")

    count = 0

    while True:

        count += 1

        if count > 20:

            print("Timing out after 10 seconds and returning")

            return

        time.sleep(.5)

        try:

            elem == driver.find\_element\_by\_tag\_name("html")

        except StaleElementReferenceException:

            return



driver = webdriver.PhantomJS(executable\_path='drivers/phantomjs/phantomjs-2.1.1-macosx/bin/phantomjs')

driver.get("http://pythonscraping.com/pages/javascript/redirectDemo1.html")

waitForLoad(driver)

print(driver.page\_source)

欢迎你免费加入我的星球,一起分享,共同成长。

知识星球

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

从源码的角度再看 React JS 中的 setState

在上一篇手记「深入理解 React JS 中的 setState」中,我们简单地理解了 React 中 setState “诡异”表现的原因。 在这一篇文章中,...

20010
来自专栏QQ空间开发团队的专栏

iOS 高性能图片架构与设计

一个优秀的图片组件应该具有这些特性:集并发控制,请求合并,下载,缓存,缓存自动淘汰,图片处理,动画的从数据源到图片显示的一站式解决方案。做到图片加载展示如丝般顺...

2.5K0
来自专栏IT大咖说

大漠穷秋:全面解读Angular 4.0核心特性

摘要 基于最新的Angular4.0版本,超级大咖大漠穷秋为我们讲解强大的集成开发平台Angular/cli,以及Angular最核心的3大概念:组件、模块、路...

3635
来自专栏DeveWork

CSS Auto Reload:解放F5 键,自动刷新浏览器的前端利器(Chrome 扩展)

在进行前端开发的时候(本文具体而言是编辑CSS 文件时候),常常要做的是刷新浏览器查看修改后的样式。那么最常用到的就是F5 键了,以前在开发WordPress ...

2768
来自专栏DeveWork

响应式 HTML 邮件制作之三个实例

制作HTML 邮件并不是想象中的那么简单,不仅仅要考虑到兼容各大的邮箱的问题,加之安全因素(比如图片可能是默认不打开的,javascript 没有戏了),现在又...

2689
来自专栏张戈的专栏

WordPress集成PHP缩略图,并开启Nginx缓存的方法

之前张戈博客分享过一篇给 WordPress 开启 Nginx 缩略图的教程,用着确实不错!但是总感觉清晰度不敢恭维,就算将裁剪质量调到 90 依然失真严重,于...

3417
来自专栏小程序之家

如何入门小程序开发

在上一篇教程中,我们教大家使用微信官方Demo快速搭建了一个小相册,并学会了如何安装开发者工具,如何创建小程序,如何做服务端配置。并利用腾讯云COS实现相册上传...

8.9K8
来自专栏阿炬.NET

jQuery EasyUI 1.3.2 离线API、Demo

2775
来自专栏蔡述雄的专栏

包学会之浅入浅出Vue.js:开学篇

Vue 是国人写的,技术文档也妥妥的是中文,想到这我就有学习的动力。

46.5K61
来自专栏知晓程序

开发 | 无需后端编码,手把手教你把 WordPress 做成小程序

知晓程序(微信号 zxcx0101)今天分享的这篇文章,将一步步讲解,如何将一个 WordPress 网站借助 REST API 开发微信小程序版。

1373

扫码关注云+社区