手记

selenium和phantomjs爬取动态网页

2017-03-21 15:08:0928837浏览

bobby

7实战 · 8手记 · 1推荐

1. 什么是动态网页

部分不懂前端的人可能对这个概念不是很理解,所以这里先解释一下什么是动态网页:

1. 正常情况下, 网站服务器给我们直接返回html源码。
2. html源码里面会指明我们还需要去请求的其他文件如css, js和image等
3. 这些请求在浏览器获取到html之后浏览器会主动分析这些请求然后依次去请求,
4. 然后浏览器会去执行js和css等文件, 这时候js文件实际上是可以直接操作html内容的, js可以修改我们的html源码。
5. 我们直接通过requests.get方法或者urllib获取到的html源码实际上是浏览器处理之前的原始html

我们可以通过浏览器提供的f12和查看源码方式分别看到处理后的html和处理前的html。

下面我分别以 www.projectsedu.com 和 www.taobao.com分别展示一下静态网页和动态网页的区别。

首先是www.projectsedu.com, 我们打开网址然后按f12:

这里我们看到的html源码是浏览器执行js之后生成的html。 然后我们直接查看源码

然后得到服务器直接返回的html源码:

首先我们对比上面代码中的标题部分的源码, 我们会发现:

两者html内容完全一致。

接下面我们来看一下淘宝的商品详情页面:


通过对比上面两张图大家可以淘宝的商品详情页中的原始html中居然没有价格!!!!!

而且我们通过requests或者urllib获取的是原始html!!!!也就是说html中我们得不到商品价格, 那应该怎么办。

这里有两种方法:

1. 分析js请求以及html源码去发现商品价格到底放在哪里的, 比如其实淘宝商品的价格是放在这里的:

当然更多的是通过js向服务器发起ajax请求从服务器获取到值, 这个时候我们就必须要去找到是哪个ajax并去请求该接口并解析该请求的返回。

2. 直接使用selenium等工具去模拟浏览器请求该url并获取执行之后的html内容

这里我就讲解如果通过selenium和phantomjs去操作浏览器并获取到执行之后的html内容:

通过selenium和phantomjs获取动态网页

开发环境
    windows/linux
    python3.5

1.什么是selenium:

Selenium是一个用于Web应用程序测试的工具。
Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。 
支持的浏览器包括IE,Mozilla和Firefox等。还有无界面的phantomjs浏览器

总之一句话: 我们可以通过selenium直接操作浏览器。

2.安装和配置selenium

1. pip install selenium
2. 最新的selenium版本操作firefox需要安装 geckodriver, 这点很重要!
    https://github.com/mozilla/geckodriver/releases 这里下载解压

        windows:将该路径加入到PATH环境变量中
        linux:  export PATH=$PATH:/path/to/directory/of/executable/downloaded/in/previous/step

3. 通过下面代码访问淘宝页面

from selenium import webdriver

url = "https://detail.tmall.com/item.htm?spm=a230r.1.14.10.VapbhB&id=541510809037&cm_id=140105335569ed55e27b&abbucket=5&sku_properties=5919063:6536025"
driver = webdriver.Firefox(executable_path='C:/Users/yli/Downloads/geckodriver-v0.15.0-win64/geckodriver.exe')
driver.get(url)
print (driver.page_source)

解释一下上面的代码:

     1. webdriver.Firefox()是实例化一个firefox对象, 后面操作请求的时候只需要操作该driver就行了, 如果使用chrome可以使用 webdriver.Chrome(), 
     2. executable_path 参数指名的是driver的可执行文件的路径。如果已经将该执行文件加入到环境变量可以不用指名该参数。
     3. page_source指的是当前请求的url的处理后生成的html文件。

执行上面的代码后然后你就能看到会有一个firefox浏览器弹出来然后主动请求淘宝请求

注意: 
    1. 这里需要提醒大家用完driver之后记得quit,因为启动driver是很耗cpu和内存的
    2. chrome也需要下载对应的driver,在这里 https://sites.google.com/a/chromium.org/chromedriver/downloads 
    3. 而且chrome的启动是要比firefox快一些的

当然上selenium可以做的事情远不止请求动态网页这么简单,selenium在web自动化测试中几乎是必须的库。 用selenium来完成模拟登陆非常方便,直接模拟鼠标输入和点击登录的操作用起来太简单啦,大家如果在某个网站上有小号用这个来每天帮自己登陆并操作实在太简单。

好了接下来需要介绍的是phantomjs: 有些同学可能会问, firefox,chrome已经能满足要求了,为什么还会出来个phantomjs呢?因为:

1. 启动firefox毕竟是图形化的界面, 肯定是会消耗大量内存和cpu 
2. phantomjs正是一款没有界面的浏览器但是还是同样能完成浏览器的渲染。这样如果我们的操作系统是没有界面的linux服务器上,phantomjs就大有用途了。
3. phantomjs提供的设置项多, 比如可以设置忽略images的请求减少网络请求数

既然phantomjs只是一款浏览器, selenium就当然能像操作firefox一样很简单的操作phantomjs了。

1. 安装phantomjs

    http://phantomjs.org/download.html
    去这里下载对应服务器版本的phantomjs

2. 代码完成phantomjs请求页面
from selenium import webdriver

url = "https://detail.tmall.com/item.htm?spm=a230r.1.14.10.VapbhB&id=541510809037&cm_id=140105335569ed55e27b&abbucket=5&sku_properties=5919063:6536025"
driver = webdriver.PhantomJS(executable_path='C:/Users/yli/Downloads/geckodriver-v0.15.0-win64/geckodriver.exe')
driver.get(url)
print (driver.page_source)

selenium的功能比较齐全,不只是获取动态网页, 比如数据的提取都可以完成, 但是不建议大家直接使用selenium来提取数据, 因为慢!!, 大家可以获取到html之后用lxml来解析数据,lxml是c语言写的,html解析库会快很多。

最后简单说一下selenium方式和分析网络方式的优缺点

selenium:

    优点: 简单,简单,还是简单
    缺点: 耗cpu和内存, 请求数并发小

分析网页方式:

    优点: 并发大, 可以任意开多个线程请求, 只要注意被屏蔽就行了
    缺点: 分析网页复杂, 一旦网络请求发生变化就需要重新分析。

最后再给大家安利一个开源爬取方案, splinter 地址在这里: https://github.com/cobrateam/splinter, 它会让我们通过selenium可视化爬取网站更加方便。

58人推荐
随时随地看视频
慕课网APP

热门评论

老师,好想你开一门企业级的爬虫课程,多线程多进程的分布式爬虫结合docker部署,还有监测

老师,好想你开一门企业级的爬虫课程,多线程多进程的分布式爬虫结合docker部署,还有监测

看着清晰易懂?

查看全部评论