python




利用selenium工具,可支持多种浏览器。网上资料比较多。经过比较,我选择了Splinter模块,因为利用Splinter开发浏览器自动化操作,编写代码比较简单。
一、Splinter的安装
Splinter的使用必修依靠Cython、lxml、selenium这三个软件。所以,安装前请提前安装
Cython、lxml、selenium。以下给出链接地址:
1)http://download.csdn.net/detail/feisan/4301293
2)http://code.google.com/p/pythonxy/wiki/AdditionalPlugins#Installation_no
3)http://pypi.python.org/pypi/selenium/2.25.0#downloads
4)http://splinter.cobrateam.info/

注:selenium安装后注意下载相应的浏览器的驱动文件,下到后最好和浏览器所在位置放一起,然后将其路径设置为windows的环境变量

from selenium import webdriver
browser = webdriver.Chrome() # Get local session of Chrome
#如可启动浏览器,设置成功


二、Splinter的使用
  这里,我给出自动登录126邮箱的案例。难点是要找到页面的账户、密码、登录的页面元素,这里需要查看126邮箱登录页面的源码,才能找到相关控件的id.
  例如:输入密码,密码的文本控件id是pwdInput.可以使用browser.find_by_id()方法定位到密码的文本框,
接着使用fill()方法,填写密码。至于模拟点击按钮,也是要先找到按钮控件的id,然后使用click()方法。
由于代码较简单,我就只在代码中给出注解说明工作原理。
(测试环境win7+python2.7.3+Chrome)

1)
代码
----------------------------------------
#coding=utf-8
import time
from splinter import Browser

def splinter(url):
    browser = Browser('chrome')
    #login 126 email websize
    browser.visit(url)
    #wait web element loading
    time.sleep(5)
    #fill in account and password
    browser.find_by_id('idInput').fill('xxxxxx')
    browser.find_by_id('pwdInput').fill('xxxxx')
    #click the button of login
    browser.find_by_id('loginBtn').click()
    time.sleep(8)
    #close the window of brower
    browser.quit()

if __name__ == '__main__':
    websize3 ='http://www.126.com'
    splinter(websize3)


Python果然是够强大,参考网上一个智普啥的python视频培训,自己又完善了下。要让python打开浏览器,并访问指定网址,很简单只需下面两句话:

import webbrowser as web

web.open_new_tab('www.baidu.com')

如果你想访问一定次数或者一直访问,那就加个while True。下面给出完整程序,然后再解释:

  1. #coding=utf-8  
  2. import webbrowser as web  
  3. import time  
  4. import os  
  5. import random  
  6. M = random.randint(10,15)  
  7. print '随机数  = ', M  
  8. N = 10  
  9. j = 0  
  10. while j < M:  
  11.     i = 0  
  12.     while i < N:  
  13.         web.open_new_tab('http://blog.sina.com.cn/s/blog_723395a70101josb.html')  
  14.         i = i + 1  
  15.         time.sleep(1.5)  
  16.     else:  
  17.             os.system('taskkill /F /IM baidubrowser.exe')  
  18.     j = j + 1  
  19. else:  
  20.     print '本次python总共打开了', M * N, '次'  
  21. o='c:\\windows\\system32\\shutdown -s '  
  22. os.system(o)  
#coding=utf-8
import webbrowser as web
import time
import os
import random
M = random.randint(10,15)
print '随机数  = ', M
N = 10
j = 0
while j < M:
    i = 0
    while i < N:
        web.open_new_tab('http://blog.sina.com.cn/s/blog_723395a70101josb.html')
        i = i + 1
        time.sleep(1.5)
    else:
            os.system('taskkill /F /IM baidubrowser.exe')
    j = j + 1
else:
    print '本次python总共打开了', M * N, '次'
o='c:\\windows\\system32\\shutdown -s '
os.system(o)


注意事项:

1、开头是设置编码,支持python打印中文;

2、random.randint(10,15)是生成一个10到15之间的随机数,在这里可以控制访问次数。然后里面又嵌套了一个while,所以最终的访问次数是M*N次;

3、每N次,这里N=10,打开10个浏览器页面后,就要通过taskkill /F /IM baidubrowser.exe命令,杀死浏览器进程。如果是其他浏览器,可以再任务管理器里查看浏览器的进程。通过os.system让windows来执行。如果在linux下要换成kill命令。为啥要每10次就关下浏览器呢?因为如果打开太多,占用资源太多,电脑会挂掉。所以每隔10次关下浏览器。每次打开后,让它休眠一定时间,如果中间不留时间,浏览器还没请求到数据就关了。

4、最后如果刷完了,想要自动关机的话通过shutdown -s命令来实现,方便python半夜执行完任务后自动将浏览器关闭。


xml文件名citylist.xml,数据内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <response>  
  4.     <list>  
  5.     <city>  
  6.       <name>天津</name>  
  7.       <code>tianjin</code>  
  8.     </city>  
  9.     <city>  
  10.       <name>上海</name>  
  11.       <code>shanghai</code>  
  12.     </city>  
  13.   </list>  
  14. </response>  
<?xml version="1.0" encoding="UTF-8"?>

<response>
    <list>
    <city>
      <name>天津</name>
      <code>tianjin</code>
    </city>
    <city>
      <name>上海</name>
      <code>shanghai</code>
    </city>
  </list>
</response>
  1. #-*-coding:utf-8-*-  
  2. import MySQLdb  
  3. from xml.dom import minidom  
  4. doc = minidom.parse("citylist.xml")  
  5. root = doc.documentElement  
  6. citys = root.getElementsByTagName("city")  
  7.   
  8. conn = MySQLdb.connect(host="local",user="local",passwd="local",db="bw_local", charset='utf8')  
  9. cursor = conn.cursor()  
  10. for city in citys:  
  11.     #print city.toxml()  
  12.     nameNode = city.getElementsByTagName("name")[0]  
  13.     #print (nameNode.nodeName + ":" + nameNode.childNodes[0].nodeValue)  
  14.     codeNode = city.getElementsByTagName("code")[0]  
  15.     #print (codeNode.nodeName + ":" + codeNode.childNodes[0].nodeValue)  
  16.     cursor.execute('insert into original(city,code) values(%s,%s);',(nameNode.childNodes[0].nodeValue,codeNode.childNodes[0].nodeValue))  
  17.   
  18. conn.commit()  
  19. cursor.close()  
  20. conn.close()  
  21. print "success"  
#-*-coding:utf-8-*-
import MySQLdb
from xml.dom import minidom
doc = minidom.parse("citylist.xml")
root = doc.documentElement
citys = root.getElementsByTagName("city")

conn = MySQLdb.connect(host="local",user="local",passwd="local",db="bw_local", charset='utf8')
cursor = conn.cursor()
for city in citys:
    #print city.toxml()
    nameNode = city.getElementsByTagName("name")[0]
    #print (nameNode.nodeName + ":" + nameNode.childNodes[0].nodeValue)
    codeNode = city.getElementsByTagName("code")[0]
    #print (codeNode.nodeName + ":" + codeNode.childNodes[0].nodeValue)
    cursor.execute('insert into original(city,code) values(%s,%s);',(nameNode.childNodes[0].nodeValue,codeNode.childNodes[0].nodeValue))

conn.commit()
cursor.close()
conn.close()
print "success"

 doc = minidom.parse("citylist.xml")表示将xml文件中的数据全部加载到变量doc中。

root = doc.documentElement表示获取xml的根结点

citys = root.getElementsByTagName("city")获取要结点下面所有tag为city的数据,这里的根结点是<response></response>,也就是说获取整个文件的city

可以通过for city in citys: print city.toxml()查看一下city的数据结构。 

  1. <city>  
  2.       <name>天津</name>  
  3.       <code>tianjin</code>  
  4. </city>  
<city>
      <name>天津</name>
      <code>tianjin</code>
</city>

city.getElementsByTagName("name")是获取city下面所有tag为name的数据,是一个数组,因为每一个城市只有一个name,所以可以使用nameNode = city.getElementsByTagName("name")[0]获取到<name>天津</name>这样的结点数据。nameNode.nodeName是获取<name></name>中的name,nameNode.childNodes[0].nodeValue是获取到<name>天津</name>中的“天津”。 

结果:

nameNode.nodeName:nameNode.childNodes[0].nodeValue
name:上海
code:shanghai
name:北京
code:beijing
name:保定
code:baoding 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值