您的位置:首页 > 编程语言 > Python开发

用Python+Selenium+PhantomJS实现采集动态数据的小爬虫

2017-10-23 11:19 736 查看

要实现的功能

本文利用Python+Selenium+PhantomJS实现一个能模拟用户登录采集动态数据并将数据存储到本地的小爬虫。

要点:

- 小爬虫

- 模拟用户登录

- 动态数据采集

- 将采集到的数据存成txt文件

开发工具的配置

1、安装Python

下载并安装Python,然后将其添加到环境变量中。

例如将Python安装在C盘,那么需要打开计算机属性中的高级系统设置,在环境变量中添加Python的安装路径,C:\python27;,添加好环境变量之后,我们就可以检查一下Python是否配置成功,在命令提示符中切换到Python安装路径,然后输入Python,出现如下结果,则表示配置成功。



2、安装setuptools

想要安装Selenium,那必须要先安装setuptools,有了它,就可以轻松的安装Python其他的软件包了。

下载并解压之后用同样的方法把C:\Python27\Scripts这个目录加入到系统环境变量中。在命令提示符中输入以下内容,就可以安装完成了。

C:\Python27\setuptools-12.4>Python setup.py install


3、安装pip

安装好setuptools之后,再安装pip,可以直接用easy_install来安装。

这个时候需要在命令行程序中将目录切换到 C:\Python27\Scripts 目录下输入:

C:\Python27\Scripts > easy_install  pip


4、安装Selenium

安装好前面两个工具之后,我们就可以很轻松的安装Selenium了,在命令提示符中输入如下图所示内容即可:



如果出现以下结果,则表示安装成功。



5、安装PhantomJS

用上文所讲的类似的方法下载并安装PhantomJS,可以通过建立一个test.js文件,然后在命令提示符中输入:phantomjs test.js来测试是否安装成功。

以上就是我们程序开发所需要提前配置的一些工具和包,安装好这些工具后就可以进行程序设计了。

程序分析

# -*- coding:utf-8 -*-
import selenium
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
import os

if __name__ == '__main__':
url = "http://xxxx"
driver= webdriver.PhantomJS()
driver.get(url)
driver.find_element_by_name("user").clear()
driver.find_element_by_name("user").send_keys("user")
driver.find_element_by_name("pass").clear()
driver.find_element_by_name("pass").send_keys("pass")
driver.find_element_by_css_selector("[value='Login']").submit()
driver.get("http://xxxx")
print(driver.page_source)
f=open("xxx.txt",'a')
count=1
while(1):
try:
driver.switch_to_frame("ifrm")
element = driver.find_elements_by_class_name("lbl")
datas=driver.find_elements_by_class_name("val")
for elem in element:
print elem.text ,
e=elem.text
f.write(e)
f.write(',')
print'\n'
f.write('\n')
for data in datas:
print data.text,
d=data.text
f.write(d)
f.write(',')
print'\n'
f.write('\n')
driver.switch_to_default_content()
except NoSuchElementException:
assert 0, "can't find data"
count=count+1
time.sleep(1)
if(count>10):
break
f.close()
driver.close()


1.
# -*-coding:utf-8-*-

由于互联网的包容性,现阶段的网页编码有很多种。我们采用网页编码自动获取的方法来防止我们提取信息的时候出现乱码的情况。

Python默认使用ASCII编码,如果不加以说明,在文件中一旦出现中文就会有乱码,所以在程序开头第一行或者第二行处加了一行注释来指定文件编码为utf-8,防止乱码。

2.导入第三方库

Python有丰富的库,在使用Python 相应的库的时候,我们需要提前导入这些库。而且有一些第三方库不是Python内部自带的,就需要先下载,并且安装完成之后才能导入,进行使用。下载好需要的库后,可以使用包管理器(pip)进行安装,例如
pip install selenium


import selenium
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
import os


3.
if __name__ == '__main__':

我们想要编写一个Python程序,可以直接在Python里写程序,也可以下载一个文本编辑器,将代码写在文本编辑器里面。如果直接使用Python写程序,程序是立即响应的,并且不能保存。如果在文本编辑器里面写代码,可以将代码写好保存,下次继续使用。这里我们使用的Sublime Text文本编辑器来编写代码,写好之后保存为.py格式的文件,然后在命令提示符中切换到存储的相应目录下运行,如下图所示。



因为我们在命令提示符中直接运行的.py文件,所以需要在我们的代码中写:

if  __name__  ==  '__main__' :


name_”表示当前模块,“_name”的值取决于如何应用该模块。如果当前模块是直接运行的,模块名是一个缺省值为“__main”。如果是导入一个模块,那么“
b926
name”的值就为模块的文件名。

通常可以用if name == ‘main‘来判断是否是直接运行该.py文件。

4.模拟登录

现在很多网页都需要先登录才能获取信息,所以这里写了一个模拟用户登录的模块。

第一步:启动无头浏览器,用PhantomJS创建一个新的Selenium WebDriver,获取到登录页面的网址,进入到登录界面,用WebDriver加载目标页面:

url = "http://xxxx"
driver= webdriver.PhantomJS()
driver.get(url)


在执行这一步需要注意的是必须先将PhantomJs配置到环境变量中,否则就需要在Selenium的WebDriver接入点指明PhantomJS的可执行文件的路径,如:

driver=webdriver.PhantomJS(executable_path=’E:\PhantomJS211\bin\phantomjs.exe’)


当然同理,我们也可以选择用Firefox或者Chrome等浏览器来实现,不过使用这些浏览器时需要安装相应的驱动,再将其配置到环境变量中。而且如果使用Firefox还需注意版本问题,Selenium2.x支持火狐47及47以下的浏览器,否则版本不匹配会导致Selenium在运行时打不开浏览器。

我选择用PhantomJS这个无头浏览器来实现,它可以让代码内嵌在后台中运行,运行速度更快。

第二步:模拟用户行为进行登录,通过Selenium的各种元素定位方法找到我们的用户名输入框、密码输入框,并且通过send_keys来填写用户名和密码。然后观察登录按钮的特征,同样通过Selenium元素定位方法找到登录按钮,并且通过submit实现点击提交。这样我们就通过模拟浏览器行为成功登录进页面了,就像我们自己在网页上完成了填写信息以及提交等操作一样。

`

driver.find_element_by_name("user").clear()

driver.find_element_by_name("user").send_keys("user")

driver.find_element_by_name("pass").clear()

driver.find_element_by_name("pass").send_keys("pass")


5.
print(driver.page_source)

打印页面源代码。

6.获取iframe内的数据

我们需要获取的数据在iframe里面,但是由于WebDriver不能跨iframe解析文档,所以想要获取iframe里面的内容,必须先跳转到iframe中,再抽取数据,否则直接查找iframe里面的数据是查找不了的。

例如想要跳转到id为‘ifrm’的iframe里面就需要提前写一句:

driver.switch_to_frame("ifrm")


如果要跳出当前iframe,切换回默认页面去查找其他信息,则需要写:

driver.switch_to_default_content()


7.异常处理

在程序中我们无法确定变量中的什么值,或者什么错误的操作会导致程序崩溃,想要避免这样的情况,我们可以使用try/except来避免异常错误。Try/except语句由两个代码块组成,Python首先尝试运行try语句,如果try代码块中没有产生错误,Python直接跳过except代码块,执行后面的语句。而如果在运行try语句时遇到任何错误,它将运行except代码块中的语句,然后,程序继续正常运行。

8.循环抓取数据

count=count+1
time.sleep(1)
if(count>10):
break


time.sleep(1)表示每隔一段时间循环一次。

9.将数据存储成txt文件

打开文件:

想要将数据储存在文件中,首先需要打开一个文件。在Python中打开一个文件,我们就创建了一个流。有两种方法可以实现:第一种是打开一个文件,并且将数据添加到文档末尾,不删除原来文件中的数据;第二种是擦除原来文件中的内容,重新开始写入数据。因此我们需要发送一个额外的参数来控制是以怎样的方式来写入数据。如果使用‘w’模式打开文件,不能打开不存在的文件,而且要擦除文件原有内容;而使用‘a’模式打开文件,如果文件存在则直接打开,如果文件不存在,Python就会创建它,并且不覆盖原有内容,将数据添加在文件末尾。在这里我们使用‘a’,例如:

f=open("xxxx.txt",'a')


这里没有设定创建的文件的目录,它将自动创建在程序相同的路径下。

写入数据:

把文件打开后,只需要将数据写入即可,用f.write()就可以实现将数据按顺序存储成txt格式的文件了,在本地就能随时查看和使用了。

关闭文件:

当我们不再需要文件时,我们必须将它关闭。因为打开文件会占用系统资源,即使文件很小也需要将其关闭:

f.close()


10.
driver.close()

这句话是必须的,养成良好的习惯,用完就要关闭,原理同关闭文件差不多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息