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,你,学废了吗?😄😄😄 获取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爬虫教程,希望这篇教程能够帮助你入门爬虫,并为你的项目提供帮助。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐