python爬虫登录12306失败_Python网络爬虫(selenium模拟登录12306网站)
一、通过selenium自动登录12306官网
1.1 超级鹰打码平台API,创建chaojiyin.py文件
#!/usr/bin/env python#coding:utf-8
importrequestsfrom hashlib importmd5classChaojiying_Client(object):def __init__(self, username, password, soft_id):
self.username=username
password= password.encode('utf8')
self.password=md5(password).hexdigest()
self.soft_id=soft_id
self.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)',
}defPostPic(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)returnr.json()defReportError(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()
chaojiying.py
1.2 模拟登录12306:
from selenium importwebdriverfrom selenium.webdriver importActionChainsfrom time importsleepfrom day10620190807.chaojiying importChaojiying_Clientfrom PIL importImage#返回验证码对应的数据
defgetCode(imgPath, imgType):
chaojiying= Chaojiying_Client('用户名', '密码', '900925') #用户中心>>软件ID 生成一个替换 96001
im = open(imgPath, 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
return chaojiying.PostPic(im, imgType)['pic_str']
dri= webdriver.Chrome(executable_path="chromedriver.exe")#12306官网url
url = "https://kyfw.12306.cn/otn/login/init"
#打开12306官网
dri.get(url)
sleep(2)#截取当前屏幕,并保存为main.png
dri.save_screenshot("main.png")#定位到验证码图片
code_img = dri.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')#获取验证码左上角位置
location_position =code_img.locationprint('location:', location_position)#获取图片的尺寸
img_size =code_img.sizeprint('size:', img_size)#定制好截取图片的尺寸(电脑分辨率必须为100%等比缩放)
rangle = (int(location_position["x"]), int(location_position["y"]),
int((location_position["x"] + img_size["width"])),
int((location_position["y"] + img_size["height"])))#打卡main.png这张图片
i = Image.open("main.png")#创建截图图片名称
code_img_name = "code.png"
#按指定尺寸截取
frame =i.crop(rangle)#保存截取的图片
frame.save(code_img_name)#通过截图的图片,通过验证码API接口对图片识别
result = getCode("code.png", 9004)## 返回验证码的坐标对象
print("result:", result)#创建坐标数据结构
all_list =[]if '|' inresult:
list_1= result.split('|')
count_1=len(list_1)for i inrange(count_1):
xy_list=[]
x= int(list_1[i].split(',')[0])
y= int(list_1[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)else:
x= int(result.split(',')[0])
y= int(result.split(',')[1])
xy_list=[]
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)print(all_list)#移动光标进行点击验证码, 动作链移动光标
for lis inall_list:
x=lis[0]
y= lis[1]#实例化动作链并立即执行移动操作
ActionChains(dri).move_to_element_with_offset(code_img, x, y).click().perform()
sleep(0.5)#获取到输入框 用户名
dri.find_element_by_id('username').send_keys('150236xxx8')
sleep(1)#获取到输入框 密码
dri.find_element_by_id('password').send_keys('xxx')
sleep(1)#点击登录
dri.find_element_by_id('loginSub').click()
sleep(3)
page_text=dri.page_source
with open("12306.html", "w", encoding="utf-8") as fp:
fp.write(page_text)
sleep(3)#退出浏览器
dri.quit()
二、python+selenium使用location定位元素坐标偏差处理
使用xpath定位元素,用.location获取坐标值,出现较大的偏差原因和解决方法如下:
使用定位截图时出现这个问题的,之所以会出现这个坐标偏差是因为电脑上设置的显示缩放比例造成的,location获取的坐标是按显示100%时得到的坐标,而截图所使用的坐标却是需要根据显示缩放比例缩放后对应的图片所确定的,因此就出现了偏差。
解决这个问题有三种方法:
① 修改电脑显示设置为100%。这是最简单的方法。
② 缩放截取到的页面图片,即将截图的size缩放为宽和高都除以缩放比例后的大小(应该需要将缩放后的宽和高转化为int型)
③ 修改Image.crop的参数,将参数元组的四个值都乘以缩放比例(应该也需要转化为int型)
以上代码处理方式:②③结合即可
#以当前电脑125%缩放比为例
rangle = (int(location_position["x"]*1.25), int(location_position["y"]*1.25),
int((location_position["x"] + img_size["width"])*1.25),
int((location_position["y"] + img_size["height"])*1.25))#动作链作移动定位时,需要等比缩小25%即可
for lis inall_list:
x= lis[0]*0.85y= lis[1]*0.85
#实例化动作链并立即执行移动操作
ActionChains(dri).move_to_element_with_offset(code_img, x, y).click().perform()
sleep(0.5)
python爬虫登录12306失败_Python网络爬虫(selenium模拟登录12306网站)相关推荐
- python 爬虫解决登录验证问题_python网络爬虫的简单实践——解决无验证模拟登陆问题...
正文开始以前先唠叨几句,一直以来都是自己在网络各大论坛上向大佬们学习东西,如今因为疫情困在家里写毕设,闲余之时也瞎捣鼓了一下,于是想在这里写一点东西,算是自己学习的一个笔记,再一个就是发现网上的教程质 ...
- 爬虫python爬取页面请求_Python网络爬虫第三弹《爬取get请求的页面数据》
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- python网页数据存入数据库_python网络爬虫抓取动态网页并将数据存入数据库MySQL...
简述 以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网 ...
- python网络爬虫与信息提取视频_Python网络爬虫与信息提取入门5
Part19 实例5:IP地址归属地的自动查询 怎么查询一个IP地址的归属呢?比如说某一个IP地址他是来自于北京.上海还是美国呢?我们用一个python 程序来判断.当然你要判断一个地址的归属地,你必 ...
- python爬虫微博热搜_Python网络爬虫之爬取微博热搜
微博热搜的爬取较为简单,我只是用了lxml和requests两个库 url= https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&am ...
- python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
学习前提1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 1.引入库 爬取网站视频需要引入的第三方库: impor ...
- Python爬虫:爬取百度图片(selenium模拟登录,详细注释)
1.驱动下载 百度图片这种网站是动态的,即并不是网页中的内容全部存储在源代码中,而是不停地动态刷新,所以需要使用selenium模拟浏览器登录,除了安装selenium库之外,还需要针对不同地浏览器安 ...
- python输入学号查成绩_Python实践学习笔记:模拟登录教务系统实现微信查成绩
python+selenium+itchat模拟登录学校教务系统,获取个人成绩,通过微信发送. 先看看最终效果: 〇.背景 学习python一段时间,觊觎学校的教务系统很久了. 寒假开始,大部分同学陆 ...
- python爬虫程序详解_Python网络爬虫之三种数据解析方式
指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为大多数情况下的需求,我们都会指 ...
最新文章
- 题目11 数值的整数次方
- 自己动手制作chm格式开源文档
- Ubuntu16.04 Xmind安装
- input两种默认显示文字方式
- 用撸Arduino的方法撸STM32F103xx
- 系统架构的演变 -----自 罗文浩
- [css] inline、block、inline-block这三个属性值有什么区别?
- centos不能挂在ntfs
- 【opencv学习】基于透视变换和OCR识别的小票识别
- 25-60k/m | 湃道智能招聘
- 谈一谈对旋转矩阵的理解
- Java 数据库连接
- 无法完成您的itunes store的请求_iTunes 谢幕,盘点它的这 18 年
- Go基础学习记录 - 编写Web应用程 - 完善Blog Model
- 配置 SQL Server 2005 以允许远程连接(服务器端)
- jquery跨域访问解决方案
- UE编辑器修改背景theme
- termios结构体各成员
- 离奇的 FRM-18108 ,FRM-10102
- H5链接分享给微信好友,显示标题、描述、缩略图