python3.7爬虫:使用Selenium带Cookie登录并且模拟进行表单上传文件

前文再续,书接上一回,之前一篇文章我们尝试用百度api智能识别在线验证码进行模拟登录:Python3.7爬虫:实时api(百度ai)检测验证码模拟登录(Selenium)页面,这回老板又发话了,编辑利用脚本虽然登录成功了,但是有一些表单还是得手动上传,希望能改造成自动化流程。说实话,没毛病,机器能干的事,就没必要麻烦人了,拿人钱财,替人办事,开干。

首先理清思路,没必要每次登录都去实时监测识别登录页面的验证码,而是反过来想,当我们登录成功了,必然在cookie里留下标识符比如token之类的,那么我们直接带着这些cookie去请求页面,就可以在cookie有效期内随时登录这个系统了:https://www.dianxiaomi.com/package/toAdd.htm

登录成功后,将cookie写入本地文件

#登录按钮  
driver.find_element_by_id('loginBtn').click()  
  
  
time.sleep(5)  
#写入cookie  
cookie = driver.get_cookies()  
print(cookie)  
jsonCookies = json.dumps(cookie)  
with open('mycookie.json', 'w') as f:  
    f.write(jsonCookies)  
  
driver.close()

该网站的完整客户端cookie是下面这样的:

[{"domain": "www.dianxiaomi.com", "httpOnly": true, "name": "JSESSIONID", "path": "/", "secure": true, "value": "CF9D26CDE18C5E64D526A27E15A3C912"}, {"domain": "www.dianxiaomi.com", "expiry": 1614916412.601984, "httpOnly": true, "name": "dxm_s", "path": "/", "secure": false, "value": "i1ANvJM8Z1E09EI9GpL3EK9YrG86wCOxjxDNlSsYx8w"}, {"domain": "www.dianxiaomi.com", "expiry": 1614916412.601953, "httpOnly": true, "name": "dxm_t", "path": "/", "secure": false, "value": "MTU4MzgxMjQwMyFkRDB4TlRnek9ERXlOREF6ITIyZmY2NmQwYzI4N2Q2NTAyMWMyODI0NTZiZjAyY2Vi"}, {"domain": ".dianxiaomi.com", "httpOnly": false, "name": "Hm_lpvt_f8001a3f3d9bf5923f780580eb550c0b", "path": "/", "secure": false, "value": "1583812417"}, {"domain": "www.dianxiaomi.com", "expiry": 1614916412.601937, "httpOnly": true, "name": "dxm_i", "path": "/", "secure": false, "value": "NTcwNzY0IWFUMDFOekEzTmpRITIyMWMyM2ZkOWNlZWM3OGZhZDVhOWVkMjFiNmYyZTE4"}, {"domain": "www.dianxiaomi.com", "expiry": 1614916412.601964, "httpOnly": true, "name": "dxm_c", "path": "/", "secure": false, "value": "OU5TbmdOT1ohWXowNVRsTnVaMDVQV2chM2FkMjJiODc3MjE3MWUwMzI2NWMzODU5MGVkNTFlODk"}, {"domain": "www.dianxiaomi.com", "expiry": 1614916412.601974, "httpOnly": true, "name": "dxm_w", "path": "/", "secure": false, "value": "ZDgwNWNmMTA0YjdmZDQ3NzE4M2I4N2IxOTM3YzA0NDchZHoxa09EQTFZMll4TURSaU4yWmtORGMzTVRnellqZzNZakU1TXpkak1EUTBOdyE1NmZiYjFmNGZmNTNlZjVkNzJiZWNkMDM3Y2ExODNhNA"}, {"domain": ".dianxiaomi.com", "expiry": 1899172409, "httpOnly": false, "name": "_ati", "path": "/", "secure": false, "value": "133580155964"}, {"domain": ".dianxiaomi.com", "expiry": 1615348416, "httpOnly": false, "name": "Hm_lvt_f8001a3f3d9bf5923f780580eb550c0b", "path": "/", "secure": false, "value": "1583812407"}]

东西确实不少,不过也没必要进行深究,能用就行,下面一步操作就是如何利用这些cookie直接进入网站的订单页面

将刚才写好的cookie文件存入变量

str=''  
with open('mycookie.json','r',encoding='utf-8') as f:  
    listCookies=json.loads(f.read())  
cookie = [item["name"] + "=" + item["value"] for item in listCookies]  
cookiestr = '; '.join(item for item in cookie)  
print(listCookies)

这里有个小坑,就是格式一定得是半角分好外加一个半角空格,否则装载的时候会报错

随后将变量中的cookie装载到selenium的头部信息里

driver = webdriver.Chrome()  
driver.get('https://www.dianxiaomi.com/package/toAdd.htm')  
  
  
for cookie in listCookies:  
    if 'expiry' in cookie:  
        del cookie['expiry']  
    driver.add_cookie(cookie)  
  
driver.get('https://www.dianxiaomi.com/package/toAdd.htm')

这里注意两点,就是要先打开页面,装载cookie成功,再次刷新页面,另外cookie里有一个key是不能装载的,就是expiry,所以先行删除,不过我始终认为这是selenium的一个bug,感觉可以提一个issue下个版本改进一下。

可以看到成功免登陆进入了订单页面

当我们准备进行上传文件的时候,发现了一个小问题,就是这个网站上传模块是使用的第三方插件进行的,类似element-ui或者Ant Design这种的,带来的问题就是,传统表单被认为的隐藏了,而众人皆知的是,selenium是无法操作隐藏的元素的。

不过没关系,兵来将挡水来土掩,可以利用js脚本将表单属性手动设定为显示状态

#利用脚本显示元素  
js = "document.getElementById("select_btn_1").style.display='block';"  
# 调用js脚本  
driver.execute_script(js)  
time.sleep(3)

剩下的就好办了,利用xpath点选上传按钮,然后附加上准备好的excel文件

driver.find_element_by_xpath("/html/body/div[18]/div[2]/div[2]/button[1]").click()  
  
driver.find_element_by_id('select_btn_1').send_keys(r'/Users/liuyue/wodfan/work/mytornado/cccc.xlsx')  
  
time.sleep(2)

具体自动化效果是下面这样

完整代码:

import json  
from selenium import webdriver  
import time  
  
   
str=''  
with open('mycookie.json','r',encoding='utf-8') as f:  
    listCookies=json.loads(f.read())  
cookie = [item["name"] + "=" + item["value"] for item in listCookies]  
cookiestr = '; '.join(item for item in cookie)  
print(listCookies)  
  
  
driver = webdriver.Chrome()  
driver.get('https://www.dianxiaomi.com/package/toAdd.htm')  
  
  
for cookie in listCookies:  
    if 'expiry' in cookie:  
        del cookie['expiry']  
    driver.add_cookie(cookie)  
  
driver.get('https://www.dianxiaomi.com/package/toAdd.htm')  
  
driver.find_element_by_class_name("btn-gray").click()  
  
js = "document.getElementById("select_btn_1").style.display='block';"  
# 调用js脚本  
driver.execute_script(js)  
time.sleep(3)  
  
driver.find_element_by_xpath("/html/body/div[18]/div[2]/div[2]/button[1]").click()  
  
driver.find_element_by_id('select_btn_1').send_keys(r'/Users/liuyue/wodfan/work/mytornado/cccc.xlsx')  
  
time.sleep(2)  
  
driver.find_element_by_xpath("/html/body/div[21]/div[2]/div/div[3]/button[1]").click()  
  
  
time.sleep(60)  
driver.close()

结语:不得不说,selenium确实是个好东西,整个自动化上传文件流程就好像丝绸般顺滑,只不过在操作cookie的时候有一些坑,需要注意一下。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 爬虫cookie登陆和表单登陆selenium模拟登陆,两者之间的区别在于,cookie登陆是在爬虫中直接使用cookie来完成登录,而selenium模拟登录则需要自动化测试工具selenium,来模拟用户的浏览器操作,完成登录操作。 ### 回答2: 爬虫中的cookie登陆和表单登陆是两种不同的方式,而selenium模拟登陆则是使用selenium这个自动化测试工具来进行模拟登陆。 cookie登陆是指通过获取并使用网站的cookie模拟用户登陆状态。当用户在网站上进行登陆后,网站会返回一些cookie信息,包括用户的登陆状态等。爬虫程序可以通过获取并使用这些cookie模拟用户登陆状态,从而可以访问需要登陆才能访问的页面或执行一些需要登陆状态才能执行的操作。 表单登陆是指在登陆页面上填写用户名和密码等登陆信息,并提交给服务器进行登陆验证的过程。爬虫程序可以通过模拟用户填写登陆信息,并发送POST请求给服务器,来模拟登陆过程。这种方式需要对登陆页面的HTML结构进行分析,找到对应的表单元素和提交地址等信息。 与cookie登陆和表单登陆相比,selenium模拟登陆更加灵活和方便。selenium是一个自动化测试工具,可以模拟用户在浏览器上的各种操作,包括点击、输入、提交等。使用selenium模拟登陆可以直接打开一个浏览器窗口,并在其中模拟用户的操作,包括填写表单信息和点击登陆按钮等。这种方式比较适合一些动态页面或者需要执行复杂操作的登陆过程。 总的来说,cookie登陆、表单登陆和selenium模拟登陆都是实现爬虫登陆的方式,具体使用哪种方式取决于目标网站的登陆方式和需求的灵活度。 ### 回答3: 爬虫中的cookie登录使用Selenium模拟表单登录是两种常见的方式来实现自动登录功能。 首先,cookie登录是通过获取登录页面的cookie信息,然后将其发送到服务器的方式进行登录。这种方式适用于简单的登录场景,不需要填写复杂的表单字段,只需要加载cookie即可完成登录。其优点是简单快捷,无需加载整个页面和执行JavaScript代码,可以节省时间和资源。但是,cookie登录方式可能会存在安全风险,因为cookie是保存在浏览器中的敏感信息,如果恶意程序获取到cookie信息,就可以伪装成登录状态。 而Selenium模拟表单登录则是通过自动化测试工具Selenium来操作浏览器,模拟用户填写表单字段、点击按钮等操作,完成登录过程。这种方式适用于需要填写复杂的表单字段,或者需要执行JavaScript代码才能完成登录的场景。通过Selenium,我们可以完全模拟用户的操作,比如填写用户名、密码,点击登录按钮等。其优点是灵活可控,可以应对各种复杂的登录场景,但是相对于cookie登录方式,Selenium模拟登录速度较慢,需要加载整个页面和执行JavaScript代码,消耗更多的时间和资源。 总的来说,cookie登录适用于简单的登录场景,速度快,但安全性较低;Selenium模拟表单登录适用于复杂的登录场景,灵活可控,但速度较慢。具体选择哪种方式取决于实际需求和安全考虑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘悦的技术分享

承您打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值