爬虫入门-12306官网登录详解
一,首先我们要先通过浏览器抓包的方式搞清楚登录的流程,url,参数等
登陆=请求 POST请求
- 请求url(str)
- 请求方式(str)
- 参数(str,bytes)
验证码校验
- https://kyfw.12306.cn/passport/captcha/captcha-check
- POST
- 参数:answer:52,36,117,68 login_site:E rand:sjrand
验证码发展
- 1.数字或者字符串
- 2.字符和数字生成一张图片,加载到浏览器上面(噪点,颜色,字体)
- 3.坐标型验证码(滑动,根据文字找文字,根据文字找图片)机器原形(图片识别,分词,中文词找匹配图片)
12306压力
- 计算压力(每个站有没有票)
- 不能做缓存(大量的数据库操作)
下面开始代码实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib, urllib2
import ssl # 12306证书是没有通过验证的,避过12306证书的问题
import cookielib # cookie添加
# 避过证书验证,12306的证书是没有通过验证的
ssl._create_default_https_context = ssl._create_unverified_context
c = cookielib.LWPCookieJar() # 生成一个存储
cookie = urllib2.HTTPCookieProcessor(c)
'''
同urlopen相同,比urlopen多得是会保存cookie
把这个存储器绑定到opener对象当中
'''
opener = urllib2.build_opener(cookie)
urllib2.install_opener(opener)
headerLoging = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}
def login():
# 获取验证码图片和校验验证码
req = urllib2.Request(
"https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.6246852095798301")
req.headers = headerLoging
imgCode = opener.open(req).read() # 图片二进制码
with open("code.png", "wb") as fn:
fn.write(imgCode)
# 发送请求
req = urllib2.Request("https://kyfw.12306.cn/passport/captcha/captcha-check")
req.headers = headerLoging # 添加头部信息
code = raw_input("输入验证码:")
data = {#低级错误 answer参数前面加了空格
"answer": code,
"login_site": "E",
"rand": "sjrand"
}
data = urllib.urlencode(data) # 需要把字典转换成字符串
html = opener.open(req, data).read()
# 下一步登陆
print html
login()