步骤一:获取12306登陆页面并输入账号和密码

from selenium import webdriver
from lxml import etree
from time import sleep
from PIL import Image
import requests
from selenium.webdriver import ActionChains
from hashlib import md5
#封装超级鹰打码识别函数
#executable_path输入谷歌驱动的位置
bro = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
#浏览器全屏
bro.maximize_window()
#12306登陆首页
bro.get('https://kyfw.12306.cn/otn/resources/login.html')
sleep(1)
#选择"账号登陆"并点击
a_tag = bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
a_tag.click()
#定位账号和密码的位置,并在'xxx'部分输入对应的账号和密码
bro.find_element_by_id('J-userName').send_keys('xxx')
sleep(2)
bro.find_element_by_id('J-password').send_keys('xxx')
sleep(2)

步骤二:验证码识别

本文借助超级鹰平台进行12306验证码的识别,使用步骤如下:

1. 注册并登陆超级鹰账号(https://www.chaojiying.com/about.html);

2. 用户中心购买题分(关注超级鹰微信公众号可获取1000题分);

3. 点击用户中心-软件ID生成ID(代码中需要用);

4. 下载开发文档——选择python语言——下载示例代码如下,封装为Chaojiying_Client()函数。

class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernameself.password = md5(password.encode('utf-8')).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()

首先对12306登陆首页全屏截图,再定位到验证码图片,借助超级鹰进行识别。注意到12306验证码比较复杂,可以根据超级鹰价格体系中可以选取对应的验证码类型,本文选择9004。

#save_screenshot:全屏截屏
bro.save_screenshot('all.png')
sleep(1)
#定位验证码图片位置并截图
img = bro.find_element_by_xpath('//*[@id="J-loginImg"]')
img.screenshot('./code.png')
#将验证码图片提交给超级鹰进行识别
chaojiying = Chaojiying_Client('mhfang9893', '18725538188v', '912704')
im = open('./code.png', 'rb').read()
#id = chaojiying.PostPic(im,9004)['pic_id']
#获取到验证码图片的相对位置
result = chaojiying.PostPic(im, 9004)['pic_str']

result返回值类似:240,68|121,84。下面我们需要对坐标进行分割存储到列表中,类似:[[240,68],[128,84]]。同时注意到这个坐标是相对坐标,所以需要使用动作链ActionChains.move_to_element_with_offset进行相对位置的定位,再选中正确答案。

all_list = []
#有两个及以上坐标
if '|' in result:list_item = result.split('|')count = len(list_item)for i in range(count):x_y = []x = int(list_item[i].split(',')[0])y = int(list_item[i].split(',')[1])x_y.append(x)x_y.append(y)all_list.append(x_y)
#只有一个坐标
else:x_y = []x = int(result.split(',')[0])y = int(result.split(',')[1])x_y.append(x)x_y.append(y)all_list.append(x_y)
print(all_list)
for l in all_list:x = l[0]y = l[1]#选中对应答案ActionChains(bro).move_to_element_with_offset(img,x,y).click().perform()sleep(0.5)

步骤三:点击登陆按钮

bro.find_element_by_xpath('//*[@id="J-login"]').click()
sleep(3)

步骤四:处理滑块验证

while True:try:info=bro.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span').textprint(info)if info=='哎呀,出错了,点击刷新再来一次':#点击刷新bro.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span/a').click()time.sleep(0.5)#重新移动滑块span = bro.find_element_by_xpath('//*[@id="nc_1_n1z"]')action = ActionChains(bro)# 点击长按指定的标签action.click_and_hold(span).perform()action.drag_and_drop_by_offset(span, 400, 0).perform()time.sleep(7)except:print('ok!')breaksleep(8)
#关闭浏览器
bro.quit()

爬虫:12306模拟登陆相关推荐

  1. 湖南工业大学教务系统爬虫(模拟登陆篇)

    湖南工业大学教务系统爬虫(模拟登陆篇) 之前写了一个教务系统的爬虫程序,可以根据用户要求爬取任何一部分的数据,也可以模拟提交数据,可能这也是部分工大计算机学生比较感兴趣的,所以今天就在这分享一下整个的 ...

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

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

  3. socket模拟http的登陆_Python网络爬虫之模拟登陆 !

    为什么要模拟登陆? Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面. 保存用户信息 ...

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

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

  5. 豆瓣网络爬虫-java网络爬虫[验证码模拟登陆]详细介绍

    目录 抓包介绍 解决验证码的思路 验证码地址拼接 爬虫实战 爬虫架构 model main 解析htmlparse 数据库操作程序db 近期,有人将本人博客,复制下来,直接上传到百度文库等平台. 本文 ...

  6. pc端客户端爬虫_爬虫微博模拟登陆-从移动端到PC端

    爬虫登陆微博,相信是诸多爬虫爱好者必须跨过得一道坎.这不,这几天我也在研究如何能够快速而简洁得实现登陆功能. 当然,前期工作一定要做好,我先google + 百度了一把市面上的微博登陆教程,发现基本上 ...

  7. Python爬虫之模拟登陆

    女神找我倾诉,实验室实验选不上,刚出来就被秒了,让我帮她选实验,我想我这万年单身的手速估计还是抢不过我这些师兄们,干脆写一个脚本吧,这样以后女神就找我选实验了,废话少说,切入主题,看这篇教程首先得保证 ...

  8. Python网络爬虫之模拟登陆

    为什么要模拟登陆 Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面. 保存用户信息 ...

  9. python爬虫怎么登录_Python爬虫基础-模拟登陆

    为什么我们要让爬虫模拟登陆呢?有些内容只有登陆才能进行爬取,如知乎,不登录的主页只能看到注册和登陆 : 你想爬取自己的个人信息 有什么方法呢?cookie 在互联网发展的早期,由于大家的服务器都不是太 ...

  10. 12306模拟登陆Python3.x+cookiejar+request

    代码传到GitHub上了链接 https://github.com/MrYHM/python-12306 这里就不展示了,只讲一讲思路. 1.cookie的处理 其实urllib在open函数内部创建 ...

最新文章

  1. java neo4j rest api_Neo4j REST API使用教程
  2. ios view添加上边框_iOS开发之如何给View添加指定位置的边框线详解
  3. es6中class类的全方面理解(三)------静态方法
  4. Session History 属性和方法
  5. nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅
  6. Docker批量拉取和推送的Linux Shell脚本
  7. div+css布局实现个人网页设计(HTML期末作业)
  8. PS小知识(一)——建立不透明度:蒙版
  9. 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )
  10. 比较实型变量d是否为0为什么不能用d==0来表示
  11. python爬取网页数据出现中文乱码解决办法
  12. 基于腾讯人口迁徙数据的全国城市网络结构特征分析
  13. java中axis是什么意思_如何理解Axis?
  14. API文档,已取消到该网页的导航
  15. 裸机服务器装系统步骤,服务器裸机安装操作系统
  16. PYQT5 QGridLayout及setRowStretch、setColumnStretch用法简探
  17. 万字综述!命名实体识别(NER)的过去和现在
  18. Windows Installer无法启动或不见了的解决方法
  19. 华虹半导体冲刺科创板上市:简称为华虹宏力,拟募资180亿元
  20. 洛谷P1868 饥饿的奶牛 题解

热门文章

  1. linux系统下shell命令使用通配符批量创建文件或目录
  2. SQL BETWEEN 操作符
  3. 美国金融学博士项目和申请介绍
  4. springboot项目访问首页时返回jsp源码
  5. MongoDB-查询语句中$exists以及结合$ne、$nin、$nor、$not使用介绍
  6. 墨者学院12 命令注入执行分析
  7. 猫耳宝贝:“网络打女”身手不凡
  8. 软件测试(手工)方法汇总
  9. 2022年年货节买什么好?2022年数码类好物推荐
  10. 剑指offer编程试题Java实现--45.扑克牌顺子