Python爬虫笔记(三)——表单登陆

python版本为3.6

 

表单登陆

一般来说,各个网站表单登陆的方式是比较灵活的,在这里只介绍两种,这两种登陆方式的区别在于Content-Type的值

 

方式一:multipart/form-data

multipart/form-data:指定传输数据为二进制类型,比如图片、mp3、文件

此时账号与密码在body部分,boundary表示分割线,用于分割数据

 

方式二:application/x-www-form-urlencoded

application/x-www-form-urlencoded会将数据编码成键值对的形式上传,如果是http的get请求,相应的参数会附着在url后面,用问号分割,如果是post请求,则会加到http的body部分(下面例子具体介绍)

 

chrome的开发者工具、Fiddler、Wireshark抓包均可分析登陆的表单,目前表单登陆的请求琳琅满目,我分析了知乎、豆瓣

微博、B站的表单登陆,只有豆瓣与新浪采用了上述第二种登陆方式,知乎的表单登陆方式经常更换,而且数据似乎经过了js的处理,B站需要手滑验证码,这种爬虫比较难处理。下面以豆瓣登陆为例子,简单介绍一下表单登陆

 

豆瓣的表单登陆

1、抓包分析:

使用chrome的开发者工具抓包分析:

http请求头:

body部分:

 

这里需要注意几点:

1、请求头可以直接copy到自己的代码中,但是要注意cookie,cookie是具有时效性的,过了时效性,即使我们的操作正确,也可能无法登陆,实测,不带cookie也可以用表单登陆

2、豆瓣有时需要验证码,可以在自己的代码中测试是否有验证码,有验证码则自己手工输入,如果是大规模爬取的话,可以尝试用一些图像识别的手段,不过这种方式识别会有误差

3、一般登陆成功后,服务器会返回302重定向和登陆后设置的cookie,urllib处理重定向时会丢弃这部分cookie,导致登陆失败,我们需要在urllib中设置一个拦截器,负责自动处理cookie(即cookiejar)

4、请求头中的Accept-Encoding要把gzip、deflate去掉,浏览器考虑到带宽等问题会对响应的body部分进行压缩,此时需要对响应进行解压,会有不必要的麻烦

 

from urllib import request
import urllib
from http import cookiejar

header={
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Length': '70',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Host': 'www.douban.com',
        'Origin': 'https://www.douban.com',
        'Referer': 'https://www.douban.com/',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0'
        }




login_info={'source':'index_nav','form_email':'12345','form_password':'12345'}
login_info=urllib.parse.urlencode(login_info).encode(encoding='utf-8')
cj=cookiejar.CookieJar()
opener=request.build_opener(request.HTTPCookieProcessor(cj))


req=request.Request('https://www.douban.com/accounts/login',headers=header,data=login_info)
response=opener.open(req)

file=open('C:\\Users\\lzy\\Desktop\\ni.txt','w',encoding='utf-8')
file.write(response.read().lower().decode('utf-8'))
file.close()

 

往urllib中添加cookie拦截器方式的代码如下:

cj=cookiejar.CookieJar()
opener=request.build_opener(request.HTTPCookieProcessor(cj))

HTTPCookieProcessor相当于一个拦截器,其通过cookiejar对http协议进行处理,cookiejar负责cookie的维护,发送请求时,会自动在请求头上附上cookie,接收到http响应时,自动识别请求头中的set-cookie字段,加入到自己维护的cookie中

 

将html写入文件是为了判断是否登陆成功,登陆成功后,豆瓣会进行页面跳转,可以以此来判断是否登陆成功,当然我们也可通过cookie来判断是否登陆成功,上述方式的处理结果如下:

可以看到有账号标识的字段

 

异常:'gbk' codec can't encode character '\u2122' in position 42387: illegal multibyte sequence

这里注意到我们已经用utf-8进行了解码,出现这种问题是因为windwos文件默认的编码方式是gbk,更改一下即可:

file=open('C:\\Users\\lzy\\Desktop\\ni.txt','w',encoding='utf-8')

 

对于知乎这类比较难处理的登陆,自己解析是比较慢的,如果没有时间的硬性要求,可以通过selenium+chromedriver进行登陆,这些东西会在整理动态页面的抓取时进一步说明

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值