上一章学习了用 python
模拟登陆百度,其中 get
和 post
的步骤很多,在任何一个环节出错都会导致最后登陆失败,所以这个对于新手来说有点勉强。这一章介绍一个简单的登陆方式,用以获取登陆后的 cookie
。
在 python
中有一个很强大的库 selenium
,这个库能调用浏览器,利用浏览器来登录百度,再提取出 cookie
,等下次登陆的时候利用这个 cookie
就能达到登陆的效果。而且,用 selenium
模拟浏览器根本不需要管什么 get
啊 post
啊,如果条件允许下,作者还是喜欢用 selenium
。在使用 selenium
前需要做一些准备工作:
- 下载解压安装
selenium-2.45.0.tar.gz
- 下载浏览器,
Chrome
的版本为47.0.2526.106 m
,firefox
的版本为32.0.1
- 下载浏览器支持插件到
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
关闭更新的方法有:
C:\Program Files (x86)\Google\
下直接删除update
文件夹- 右键计算机 -> 管理 -> 服务 -> 禁止
firefox
同理,直接删掉升级的 exe
,再禁止掉更新服务。顺便可以在浏览器中找到设置,把设置里面的更新也停止掉。
最后将浏览器插件放到 Python34
的目录下,尝试如下代码
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("//input[@id='kw']").send_keys("TTyb")
# 点击“百度一下”
browser.find_element_by_id("su").click()
是不是很神奇?而利用 selenium
来登陆百度会更加简单,完全不需要管 postdata
,只需要:
- 打开登陆页面
https://passport.baidu.com/v2/?login
- 查找 账号 、 密码 、 登陆 的
html
- 填写账号密码,直接登陆
在百度的登陆页面中,账号的 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()
利用selenium搜索关键词TTyb,找到 “百哥么么哒|个人网站”,并进入首页