python爬虫第7天 穿越网页表单与登录窗口进行采集 采集JavaScript

Python Requests库

1   单选按钮、复选框和其他输入


2  提交文件和图像


3   处理登录和cookie


4  Requests 库的 session 函数

会话(session)对象(调用 requests.Session() 获取)会持续跟踪会话信 息,像 cookie、header,甚至包括运行 HTTP 协议的信息,比如 HTTPAdapter(为 HTTP 和 HTTPS 的链接会话提供统一接口)


5 HTTP基本接入认证 

Requests 库有一个 auth 模块专门用来处理 HTTP 认证:


6 其他表单问题

验证码      蜜罐  隐含字段    


采集JavaScript

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

JavaScript 里所有的变量都用 var 关键词字进行定义。

JavaScript 还有一个非常好的特性,就是把函数作为变量使用:


用 Python 执行 JavaScript 代码的效率非常低,既费时又费力

1. jQuery         ,70% 最流行的网站(约 200 万)和约 30% 的其他网站(

如果你在一个网站上看到了 jQuery,那么采集这个网站数据的时候要格外小心。jQuery 可 以动态地创建 HTML 内容,只有在 JavaScript 代码执行之后才会显示。如果你用传统的方 法采集页面内容,就只能获得 JavaScript 代码执行之前页面上的内容


2. Google Analytics    一半的网站使用这个

如果一个网站使用了 Google Analytics 或其他类似的网络分析系统,而你不想让网站知道 你在采集数据,就要确保把那些分析工具的 cookie 或者所有 cookie 都关掉。


3 Google地图


Ajax和动态HTML

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


ajax全称为异步 JavaScript 和 XML,,网站不需要使用单独的页面请求就可以和网络服务器进行交互 

和 Ajax 一样,动态 HTML(dynamic HTML,DHTML)也是一系列用于解决网络问题的 技术集合。DHTML 是用客户端语言改变页面的 HTML 元素(HTML、CSS,或者二者皆 被改变)。比如,页面上的按钮只有当用户移动鼠标之后才出现,背景色可能每次点击都 会改变,或者用一个 Ajax 请求触发页面加载一段新内容。

关键要看有没有用 JavaScript 控制 HTML 和 CSS 元素

那些使用了 Ajax 或 DHTML 技术改变 / 加载内容的页面,可能有一些采集手段,但是用 Python 解决这个问题只有两种途径:直接从 JavaScript 代码里采集内容,或者用 Python 的 第三方库运行 JavaScript,直接采集你在浏览器里看到的页面。


在Python中用Selenium执行JavaScript 

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

用一个叫 PhantomJS(http://phantomjs.org/download.html)的工具代替真实的浏览器


安装:

可以从 PyPI 网站(https://pypi.python.org/simple/selenium/)下载 Selenium 库,也可以用 第三方管理器(像 pip)用命令行安装。

PhantomJS 也 可 以 从 它 的 官 方 网 站(http://phantomjs.org/download.html) 下 载。 因 为 PhantomJS 是一个功能完善(虽然无头)的浏览器,并非一个 Python 库,所以它不需要像 Python 的其他库一样安装,也不能用 pip 安装。

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


以后好像selenium只能使用chrome或者firef

可以让selenium不断的检查页面是不是已经完全加载

如果你可以不用定位器,就不要用,毕竟这样可以少导入一个模块。但是,定位器是一种 十分方便的工具,可以用在不同的应用中,并且具有很好的灵活性


下面是定位器通过By对象进行选择的策略

• ID 在上面的例子里用过;通过 HTML 的 id 属性查找元素。
• CLASS_NAME 通过 HTML 的 class 属性来查找元素。为什么这个函数是 CLASS_NAME,而不是简单的 CLASS ?在 Selenium 的 Java 库里使用 object.CLASS 可能会出现问题,.class 是 Java 保 留的一个方法。为了让 Selenium 语法可以兼容不同的语言,就用 CLASS_NAME 代替。
• CSS_SELECTOR 通过 CSS 的 class、id、tag 属性名来查找元素,用 #idName、.className、tagName 表示。
• LINK_TEXT 通过链接文字查找 HTML 的 <a> 标签。例如,如果一个链接的文字是“Next”,就可以 用 (By.LINK_TEXT, "Next") 来选择。
• PARTIAL_LINK_TEXT 与 LINK_TEXT 类似,只是通过部分链接文字来查找。
• NAME 通过 HTML 标签的 name 属性查找。这在处理 HTML 表单时非常方便。
• TAG_NAME 通过 HTML 标签的名称查找。

• XPATH 用 XPath 表达式(语法在下面介绍)选择匹配的元素。


xpath

XPath(XML Path,XML 路径)是在 XML 文档中导航和选择元素的查询语言。它由 W3C 于 1999 年创建,在 Python、Java 和 C# 这些语言中有时会用 XPath 来处理 XML 文档。

虽然 BeautifulSoup 不支持 XPath,但是本书中的很多库(lxml、Selenium、Scrapy 等) 都支持。

XPath 语法中有四个重要概念

• 根节点和非根节点

♦ /div 选择 div 节点,只有当它是文档的根节点时

 ♦ //div 选择文档中所有的 div 节点(包括非根节点)

• 通过属性选择节点 

♦ //@href 选择带 href 属性的所有节点 

♦ //a[@href='http://google.com'] 选择页面中所有指向 Google 网站的链接 • 通过位置选择节点 

♦ //a[3] 选择文档中的第三个链接 

♦ //table[last()] 选择文档中的最后一个表 

♦ //a[position() < 3] 选择文档中的前三个链接 

• 星号(*)匹配任意字符或节点,可以在不同条件下使用 

♦ //table/tr/* 选择所有表格行 tr 标签的所有的子节点(这很适合选择 th 和 td 标 签) 

♦ //div[@*] 选择带任意属性的所有 div 标签

如果这里介绍的几个 XPath 功能解决不了你的 HTML 或 XML 元素选择问题,请参考 微软的 XPath 语法页面(https://msdn.microsoft.com/en-us/enus/library/ms256471)。


处理重定向

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

但是,在进行网络数据采集的时候,这两种重定向的差异是非常明显的。根据具体情况, 服务器端重定向一般都可以轻松地通过 Python 的 urllib 库解决,不需要使用 Selenium (更多的介绍请参考第 3 章)。客户端重定向却不能这样处理,除非你有工具可以执行 JavaScript。

Selenium 可以执行这种 JavaScript 重定向,和它处理其他 JavaScript 的方式一样;但是这类 重定向的主要问题是什么时候停止页面监控,也就是说,怎么识别一个页面已经完成重定 向。在 http://pythonscraping.com/pages/javascript/redirectDemo2.html 的示例页面是客户端重 定向的例子,有两秒的延迟。

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


















  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值