PhantomJS+Selenium轻松爬虫及模拟网页点击(附容易踩的坑)

PhantomJS

首先简单介绍一下PhantomJS,它是一款没有界面的浏览器,也就是说PhantomJS并不是给普通用户浏览使用,它运行时在屏幕上是看不到的。相较于传统的界面浏览器,PhantomJS占用的内存更少,且大量爬虫时不会出现满屏的网页,所以你可以一边悠闲地上上网聊聊天,一般让爬虫后台运行。

Selenium

Selenium是一款模拟点击网页+爬虫的插件,一般和PhantomJS结合使用(也可以使用其他无界面浏览器)。这里啰嗦一下模拟点击的原理。不同于手机模点,由于各种电脑的分辨率和网页打开页面大小的不同,网页爬虫的点击不是选一个坐标点,然后给个click事件,而是分析网页生成的html代码,取得某一个元素,如div,方才给与点击。

实战及注解

说了这么多,下面举一个简单的例子让大家加深印象。代码是用Python写的,我会在每一行下面作注解。

----------------

from selenium import webdriver

#将selenium模块导进来

import time

#导入time模块,以便之后爬虫等待

driver=webdriver.PhantomJS()

#引用PhantomJS

driver.set_window_size(1920,1080)

#设置PhantomJS窗口大小,因为没有实体界面,所以大小随便设

driver.get("http://lovecrazy.cn")

#输入要爬的网站地址

driver.find_element_by_id("ls_username").send_keys("测试")

driver.find_element_by_id("ls_password").send_keys("ceshi123")

driver.find_element_by_xpath("//*[@id='lsform']/div/div/table/tbody/tr[2]/td[3]/button").click()

#以上三行做了输入账号密码及点击事件。find_element_by_id()先获取元素输入的位置,send_keys()中写要输入的内容。寻找位置的几种方法后面详细讲。

time.sleep(2)//加载新页面需要时间,让浏览器先喘口气,这里暂且让它缓2秒

data=driver.find_element_by_xpath("//*[@id='g_upmine']").text

print(data)

#以上两行只是个测试,显示登录成功后的用户组。

------------

获取元素的方法

下面讲一下怎么获取需要点击或爬取的元素。这里只说一下万能方法:

笔者采用Chrome内核的浏览器。谷歌浏览器,QQ浏览器,360浏览器都可以。打开网页后Wndows操作系统按F12,Mac则按option+command+c,也可依次右键,检查。点击新增界面左上角的鼠标箭头,再点击网页上要查找的元素,右键加深代码,依次选择Copy,Copy XPATH,最后将代码粘贴到driver.find_element_by_xpath("")括号中即可(别忘可把贴进来代码里的双引号改成单引号,否则会报错。

非万能方法耗时间,一般需要查找元素的id,class等标签,这里不推荐。

这里有个坑,你在网页点开一个链接后会发现获取不到新页面的数据。这是因为如果点击后打开了新窗口,程序获取的还是老窗口的内容,这里只需加一行driver.switch_to.window(driver.window_handles[1]),方括号中可填0,1和-1。0代表第一个窗口,1代表最后一个窗口,-1为当前显示的窗口。

快结束了

最后说一下获取爬的内容,其实很简单,只需在driver.find_element_by_xpath("")加.text或.value即可。(print就不用我说了,地球人都知道)

因为工作需要笔者采用PhantomJS+Selenium,但是读者若运行我的代码会发现,python给出一行警告(可无视),大意是PhantomJS已经被开放商放弃了,请用其他无界面浏览器。这次使用这个插件也是尝试,其实无头浏览器大同小异,学会PhantomJS再使用其他浏览器已是轻车熟路了。后期如果有机会我会更新Chrome无头版的爬虫方式。

THE END

本文为“爱锋程序猿”原创,转载请写明出处。

你可能感兴趣的:(PhantomJS+Selenium轻松爬虫及模拟网页点击(附容易踩的坑))