实现爬虫的模拟登录(二)

Python实现模拟登录的三种方法

上面一篇介绍了用户登录账号涉及到的过程,接下来将对模拟登录常用的方法进行总结和叙述。常用的方法如下:

  • 添加 Cookies 方法:这是最简单的一种方法,先手动在网站上登录自己的账号然后用这种方法获取到的 Cookies 加入 Headers 中,最后用 GET 方法请求登录。
  • POST 请求方法:该方法首先需要仔细分析针对某网站的登录过程,然后从该过程中获取登录的 URL;之后,通过Form Data(表单数据) 和 Headers(请求头部)分析得出各个参数(用户名、密码、token等);由以上两步,我们就可以构造data(post到服务器的data)和headers用爬虫程序重新请求、登录。
  • Selenium 模拟登录:代替手工操作,自动完成账号和密码的输入,简单但速度比较慢。

下面将对后两种方法进行介绍。

目录

Python实现模拟登录的三种方法

POST方法

Selenium方法

环境配置

基本使用

selenium实现模拟登陆


POST方法

参见[Python3网络爬虫开发实战] 10.1-模拟登录并爬取 GitHub

Selenium方法

环境配置

Selenium安装

1.相关链接

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:

-相关链接

在进行第二部之前请确保已经正确安装好了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.....

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值