Python实现模拟登录的三种方法
上面一篇介绍了用户登录账号涉及到的过程,接下来将对模拟登录常用的方法进行总结和叙述。常用的方法如下:
- 添加 Cookies 方法:这是最简单的一种方法,先手动在网站上登录自己的账号然后用这种方法获取到的 Cookies 加入 Headers 中,最后用 GET 方法请求登录。
- POST 请求方法:该方法首先需要仔细分析针对某网站的登录过程,然后从该过程中获取登录的 URL;之后,通过Form Data(表单数据) 和 Headers(请求头部)分析得出各个参数(用户名、密码、token等);由以上两步,我们就可以构造data(post到服务器的data)和headers用爬虫程序重新请求、登录。
- Selenium 模拟登录:代替手工操作,自动完成账号和密码的输入,简单但速度比较慢。
下面将对后两种方法进行介绍。
目录
POST方法
参见[Python3网络爬虫开发实战] 10.1-模拟登录并爬取 GitHub
Selenium方法
环境配置
Selenium安装
1.相关链接
- 官方网站:http://www.seleniumhq.org
- GitHub:https://github.com/SeleniumHQ/selenium/tree/master/py
- PyPI:https://pypi.python.org/pypi/selenium
- 官方文档:http://selenium-python.readthedocs.io
- 中文文档:http://selenium-python-zh.readthedocs.io
2.安装
pip install selenium
ChromeDriver安装
1.首先需要安装下载Chrome浏览器:
# windows:方法有很多,在此不再赘述;
# linux(CentOS):
(1)查看Chrome版本:google-chrome --version
(2)直接下载安装chrome:yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
(3)已有安装包的安装:在rpm包所在目录执行:yum localinstall google-chrome-stable_current_x86_64.rpm
(此时下载的Chrome是最新版本的)
2.下载安装ChromeDriver:
-相关链接
- 官方网站:https://sites.google.com/a/chromium.org/chromedriver
- 下载地址:https://chromedriver.storage.googleapis.com/index.html
在进行第二部之前请确保已经正确安装好了Chrome浏览器并可以正常运行。
-查看Chrome浏览器版本
点击Chrome菜单“帮助”→“关于Google Chrome”,即可查看Chrome的版本号。
-下载ChromeDriver
Chrome版本号决定了所需要用的ChromeDriver版本,Google提供了查找并下载特定版本的Chrome对应的ChromeDriver版本的方法,如下:
# 在windows中,可以直接通过链接找到对应版本的文件夹下的程序进行下载;
# 在CentOS中,可以在某一文件夹下使用以下命令进行下载:
wget https://chromedriver.storage.googleapis.com/[83.0.4103.39]/chromedriver_linux64.zip
# [83.0.4103.39]是对应版本号
unzip chromedriver_linux64.zip
# 解压命令
-环境变量配置
下载并解压完成后,将ChromeDriver的可执行文件配置到环境变量下。
windows下配置
在Windows下,可以将chromedriver.exe文件和chrome应用程序放在一起,如下图所示。
然后在程序中, 将该路径填入变量DRIVER_PATH
Linux下配置
在Linux和Mac下,需要将可执行文件chromedriver.exe配置到环境变量或将文件移动到属于环境变量的目录里。变量DRIVER_PATH也需要设置为/usr/bin或其他。
- 比较方便的做法如下:
1.移动chromedriver.exe到/usr/bin目录下:
可以直接粘贴复制,也可以用命令行的方式:在命令行模式下进入其所在路径,然后输入以下命令将其移动到/usr/bin:
sudo mv chromedriver /usr/bin
2.然后进入/usr/bin目录下设置:
# 给与权限
chmod +x chromedriver
# 查看版本,进入目标文件夹
cd /usr/bin/
# 目录下执行
./chromedriver
- 另外一种方法是:
将ChromeDriver配置到$PATH。首先,可以将可执行文件放到某一目录,目录可以任意选择,例如将当前可执行文件放在/usr/local/chromedriver目录下,接下来可以修改~/.profile文件,相关命令如下:
export PATH="$PATH:/usr/local/chromedriver"
保存后执行如下命令,即可完成环境变量的添加:
source ~/.profile
- 验证完成安装
在命令行中输入:
chromedriver
# 测试其位置
whereis chromedriver
如果显示类似下图所示的输出,则证明ChromeDriver的环境变量配置好了。
随后再在程序中测试,执行如下测试Python代码:
from selenium import webdriver
browser = webdriver.Chrome()
运行之后,如果弹出一个空白的Chrome浏览器,则证明所有的配置都没有问题,安装完成。
如果没有弹出,请检查之前的每一步配置。
如果弹出后闪退,则可能是ChromeDriver版本和Chrome版本不兼容,则需要更换ChromeDriver版本。
基本使用
Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效。下面将对利用Selenium爬取信息时所涉及到的知识进行总结,如下:
1.声明浏览器对象
Selenium可以支持多种浏览器,包括Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。
通常我们使用一下语句对浏览器进行初始化:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
这样就完成了浏览器对象的初始化并将其赋值为browser
对象。接下来,我们要做的就是调用browser
对象,让其执行各个动作以模拟浏览器操作。
2.访问页面
使用get()
方法来请求网页,参数传入目标URL即可。
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
print(browser.page_source)
browser.close()
运行程序后弹出了Chrome浏览器并且自动访问了百度首页,然后控制台输出了页面的源代码,随后浏览器关闭。
这样就实现了浏览器的驱动和网页源码的获取,非常便捷。
3.查找节点
Selenium提供了一系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便下一步执行一些动作或者提取信息。这些方法总的来说分为三类:
- 通过xpath选择器查找
# 填入xpath语法即可
elements = food.find_elements_by_xpath('')
- 通过CSS选择器查找
#填入css语法即可
elements = driver.find_element_by_css_selector('')
- 通过标签属性查找
#查找id为kw的元素
element = driver.find_element_by_id("kw")
#查找name为cheese的元素
cheese = driver.find_element_by_name("cheese")
# 所有可查找属性
find_element_by_id
find_element_by_name
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
另外,Selenium还提供了通用方法find_element()
,它需要传入两个参数:查找方式By
和值。实际上,它就是find_element_by_id()
这种方法的通用函数版本,比如find_element_by_id(id)
就等价于find_element(By.ID, id)
,二者得到的结果完全一致。使用方法具体如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input_first = browser.find_element(By.ID, 'q')
print(input_first)
browser.close()
注意:如果查找的目标在网页中只有一个,那么完全可以用find_element()
方法。但如果有多个节点,再用find_element()
方法查找,就只能得到第一个节点了。如果要查找所有满足条件的节点,需要用find_elements()
这样的方法。
同理,所有获取多个节点的方法如下:
find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
#也可以直接用find_elements()方法
lis = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')
4.节点交互
Selenium可以让浏览器模拟执行人在使用浏览器时的一些操作。在做模拟登录时,比较常见的用法有:输入用户名和密码时用send_keys()
方法,清空文字时用clear()
方法,点击登录按钮时用click()
方法等。
提交表单示例如下:
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(1)
button = browser.find_element_by_class_name('btn-search')
button.click()
该示例中,首先驱动浏览器打开淘宝,然后用find_element_by_id()
方法获取输入框,然后用send_keys()
方法输入iPhone文字,等待一秒后再用find_element_by_class_name()
方法获取搜索按钮,最后调用click()
方法完成搜索动作。
更多的交互函数的调用参见官方文档:selenium_api
selenium实现模拟登陆
selenium在实现模拟登录时,常见的做法是在网站主页找到用户名和密码的输入框,然后分别输入用户名和密码,再点击登录,完成上述的过程就可获得一个cookies,可以将该cookies保存下来从而避免重复上述过程、减少登录时间。示例代码如下:
# .....在网页上找到相应输入框
# user_input =
# pass_input =
# login_button =
user_input.send_keys(account)
pass_input.send_keys(password)
login_button.click()
cookies = driver.get_cookies()
# 接下来保留cookies.....