python爬虫学习:浏览器登陆

                                                                                                                                  上一章学习了用?python?模拟登陆百度,其中?get?和?post?的步骤很多,在任何一个环节出错都会导致最后登陆失败,所以这个对于新手来说有点勉强。这一章介绍一个简单的登陆方式,用以获取登陆后的?cookie?。

                                                                                                                                  在?python?中有一个很强大的库?selenium?,这个库能调用浏览器,利用浏览器来登录百度,再提取出?cookie?,等下次登陆的时候利用这个?cookie?就能达到登陆的效果。而且,用?selenium?模拟浏览器根本不需要管什么?get?啊?post?啊,如果条件允许下,作者还是喜欢用?selenium?。在使用?selenium?前需要做一些准备工作:

                                                                                                                                  1. 下载解压安装?selenium-2.45.0.tar.gz
                                                                                                                                  2. 下载浏览器,?Chrome?的版本为?47.0.2526.106 m?,firefox?的版本为?32.0.1
                                                                                                                                  3. 下载浏览器支持插件到?python?,作者的?Python34?是安装在?C?盘,所以将插件放在?C:\Python34\?下面,Chrome?的为?chromedriver.exe?,?firefox?的为?firefoxdriver.exe

                                                                                                                                  解压完?selenium-2.45.0.tar.gz?后,找到?setup.py?,运行?python setup.py install?等待安装完成即可。这里为什么不用高版本的?selenium??因为高版本的?selenium?不支持低版本的浏览器,而且高版本的浏览器插件貌似还没更新,用的时候会出现意想不到的?bug?,所以这里使用了低版本的?selenium?。安装浏览器后切记关闭浏览器的更新,Chrome?关闭更新的方法有:

                                                                                                                                  1. C:\Program Files (x86)\Google\?下直接删除?update?文件夹
                                                                                                                                  2. 右键计算机 -> 管理 -> 服务 -> 禁止?Google?更新服务

                                                                                                                                  firefox?同理,直接删掉升级的?exe?,再禁止掉更新服务。顺便可以在浏览器中找到设置,把设置里面的更新也停止掉。

                                                                                                                                  最后将浏览器插件放到?Python34?的目录下,尝试如下代码

                                                                                                                                  '''
                                                                                                                                  遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料
                                                                                                                                  '''
                                                                                                                                  from selenium import webdriver
                                                                                                                                  
                                                                                                                                  # browser = webdriver.Chrome()
                                                                                                                                  browser = webdriver.Firefox()
                                                                                                                                  browser.get("https://www.baidu.com")
                                                                                                                                  

                                                                                                                                  如果能成功打开浏览器,那么就证明安装成功了!如下图所示:

                                                                                                                                  selenium?可以根据页面前端的?id?、?class?、?tag name?等方式定位。打开百度首页,?F12?选择?点击查看页面中的元素?,将指针放到搜索栏,点击左键:

                                                                                                                                  点击搜索框后可以得到搜索框的?html?代码:

                                                                                                                                  <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
                                                                                                                                  

                                                                                                                                  同理将指针放到?百度一下?按钮上面,得到百度一下的?html?代码:

                                                                                                                                  <input id="su" class="bg s_btn" type="submit" value="百度一下">
                                                                                                                                  

                                                                                                                                  可以看到搜索框的?id?是?kw?, 百度一下的?id?是?su?,而利用?selenium?可以定位到搜索框,并在搜索框填写需要搜索的东西,最后实现点击百度一下,代码为:

                                                                                                                                  url = "https://www.baidu.com/"
                                                                                                                                  
                                                                                                                                  browser = webdriver.Chrome()
                                                                                                                                  # browser = webdriver.Firefox()
                                                                                                                                  browser.get(url)
                                                                                                                                  
                                                                                                                                  # 清空搜索框
                                                                                                                                  browser.find_element_by_id("kw").clear()
                                                                                                                                  
                                                                                                                                  # 通过id方式定位
                                                                                                                                  browser.find_element_by_id("kw").send_keys("TTyb")
                                                                                                                                  
                                                                                                                                  # 点击“百度一下”
                                                                                                                                  browser.find_element_by_id("su").click()
                                                                                                                                  

                                                                                                                                  也可以通过?name?、?class name?、?CSS?、?xpath?定位:

                                                                                                                                  # 通过name方式定位
                                                                                                                                  browser.find_element_by_name("wd").send_keys("TTyb")
                                                                                                                                  # 通过class name 方式定位
                                                                                                                                  # browser.find_element_by_class_name("s_ipt").send_keys("TTyb")
                                                                                                                                  # 通过CSS方式定位
                                                                                                                                  # browser.find_element_by_css_selector("#kw").send_keys("TTyb")
                                                                                                                                  # 通过xpath方式定位
                                                                                                                                  # browser.find_element_by_xpath("http://input[@id='kw']").send_keys("TTyb")
                                                                                                                                  
                                                                                                                                  # 点击“百度一下”
                                                                                                                                  browser.find_element_by_id("su").click()
                                                                                                                                  

                                                                                                                                  是不是很神奇?而利用?selenium?来登陆百度会更加简单,完全不需要管?postdata?,只需要:

                                                                                                                                  1. 打开登陆页面?https://passport.baidu.com/v2/?login
                                                                                                                                  2. 查找?账号?、?密码?、?登陆?的?html
                                                                                                                                  3. 填写账号密码,直接登陆

                                                                                                                                  在百度的登陆页面中,账号的?html?为:

                                                                                                                                  <input id="TANGRAM__PSP_3__userName" class="pass-text-input pass-text-input-userName pass-text-input-hover" type="text" autocomplete="off" name="userName" placeholder="手机/邮箱/用户名">
                                                                                                                                  

                                                                                                                                  密码的?html?为:

                                                                                                                                  <input id="TANGRAM__PSP_3__password" class="pass-text-input pass-text-input-password" type="password" name="password" placeholder="密码" autocomplete="off">
                                                                                                                                  

                                                                                                                                  登陆的?html?为:

                                                                                                                                  <input id="TANGRAM__PSP_3__submit" class="pass-button pass-button-submit" type="submit" value="登录">
                                                                                                                                  

                                                                                                                                  可以很明显的知道账号的?id?为?TANGRAM__PSP_3__userName?,密码的?id?为?TANGRAM__PSP_3__password?,登陆的?id?为?TANGRAM__PSP_3__submit?,用代码实现:

                                                                                                                                  # 清空账号输入框
                                                                                                                                  browser.find_element_by_id("TANGRAM__PSP_3__userName").clear()
                                                                                                                                  # 通过id方式定位账号
                                                                                                                                  browser.find_element_by_id("TANGRAM__PSP_3__userName").send_keys("username")
                                                                                                                                  
                                                                                                                                  # 清空密码输入框
                                                                                                                                  browser.find_element_by_id("TANGRAM__PSP_3__password").clear()
                                                                                                                                  # 通过id方式定位密码
                                                                                                                                  browser.find_element_by_id("TANGRAM__PSP_3__password").send_keys("password")
                                                                                                                                  
                                                                                                                                  # 点击“登陆”
                                                                                                                                  browser.find_element_by_id("TANGRAM__PSP_3__submit").click()
                                                                                                                                  

                                                                                                                                  万一出现验证码怎么办?定位到验证码的?html?,手动输入验证码进去:

                                                                                                                                  verifycode = input("验证码是:")
                                                                                                                                  # 填写验证码
                                                                                                                                  browser.find_element_by_id("验证码id").send_keys(verifycode)
                                                                                                                                  # 点击“登陆”
                                                                                                                                  browser.find_element_by_id("TANGRAM__PSP_3__submit").click()
                                                                                                                                  

                                                                                                                                  登陆成功后,可以获取登录后的?cookie?:

                                                                                                                                  cookie = [item["name"] + "=" + item["value"] for item in browser.get_cookies()]
                                                                                                                                  

                                                                                                                                  得到的?cookie?是一个数组,将这个数组转化为?dict?,在保存为本地的?json?,下次登陆就直接可以调用?requests?登陆了:

                                                                                                                                  dict = {}
                                                                                                                                  for item in cookie:
                                                                                                                                      itm = item.split("=")
                                                                                                                                      dict[itm[0]] = itm[1]
                                                                                                                                  
                                                                                                                                  import json
                                                                                                                                  file = open("cookie.json","w")
                                                                                                                                  file.write(json.dumps(dict))
                                                                                                                                  file.close()
                                                                                                                                  

                                                                                                                                  最后记得关闭浏览器?browser.quit()

                                                                                                                                  展开阅读全文

                                                                                                                                  没有更多推荐了,返回首页