Selenium模拟登陆百度贴吧和新浪微博

发表于:2017-9-28 16:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:芒果    来源:51Testing软件测试网采编

  selenium和phantomjs是爬取动态获取数据和AJAX的良配。上一篇已经说了phantomjs的安装方法与常见用法。接下来就是安装Selenium和phantomjs实现模拟登陆百度贴吧,并实现签到。
  selenium的安装过程对于作者本人有点坎坷,真心感觉纸上得来终觉浅,要得出真知还是实践来撸一遍。
  撸一遍
  ●1.安装selenium
  安装虐我千百遍,结果发现自己傻了眼。假设已经安装好了python解释器(新版本默认安装了pip)运行下面命令:
  pip install selenium
  ●2.查看selenium安装成功与否,如果运行下面的命令,出现下图的selenium,则说明安装成功:
  pip list
  安装的模块
  ●3.新创建一个python文件,代码如下所示,但是运行的时候出现can not find the module selenium:
  from selenium import webdriver
  driver=webdriver.PhantomJS()
  print(driver.page_source)
  driver.quit()
  
吓屎了
  ●4.明明安装了selenium,怎么就是找不到呢?不要慌,沉着冷静,没关系,百度上大多的办法都解决不了问题,不过总是有大神的办法能解决的。运行下面的命令。
  C:\Users\userName>python
  Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v
  900 64 bit (AMD64)] on win32
  Type "help", "copyright", "credits" or "license" for more information.
  >>> import selenium
  >>> print( selenium.__file__)
  D:\anaconda\lib\site-packages\selenium\__init__.py
  >>>
  5.从上面可以看出自己造了个坑,之前因为要安装Anaconda使用scrapy,所以默认安装selenium的时候会安装在D:\anaconda\lib\site-packages\;所以在python的IDLE引用selenium模块时会引用不到,因为python默认安装的模块路径是D:\pyfiles(这是python安装的目录)\Lib\site-packages\。所以最好的解决方法是直接copy一份到python解释器目录下。
  解决问题
  6.解决了slenium引用模块问题,接下来要解决的问题是Phantomjs的安装路径必须加入系统的环境变量,才能调用。右键点击我的电脑,然后选择属性,然后如下图所示,找到path变量值,最后把安装路径添加到path。
  添加到path
  7.观察百度贴吧的登录过程,百度贴吧登录先要点击登录然后弹出模态窗,最后输入账号与密码才可以登录。由于百度贴吧是通过js进行数据的加载,所以我们必须延迟几秒,等待百度贴吧完全把数据加载进来。
  登录过程
  8.登录模态框的账号id是TANGRAM__PSP_10__userName;密码id是TANGRAM__PSP_10__password;登录按钮id是TANGRAM__PSP_10__submit。
  <html>
   <head></head>
   <body>
    <p id="TANGRAM__PSP_10__userNameWrapper" class="pass-form-item pass-form-item-userName" style="display:"><label for="TANGRAM__PSP_10__userName" id="TANGRAM__PSP_10__userNameLabel" class="pass-label pass-label-userName">手机/邮箱/用户名</label><input id="TANGRAM__PSP_10__userName" type="text" name="userName" class="pass-text-input pass-text-input-userName open" autocomplete="off" value="" placeholder="手机/邮箱/用户名" /><span id="TANGRAM__PSP_10__userName_clearbtn" class="pass-clearbtn pass-clearbtn-userName" style="display: none; visibility: hidden; opacity: 1;"></span><span id="TANGRAM__PSP_10__userNameTip" class="pass-item-tip pass-item-tip-userName" style="display:none"><span id="TANGRAM__PSP_10__userNameTipText" class="pass-item-tiptext pass-item-tiptext-userName"></span></span></p>
    <ul id="TANGRAM__PSP_10__suggestionWrapper" class="pass-suggestion-list" style="display: none; visibility: hidden; opacity: 1;">
     <li class="pass-item-suggsetion" data-select="13071673760" data-type="history">13071673760<a data-delete="13071673760" title="删除该记录"></a></li>
     <li class="pass-item-suggsetion" data-select="13415334317" data-type="history">13415334317<a data-delete="13415334317" title="删除该记录"></a></li>
     <li class="pass-item-suggsetion" data-select="huahaoworkspace@163.com" data-type="history">huahaoworkspace@163.com<a data-delete="huahaoworkspace@163.com" title="删除该记录"></a></li>
    </ul>
    <span class="pass-item-selectbtn pass-item-selectbtn-userName" style="display: none; visibility: hidden; opacity: 1;"></span>
    <p></p>
   </body>
  </html>
  9.登录百度贴吧,和实行签到代码,中间使用太多的sleep进行间歇,主要是等待页面的加载,下次会用selenium的隐式等待与显式等待重构:
  明明偷懒
  from selenium import webdriver
  from time import sleep
  driver=webdriver.PhantomJS()
  driver.get("https://tieba.baidu.com/index.html#")
  sleep(3)
  #模拟点击登录按钮,并且弹出模态窗
  driver.find_element_by_xpath("//li[@class='u_login']/div/a").click()
  sleep(2)
  #清除账号输入框的历史账号
  driver.find_element_by_id("TANGRAM__PSP_10__userName").clear()
  #填写账号
  driver.find_element_by_id("TANGRAM__PSP_10__userName").send_keys("账号")
  driver.find_element_by_id("TANGRAM__PSP_10__password").clear()
  #填写密码
  driver.find_element_by_id("TANGRAM__PSP_10__password").send_keys("密码")
  #模拟点击登录按钮
  driver.find_element_by_id("TANGRAM__PSP_10__submit").click()
  sleep(5)
  # div#onekey_sign>a是一键签到的css选择器,其中j_sign_btn是点击一键签到后踏出来的模态窗的按钮css选择器
  driver.find_element_by_css_selector("div#onekey_sign>a").click()
  driver.find_element_by_css_selector(".j_sign_btn ").click()
  sleep(2)
  driver.get_screenshot_as_file("C:\\Users\\username\\Desktop\\1.png")
  driver.quit()
  10.有图有真相。
  辣么长的图是用来凑字数的吧
  11.文末有彩蛋,只要模拟登录过中国最大中文社区,哪能忽略了我们的新浪微博呢。都跟上述百度贴吧的逻辑是一样的,不过因为新浪微博网页是响应性。用phantomjs没有最大化窗口的时候,登陆框等都是不可见的即display:none,只有最大化窗口,然后显式等待,最后发现可以模拟登录成功,直接上一遍。
  其实是别的博主给的建议
  from selenium import webdriver
  from time import sleep
  driver=webdriver.PhantomJS()
  driver.maximize_window()
  driver.get("https://www.weibo.com/login.php")
  sleep(3)
  driver.find_element_by_id("loginname").clear()
  driver.find_element_by_id("loginname").send_keys("xxxx")
  driver.find_element_by_xpath("//*[@id='pl_login_form']/div/div[3]/div[2]/div/input").clear()
  driver.find_element_by_xpath("//*[@id='pl_login_form']/div/div[3]/div[2]/div/input").send_keys("xxxx")
  driver.find_element_by_xpath("//*[@id='pl_login_form']/div/div[3]/div[6]/a").click()
  sleep(10)
  driver.get_screenshot_as_file("C:\\Users\\Username\\Desktop\\1.png")
  driver.quit()
  登录后的场景
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号