爬虫:12306模拟登陆
步骤一:获取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模拟登陆相关推荐
- 湖南工业大学教务系统爬虫(模拟登陆篇)
湖南工业大学教务系统爬虫(模拟登陆篇) 之前写了一个教务系统的爬虫程序,可以根据用户要求爬取任何一部分的数据,也可以模拟提交数据,可能这也是部分工大计算机学生比较感兴趣的,所以今天就在这分享一下整个的 ...
- Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】
登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://kyfw.12306.cn/otn/resources/login.html 实现目标:模拟登陆中国铁路12306,攻 ...
- socket模拟http的登陆_Python网络爬虫之模拟登陆 !
为什么要模拟登陆? Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面. 保存用户信息 ...
- Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】
登陆时间:2019-10-21 实现难度:★★★☆☆☆ 请求链接:https://passport.bilibili.com/login 实现目标:模拟登陆哔哩哔哩,攻克滑动验证码 涉及知识:滑动验证 ...
- 豆瓣网络爬虫-java网络爬虫[验证码模拟登陆]详细介绍
目录 抓包介绍 解决验证码的思路 验证码地址拼接 爬虫实战 爬虫架构 model main 解析htmlparse 数据库操作程序db 近期,有人将本人博客,复制下来,直接上传到百度文库等平台. 本文 ...
- pc端客户端爬虫_爬虫微博模拟登陆-从移动端到PC端
爬虫登陆微博,相信是诸多爬虫爱好者必须跨过得一道坎.这不,这几天我也在研究如何能够快速而简洁得实现登陆功能. 当然,前期工作一定要做好,我先google + 百度了一把市面上的微博登陆教程,发现基本上 ...
- Python爬虫之模拟登陆
女神找我倾诉,实验室实验选不上,刚出来就被秒了,让我帮她选实验,我想我这万年单身的手速估计还是抢不过我这些师兄们,干脆写一个脚本吧,这样以后女神就找我选实验了,废话少说,切入主题,看这篇教程首先得保证 ...
- Python网络爬虫之模拟登陆
为什么要模拟登陆 Python网络爬虫应用十分广泛,但是有些网页需要用户登陆后才能获取到信息,所以我们的爬虫需要模拟用户的登陆行为,在登陆以后保存登陆信息,以便浏览该页面下的其他页面. 保存用户信息 ...
- python爬虫怎么登录_Python爬虫基础-模拟登陆
为什么我们要让爬虫模拟登陆呢?有些内容只有登陆才能进行爬取,如知乎,不登录的主页只能看到注册和登陆 : 你想爬取自己的个人信息 有什么方法呢?cookie 在互联网发展的早期,由于大家的服务器都不是太 ...
- 12306模拟登陆Python3.x+cookiejar+request
代码传到GitHub上了链接 https://github.com/MrYHM/python-12306 这里就不展示了,只讲一讲思路. 1.cookie的处理 其实urllib在open函数内部创建 ...
最新文章
- java neo4j rest api_Neo4j REST API使用教程
- ios view添加上边框_iOS开发之如何给View添加指定位置的边框线详解
- es6中class类的全方面理解(三)------静态方法
- Session History 属性和方法
- nodejs redis 发布订阅_「赵强老师」Redis的消息发布与订阅
- Docker批量拉取和推送的Linux Shell脚本
- div+css布局实现个人网页设计(HTML期末作业)
- PS小知识(一)——建立不透明度:蒙版
- 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )
- 比较实型变量d是否为0为什么不能用d==0来表示
- python爬取网页数据出现中文乱码解决办法
- 基于腾讯人口迁徙数据的全国城市网络结构特征分析
- java中axis是什么意思_如何理解Axis?
- API文档,已取消到该网页的导航
- 裸机服务器装系统步骤,服务器裸机安装操作系统
- PYQT5 QGridLayout及setRowStretch、setColumnStretch用法简探
- 万字综述!命名实体识别(NER)的过去和现在
- Windows Installer无法启动或不见了的解决方法
- 华虹半导体冲刺科创板上市:简称为华虹宏力,拟募资180亿元
- 洛谷P1868 饥饿的奶牛 题解
热门文章
- linux系统下shell命令使用通配符批量创建文件或目录
- SQL BETWEEN 操作符
- 美国金融学博士项目和申请介绍
- springboot项目访问首页时返回jsp源码
- MongoDB-查询语句中$exists以及结合$ne、$nin、$nor、$not使用介绍
- 墨者学院12 命令注入执行分析
- 猫耳宝贝:“网络打女”身手不凡
- 软件测试(手工)方法汇总
- 2022年年货节买什么好?2022年数码类好物推荐
- 剑指offer编程试题Java实现--45.扑克牌顺子