内容目录

1.引入Selenium

Selenium(本文基于python3.8)是一个功能强大的自动化测试工具,它可以用于模拟用户在浏览器中的行为,比如点击、输入、滚动等等,也可用于模拟登录网站并进行爬虫操作。本教程将详细介绍如何使用Python编写一个模拟登录地爬虫,使用XPath等多种元素匹配方法。

在开始之前,需要先安装Selenium库。你可以使用以下命令来安装:

pip install selenium

selenium

2.启动浏览器

接下来,我们需要下载并安装Chrome浏览器(你也可以使用其它浏览器)以及对应的ChromeDriver。你可以在Chrome官方网站上下载最新的Chrome浏览器,并确保下载与你的Chrome浏览器版本相匹配的ChromeDriver。安装完成后,将ChromeDriver的路径添加到系统环境变量中。

首先,我们需要导入所需的库:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

接下来,我们需要创建一个WebDriver对象,这将启动Chrome浏览器:

driver = webdriver.Chrome()

3.模拟登录网站

现在,我们可以使用WebDriver对象打开我们要模拟登录的网站:

driver.get("https://example.com")

接下来,我们需要找到登录表单的元素,并输入用户名和密码。我们可以使用Chrome浏览器的开发者工具来查找这些元素的XPath路径。

例如,如果我们要找到用户名输入框的XPath路径,我们可以使用以下代码:

username_input = driver.find_element(By.XPATH, "//input[@name='username']")

然后,我们可以使用以下代码将用户名输入到输入框中:

username_input.send_keys("your_username")

同样的方式,我们可以找到密码输入框的XPath路径,并输入密码:

password_input = driver.find_element(By.XPATH, "//input[@name='password']")
password_input.send_keys("your_password")

现在,我们可以找到登录按钮的XPath路径,并点击它:

login_button = driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()

在点击登录按钮后,网站将进行登录验证。为了确保登录成功,我们可以使用WebDriverWait来等待特定元素加载完成。例如,我们可以等待页面上的用户信息元素加载完成:

user_info = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='user-info']"))
)

现在,我们已经成功模拟登录并等待特定元素加载完成。我们可以使用WebDriver对象进行进一步的爬虫操作,例如抓取页面上的数据或点击其他链接。

最后,我们需要关闭WebDriver对象,以确保浏览器窗口被正确关闭:

driver.quit()

4.Selenium实战某宝

本来想利用selenium实现模拟登录国内某购物网站,结果某宝实在有点强,最终还是没能登录成功。【说明淘宝够安全啊】

当然网上也查了点资料,有说用fiddler抓包工具将登录页js替换的,这样淘宝登录的滑块便不会出现,不确定此类方法是否有效,但操作复杂度,肯定是嘎嘎高的。
还有一种方式就是通过微博登录,绑定淘宝。这种似乎可行。

在本示例中,仅在代码实现上,尽可能避免大型网站的对爬虫的检测。具体请看代码注释:
模拟登录

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

# 登录网站
login_url = f'https://login.taobao.com/member/login.jhtml'
login_username = 'xxxxxxxxxxxx'
login_password = 'xxxxxxxxxxxxxxxxxx'

# 防止打开浏览器后闪退
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
#options.add_argument('--headless')  # 无头模式
# 设置为开发者模式,防止被各大网站识别出来使用了Selenium
options.add_experimental_option('excludeSwitches', ['enable-automation'])

browser = webdriver.Chrome(options=options)
browser.get(login_url)
# 设置window.navigator.webdriver,希望能绕过滑块验证
browser.execute_script('Object.defineProperties(navigator,{webdriver:{get:()=>false}})')
# 查找用户名和密码输入框所在元素
username_input = browser.find_element(By.ID, 'fm-login-id')
username_input.click()
username_input.send_keys(login_username)
# 等待
time.sleep(2)

password_input = browser.find_element(By.XPATH, "//input[@name='fm-login-password']")
password_input.click()
password_input.send_keys(login_password)

time.sleep(2)
# 滑块处理

browser.switch_to.frame('baxia-dialog-content')
slider = browser.find_element(by=By.XPATH, value='//*[@id="nc_1_n1z"]')

slider_block = browser.find_element(by=By.XPATH, value='//*[@id="nc_1__scale_text"]')

chains = ActionChains(browser)
chains.drag_and_drop_by_offset(slider, slider_block.size['width'], -slider_block.size['height'])
chains.perform()
time.sleep(2)

# 查找按钮元素,模拟点击
#点击登录按钮
browser.find_element(By.XPATH, ".//*[@id='login-form']/div[4]/button").click()
browser.implicitly_wait(10)

# 关闭浏览器
browser.close()
browser.quit()

在上述代码中,我们通过webdriver.Chrome(options=options) 来创建一个浏览器窗口实例,并通过传入options来控制浏览器的各个属性,其中options.add_experimental_option('detach', True)用于防止浏览器在执行完后闪退。options.add_argument('--headless') 表明启用了无头模式。这样做是为了在后台运行浏览器,而不需要显示浏览器窗口。随后我们使用了find_element来定位元素,并使用send_keys方法输入账户名及密码。

在Selenium中,可以使用各种方法来定位网页上的元素。旧版本selenium 中,使用的是find_element_by_xpath, find_element_by_id,
find_element_by_name等,在新版中已经修改为 find_element(By.ID, 'id')等,通过传入By参数查找。用的比较多的还是XPath,下表列出了部分XPath最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

OOPS:获取XPath有个最简单的方式,就是打开浏览器审查元素,选中元素,右键Copy,你,学废了吗?:smile::smile::smile:
获取XPath

有些网站的元素并不能直接通过find寻找到,比如有些网站页面用了大量的frame或iframe,那么此时需要先进入到该元素所在的frame,然后才能找到需要的元素:browser.switch_to.frame('baxia-dialog-content')

有时候浏览器的加载速度跟不上你代码的运行速度,或者请求速度比较慢,可以使用暂停的方法来进行缓冲:

time.sleep(2)
browse.implicitly_wait(10)

browser.implicitly_wait(10),隐性等待设置了一个时间,在一段时间内网页是否加载完成,如果完成了,就进行下一步;在设置的时间内没有加载完成,则会报超时加载。

time.sleep(2)一般用于模拟人为操作,防止因为点击过快,而触发网站反爬机制。

ai art

5.Cookies模拟登录

Cookies是存储在用户计算机上的小型文本文件,用于跟踪和存储用户在网站上的活动信息。当用户登录网站时,网站会将一个唯一的标识符存储在Cookies中,以便在用户的后续访问中识别用户身份。

此时,浏览器将会模拟点击登录按钮并提交您的登录凭据。如果您的凭据是正确的,您将被成功登录到网站。

有时候,网站会要求保持登录状态,以便在后续访问中保持身份识别。为了实现这一点,我们可以使用以下代码来获取当前浏览器的Cookies:

# 获取当前浏览器的Cookies
cookies = driver.get_cookies()

这样就可以将这些Cookies保存下来,并在以后的访问中使用它们来保持登录状态。但如果没有登录成功,那用Cookies登录也是一场空谈!

6.总结

总结一下,使用Selenium模拟登录是一种强大而灵活的方式,可以帮助开发人员实现各种登录功能。通过使用浏览器驱动程序,访问登录页面,输入凭据并模拟点击登录按钮,我们可以轻松地模拟用户的登录行为。通过XPath等多种元素匹配方法,我们可以轻松地定位并操作网页上的元素。此外,还可以通过获取和保存Cookies保持登录状态,以便在后续的访问中保持身份识别。

上一篇教程:Python爬虫教程:入门爬取网页数据

随着各大网站的反爬机制越来越强大,对于爬虫工程师来说,也是一个不小的挑战。各种反爬策略,如验证码、IP限制、请求频率限制等,都给爬虫工程师带来了不小的困扰。为了解决这些问题,爬虫工程师需要不断地学习和研究新的技术和方法,以提高爬虫的效率和稳定性,并尽可能地避免被网站的反爬机制所限制。

在这个过程中,爬虫工程师除了需要了解Python及各种Web开发技术外,还需要了解各种反爬策略和技术,如验证码识别、IP代理、请求频率控制等,以及各种对抗反爬机制的方法,如模拟登录、验证码绕过等。

最后,爬虫技术是一把双刃剑,爬虫工程师还需要注意道德和法律问题,如尊重网站的使用条款和隐私政策,不进行恶意爬取等。

以上就是使用最新版Selenium进行模拟登录的Python爬虫教程,希望这篇教程能够帮助你入门爬虫,并为你的项目提供帮助。

By liu luli

8年IT行业从业经验,参与、负责过诸多大型项目建设。掌握多门编程语言,对Java、Python编程有较为深刻的理解。现为杭州某公司开发负责人。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注