Selenium模拟浏览器初识

Seleniumd介绍

在写Python爬虫的时候,最麻烦的不是那些海量的静态网站,而是那些通过JavaScript获取数据的站点。Python本身对js的支持不好,所以就有良心的开发者来做贡献了,这就是Selenium,他本身可以模拟真实的浏览器,浏览器所具有的功能他都有哦,加载js更是小菜了。

Selenium的安装:

使用pip命令,你可以像下面这样安装 selenium:

pip install selenium

大家可以参考一下中文文档

浏览器的选择:

在写爬虫的时候,用到最多的就是Selenium的Webdriver,当然,webdriver也不可能支持所有的浏览器,让我们看看他支持哪些浏览器吧:

 1 from selenium import webdriver
 2 help(webdriver)
 3  
 4 PACKAGE CONTENTS
 5     android (package)
 6     blackberry (package)
 7     chrome (package)
 8     common (package)
 9     edge (package)
10     firefox (package)
11     ie (package)
12     opera (package)
13     phantomjs (package)
14     remote (package)
15     safari (package)
16     support (package)
17     

可以看出支持的浏览器还是比较丰富的,移动端到电脑端应由具有。

然而,个人觉得在写爬虫的时候,更推荐使用PhantomJS:

PhantomJS介绍:

     (1)一个基于webkit内核的无头浏览器,即没有UI界面,即它就是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。

     (2)提供JavaScript API接口,即通过编写Js程序可以直接与webkit内核交互,在此之上可以结合Java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。

     (3)提供windows、Linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。

PhantomJS全面支持各种原生的Web标准:DOM处理、CSS选择器、JSON、Canvas和SVG。最重要的是他是一个没有GUI的程序,也就意味着他可以省去大量的加载图形界面的时间。有人曾经测试过,使用Selenium模块调用上述浏览器,PhantomJS的速度是第一名哦~~~~~第二和第三是chrome和ie。

PhantomJS的安装:

这里有一点要说明,PhantomJS并不是一个Python模块,他是一个独立的,第三方软件,这也就意味着我们不能简单的使用pip工具安装啦。

Mac下安装PhantomJS:

这里我们只要使用brew工具就能安装上PhantomJs了

brew install phantomjs

linux下安装PhantomJS:

linux下有很多第三方发型版本:比较常用的一般是 Ubuntu、centos等等。这些发行版也都有自己强大的软件管理仓库:apt、yum等等

那么安装起来也就超方便了:

# ubuntu
apt-get install phantomjs

# centos
yum install phantomjs

win下安装PhantomJS:

虽然win下没有上述的方便的安装方式,但是我们可以去官网下载安装包,然后在安装,地址在这里:Download | PhantomJS

使用Selenium&PhantomJS抓取数据:

下面我们介绍一个简单到抓取百度的例子

1 from selenium import webdriver
2 #我们首先导入了Selenium里的webdriver,
3 browser = webdriver.PhantomJS()
4 #然后建立一个PhantomJS的浏览器对象,
5 url = 'https://www.baidu.com'
6 browser.get(url)
7 #最后我们通过get方法,打开了百度的首页。
8 browser.implicitly_wait(3)

这里要说一下 implicitly_wait():

浏览器解释JS脚本是需要时间的,但实际上这个时间并不好确定,如果我们手动设定时间间隔的话,设置多了浪费时间,设置少了又会丢失数据implictly_wait函数则完美解决了这个问题,给他一个时间参数,他会只能等待,当js完全解释完毕就会自动执行下一步。

找到搜索框和搜索按钮:

在第一步的时候,我们其实就已经把百度首页的数据爬到本地了,剩下当然是数据的筛选,这里推荐用Selenium自带函数来完成,Selenium 本身给出了相关函数来定位有效数据的位置。

# 找到第一个匹配的元素
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

# 一次查找多个元素 (这些方法会返回一个list列表):
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

相信之前学习了bs4和Xpath之后,用这个完全没有什么压力吧,看函数名就应该知道是具体通过什么来定位数据了。上面我们只是打开了百度而已,在使用真实浏览器的时候是不是要先在文本框里输入关键词然后在按搜索按钮呢?

在PhantomJS里我们也需要这样做:

 1 text = browser.find_element_by_id('kw')
 2 #首先调用find_element_by_id()方法找到了text栏的位置,
 3 
 4 text.clear()
 5 
 6 text.send_keys('python')
 7 #然后通过send_keys()方法来输入关键字
 8 
 9 print(browser.title)
10 #输出:百度一下,你就知道
11 
12 button = browser.find_element_by_id('su')
13 #接着还是通过find_element_by_id()方法找到提按钮,
14 
15 button.submit()
16 #最后我们通过.submint()方法来模拟点击,发送搜索请求

用chrome开发者工具可以快速定位到各个element的位置:

筛选答案

1 results = browser.find_elements_by_class_name('t')
2 #通过browser.find_elements_by_class_name()方法定位到搜索结果,返回一个element类型的列表
3 #再通过element.text 和 element.get_attribute()方法来获取我们需要的数据。
4 for result in results:
5     print('标题:{} 超链接:{}'.format(result.text,result.find_element_by_tag_name('a').get_attribute('href')))

下面看一下运行结果

1 标题:Welcome to Python.org官网 超链接:http://www.baidu.com/link?url=nLxm0hnvH9HcezbpHRuDVS5BVAyuR91xzNhFE4Qy9_a
2 标题:Python_百度百科 超链接:http://www.baidu.com/link?url=jUTKRqQ91sf2liPtZlVHVr82UNuP12PPKdll2ZNQ9-kifb4GeLDG3SlV9NuCvI2BWUSqG8coNRzsYvlYusYuJK
3 标题:Download Python | Python.org 超链接:http://www.baidu.com/link?url=PP6oQw_LHvRmuc8wl4c-BFn_GouagfYU-IY0HqdUF88ikq5zriz1JNManttiFFuX
4 标题:Python教程 - 廖雪峰的官方网站 超链接:http://www.baidu.com/link?url=89Q6mTNkcq1NdeDubb3jgq0Du3OX8hUcNt90fyhJ6nMWXfAPyJUZ7Vg-b9CSpaxdpOxGErzWzASuq4E96mHnxlZsLi6wieiEqtEk8UsJqjnfeWfhrLz_lWrtuPkWjXAo
5 标题:Mac版 Python最新官方版下载_百度软件中心 超链接:http://www.baidu.com/link?url=xkHduP0KLXEL1jvFt2ftD8LXgRG0gBop2ojePLkZr5s7WvcBZ1nYxU2sPjedwQGabjC_v89VUoYuKSzy8aI-Ja
6 标题:python吧_百度贴吧 超链接:http://www.baidu.com/link?url=N5vRlEUf6OWIyclfhkWz5r38A-kUhT40K7VTNIwLdR3zwNF8hFKbtsQtaRbCa_p0uPPwFaKRgMN0zvgvTMm6rK
7 标题:玩蛇网 - Python教程学习与Python资源分享平台 超链接:http://www.baidu.com/link?url=0AK0LLSw35u5qIfXy7O9n3AcgWy8A4MaR55Ia2LyVQjmxivy_Q_UY_khKCWJp7iG
8 标题:Python教程_百度文库 超链接:http://www.baidu.com/link?url=okXMxRDGk1j6Ni5Il_hwNz8RC7C79XtAo76NptBIUF-GNvEKwpR-vKCAjY9DrBugt2pFZ87UiLlKcrhdgNsGjQwdLXbPc36ACgSok0PEKOq
9 标题:Python - 伯乐在线 超链接:http://www.baidu.com/link?url=kBa0MYj70CsPtPIpCikAxJJol_b_JHtSGD9iot7-hrX2eBNH_WW2r-PoaJf_nFhp
原文地址:https://www.cnblogs.com/freeman818/p/7352040.html