首先下载selenium模块,pip install selenium,下载一个浏览器驱动程序(我这里使用谷歌)。

#需要用到的所有包
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from lxml import etree

首先实现登陆去哪儿网,这部分没什么难点,需要注意的是一个滑块验证

我们可以定位小滑块和滑动轨道,通过location和size方法获取他们位置和宽度高度,用法如下

huakuai = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[5]/div/div/div[3]/div[3]')
huakuai_left_right = huakuai.location
huakuai_height_widtht = huakuai.size
# print(huakuai_left_right,huakuai_height_widtht)
guidao = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[5]/div/div/div[3]/div[2]')
guidao_left_rihgt = guidao.location
guigao_height_widtht = guidao.size
# print(guidao_left_rihgt,guigao_height_widtht)
length = guigao_height_widtht['width'] - huakuai_height_widtht['width']

以字典形式返回

#需要滑行的长度就可以算出来(实际长度需要加上左右边框各1)
length=guigao_height_widtht['width']-huakuai_height_widtht['width']
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from lxml import etreeaa = input('出发地址:')
bb = input('目的地:')
cc = input('出发日期(注意格式例如 2022-03-28):')
# 无头浏览器
from selenium.webdriver import ChromeOptionsoption = ChromeOptions()
option.add_argument('--headless')
option.add_argument('--disable-gpu')
s = Service("chromedriver.exe")
browser = webdriver.Chrome(service=s, options=option)
# browser = webdriver.Chrome(service=s)
# 规避检测
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""
})
browser.get('https://user.qunar.com/passport/login.jsp?ret=https%3A%2F%2Fwww.qunar.com%2F%3Fex_track%3Dauto_4e0d874a')
browser.maximize_window()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[1]/div[2]').click()
sleep(1)
username = browser.find_element(By.ID, 'username')
password = browser.find_element(By.ID, 'password')
sleep(1)
username.send_keys('账号')
sleep(1)
password.send_keys('密码')
sleep(1)
browser.find_element(By.XPATH, '//*[@id="agreement"]').click()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[3]').click()
sleep(1)
huakuai = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[5]/div/div/div[3]/div[3]')
huakuai_left_right = huakuai.location
huakuai_height_widtht = huakuai.size
# print(huakuai_left_right,huakuai_height_widtht)
guidao = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[5]/div/div/div[3]/div[2]')
guidao_left_rihgt = guidao.location
guigao_height_widtht = guidao.size
# print(guidao_left_rihgt,guigao_height_widtht)
length = guigao_height_widtht['width'] - huakuai_height_widtht['width']
# 动作连实例化,破解滑块验证码
action = ActionChains(browser)
# 点击长按指定的标签
action.click_and_hold(huakuai)
action.move_by_offset(length + 2, 0).perform()
# perform()立即执行动作连操作
# 释放动作链
action.release().perform()
sleep(1)

以上就是实现模拟登陆的代码,接下来实现爬取火车票数据,大致步骤如图

需要注意的是,我们在传递出发地址之后,需要模拟点击搜索的第一个地址(目的地同理)

日期默认是后一天的日期,我们则需要删除默认日期在传递我们想要的日期,这里要用selenium中的键盘事件,导入Keys类,下面是常用的键盘事件

Keys.BACK_SPACE # 回退键
(BackSpace)Keys.TAB# 制表键
(Tab)Keys.ENTER# 回车键
(Enter)Keys.SHIFT# 大小写转换键
(Shift)Keys.CONTROL# Control键
(Ctrl)Keys.ALT# ALT键
(Alt)Keys.ESCAPE # 返回键
(Esc)Keys.SPACE # 空格键
(Space)Keys.PAGE_UP# 翻页键上
(Page Up)Keys.PAGE_DOWN # 翻页键下
(Page Down)Keys.END# 行尾键
(End)Keys.HOME# 行首键(Home)

具体步骤实现:

browser.find_element(By.XPATH, '//*[@id="js_nva_cgy"]/li[3]/a').click()
sleep(2)
browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[1]/div/div/input').send_keys(aa)
sleep(1)
browser.find_element(By.XPATH,'//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[1]/div/div/div[5]/div/table/tbody/tr[1]').click()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[2]/div/div/input').send_keys(bb)
sleep(1)
browser.find_element(By.XPATH,'//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[2]/div/div/div[5]/div/table/tbody/tr[1]').click()
sleep(1)
ff = browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[1]/div[2]/div/div/div[1]/input')
for i in range(10):ff.send_keys(Keys.BACK_SPACE)
ff.send_keys(cc)
ff.click()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[2]/div/span/button').click()
sleep(1)div/span/button').click()sleep(1)

至此得到搜索结果 如图

然后对此页面爬取相关信息,我只做了车次,出发时间和运行时间的抓取,其他数据原理也一样

具体分析:

我们可以发现每辆车的相关信息都在一个li标签内,首先获得所有的li标签,然后使用循环遍历对每一个li标签,同时进行存储与打印输出。

append()方法用在列表中,Python文件的write()方法将str写入文件,列表不行

page = browser.page_source
tree = etree.HTML(page)
li = tree.xpath('//*[@id="list_listInfo"]/ul[2]/li')
n = 0
fp = open('./火车票数据', 'w', encoding='utf-8')
for i in li:n = n + 1all_data = []c = i.xpath('.//div/div[1]/h3/text()')all_data.append(c[0])l = i.xpath('.//div/div[3]/time[1]/text()')all_data.append(l[0])d = i.xpath('.//div/div[4]/time/text()')all_data.append(d[0])all_data = str(all_data)fp.write(all_data + '\n')print("第{}趟列车{} 出发时间为{} 运行时间为{}".format(n, c[0], l[0], d[0]))
browser.save_screenshot('./火车票.png')

最终效果

完整代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from lxml import etreeaa = input('出发地址:')
bb = input('目的地:')
cc = input('出发日期(注意格式例如 2022-03-28):')
# 无头浏览器
from selenium.webdriver import ChromeOptionsoption = ChromeOptions()
option.add_argument('--headless')
option.add_argument('--disable-gpu')
s = Service("chromedriver.exe")
browser = webdriver.Chrome(service=s, options=option)
# browser = webdriver.Chrome(service=s)
# 规避检测
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""
})
browser.get('https://user.qunar.com/passport/login.jsp?ret=https%3A%2F%2Fwww.qunar.com%2F%3Fex_track%3Dauto_4e0d874a')
browser.maximize_window()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[1]/div[2]').click()
sleep(1)
username = browser.find_element(By.ID, 'username')
password = browser.find_element(By.ID, 'password')
sleep(1)
username.send_keys('账号')
sleep(1)
password.send_keys('密码')
sleep(1)
browser.find_element(By.XPATH, '//*[@id="agreement"]').click()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[3]').click()
sleep(1)
huakuai = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[5]/div/div/div[3]/div[3]')
huakuai_left_right = huakuai.location
huakuai_height_widtht = huakuai.size
# print(huakuai_left_right,huakuai_height_widtht)
guidao = browser.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div[5]/div/div/div[3]/div[2]')
guidao_left_rihgt = guidao.location
guigao_height_widtht = guidao.size
# print(guidao_left_rihgt,guigao_height_widtht)
length = guigao_height_widtht['width'] - huakuai_height_widtht['width']
# 动作连实例化,破解滑块验证码
action = ActionChains(browser)
# 点击长按指定的标签
action.click_and_hold(huakuai)
action.move_by_offset(length + 2, 0).perform()
# perform()立即执行动作连操作
# 释放动作链
action.release().perform()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="js_nva_cgy"]/li[3]/a').click()
sleep(2)
browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[1]/div/div/input').send_keys(aa)
sleep(1)
browser.find_element(By.XPATH,'//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[1]/div/div/div[5]/div/table/tbody/tr[1]').click()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[2]/div/div/input').send_keys(bb)
sleep(1)
browser.find_element(By.XPATH,'//*[@id="js-con"]/div[1]/form/div[1]/div[1]/div[2]/div/div/div[5]/div/table/tbody/tr[1]').click()
sleep(1)
ff = browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[1]/div[2]/div/div/div[1]/input')
for i in range(10):ff.send_keys(Keys.BACK_SPACE)
ff.send_keys(cc)
ff.click()
sleep(1)
browser.find_element(By.XPATH, '//*[@id="js-con"]/div[1]/form/div[2]/div/span/button').click()
sleep(1)
page = browser.page_source
tree = etree.HTML(page)
li = tree.xpath('//*[@id="list_listInfo"]/ul[2]/li')
n = 0
fp = open('./火车票数据', 'w', encoding='utf-8')
for i in li:n = n + 1all_data = []c = i.xpath('.//div/div[1]/h3/text()')all_data.append(c[0])l = i.xpath('.//div/div[3]/time[1]/text()')all_data.append(l[0])d = i.xpath('.//div/div[4]/time/text()')all_data.append(d[0])all_data = str(all_data)fp.write(all_data + '\n')print("第{}趟列车{} 出发时间为{} 运行时间为{}".format(n, c[0], l[0], d[0]))
browser.save_screenshot('./火车票.png')

selenium 实战模拟登陆相关推荐

  1. Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

    登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://kyfw.12306.cn/otn/resources/login.html 实现目标:模拟登陆中国铁路12306,攻 ...

  2. Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】

    登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://passport.bilibili.com/login 实现目标:模拟登陆哔哩哔哩,攻克滑动验证码 涉及知识:滑动验证 ...

  3. 教程 | Python实战 模拟登陆百度云盘

    今天我给大家讲讲如何模拟登陆百度云盘(该分析过程也适用于百度别的产品,比如模拟登陆百度搜索首页,它们的加密流程完全一样,只是提交参数有微小差别). 阅读文章之前,有一些东西需要给大家阐述: 本文并没有 ...

  4. php selenium模拟登陆,12306 的selenium实现模拟登陆

    # 下面是12306 实现的模拟登陆 # 解码 应用超级鹰,注册用户,左侧栏软件ID进去,开启一个新软件,拿到软件ID # 下面测试都在jupyter里面实现 # 超级鹰类 cell import r ...

  5. python项目实战:模拟登陆CSDN

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练 ...

  6. Python Selenium + phantomJS 模拟登陆教务管理系统 “抢课”

    # _*_coding:utf-8_*_ from selenium import webdriver from selenium.webdriver.common.action_chains imp ...

  7. selenium免登录Java_使用selenium+java模拟登陆今日头条时需要手机验证码登陆,第二次怎么免输入信息登陆?...

    首次通过手机验证码登录后,获取cookie,并将cookie保存到map中. 在主程序中定义map: public static Map cookies; public static boolean ...

  8. 利用selenium+chrome模拟登陆合工大信息门户并进行自动填写测评

    最近学校要填写对于老师的评教,不填写的就无法进行下周的选课∑^)/ 我这么懒,自然不想一个一个点进去填写,想到最近在学爬虫,干脆写一个爬虫帮我弄算了 ╭~~~╮ (o~.~o) 首先打开我们学校的信息 ...

  9. 爬虫实战3:模拟登陆知乎并爬取任意帖子数据

    ​      刚学爬虫时,看到一篇文章硬核破解知乎登陆,心潮澎湃,真男人!符合我的胃口!哼哧哼哧的立刻安排!   (半个小时过后)   似乎我是弱智?很多看不懂?(百度乱搜中-)恩还有种简单的?sel ...

最新文章

  1. 附带数据库的应用程序
  2. WPF之坑——ICommandSource与RoutedUICommand
  3. win7 一些快捷系统工具命令
  4. python调用其他程序或脚本方法(转)
  5. 中关村windows11 32位专业版镜像v2021.07
  6. 跳频通信(梅文华)pdf
  7. 面试小题,传入6返回9,传入9返回6
  8. js文件之间函数的调用
  9. 2021年中国银行业金融机构普惠型小微企业贷款情况分析:贷款余额不断增加,增速也不断下降[图]
  10. 学习笔记之RecyclerView
  11. 【NeurIPS 2019】Yoshua Bengio报告:深度学习系统从1代到2代,未来将朝何处发展?
  12. 若有以下定义和语句:double r=99, *p=r;*p=r; 则以下正确的叙述是 A) 以下两处的*p含义相同,都说明给指针变量p赋值 B) 在“double r=99, *p=r;“中,
  13. 浙江工业大学计算机专业是几本,浙江工业大学是几本
  14. 查杀IPZ2.EXE病毒实战
  15. SpringBoot中MybatisX插件的简单使用教程(超详细!!)
  16. 如何通过频率计算波特率
  17. t3提示本地系统高于服务器,登录T3软件时,提示本地版本高于服务器已升级版本...
  18. 盘点76个当下全球免费、优质机器学习数据集获取资源
  19. JS练习之鼠标经过切换图片
  20. 洛谷B2015计算并联电阻的阻值

热门文章

  1. 文本相关_SAP刘梦_新浪博客
  2. 【集训队作业2018】青春猪头少年不会梦到兔女郎学姐(容斥)(分治FFT)
  3. JSOI2019招待
  4. Flutter 动画篇
  5. 医院如何实施WiFi建设方案
  6. Html5禁止浏览器后退,多页面网站禁用浏览器后退键
  7. 不小心删了自己的注册表怎么办
  8. php printer.dll扩展,php_printer.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  9. Qt Assistant介绍
  10. linux查看hbase集群状态,hbase 集群部署