爬虫 处理登录表单

在客户端向服务器提交http请求的时候,两种最经常使用的方法是GET和POST。按照规定,get请求只应用于获取数据,所以通常都是用requests.get()。相对于GET请求,POST请求则用于提交数据。对登录表单的处理,每次登录能够直接处理登录表单或者选择在第一次登录后,保存cookies等信息,下次可直接登录。如下内容主要介绍直接处理表单的,获取目标页面的url的方法。php

一、直接处理登录表单(即处理须要登陆名、登录密码的网页)

参考书籍:Python网络爬虫从入门到实践中http://www.santostang.com./wp-login.php;
用户名:test;密码:a12345;
参考网页:http://www.javashuo.com/article/p-kqmizeim-bz.htmlhtml

登录表单分为两步:python

  • 研究网站登录表单,构建POST请求的参数字典浏览器

  • 提交POST请求;服务器

(1)参数字典

构建参数字典主要是4个部分,都是 键值对的形式,经过查询网页,拣选对应的键和值;cookie

  • 用户名 name 的属性值 做为键值对中的key(用户需输入的用户名则为value)

如上图,F12 点选用户名框,name的属性值为"log",以此做为key;value 为用户实际名。so 'log'='a12345'网络

  • 用户密码 name的属性值 做为键值对中的key(用户需输入的用户名则为value)

如上图,F12 点选密码框,name的属性值为"pwd",以此做为key;value 为用户实际名。so 'pwd'='test'session

  • 记住登录密码 name的属性值 做为键值对中的key,value的属性值做为 键值对中的value

如上图,F12 点选 记住密码框,name的属性值为"rememberme",value的属性值为"forever"。so 'rememberme'='forever'wordpress

  • 在登录表单中,有些key值在浏览器中设置了hidden值,因此只提交用户名、密码和记住密码不能直接登录,还须要审查出来。

如上图,F12 点选 记住登录框,input type的属性值为"hidden"的有两条。第一条,name属性值为"redirect_to",value的属性值为"http://www.santostang.com/wp-admin/",so 'redirect_to'='http://www.santostang.com/wp-admin/';第二条,name属性值为"testcookie",value的属性值为"1" so 'testcookie'='1'post

综上所述:创建参数字典,以下:

post_data={
    'log':'a12345',
    'pwd':'test',
    'rememberme':'forever',
    'redirect_to':'http://www.santostang.com/wp-admin/',
    'testcookie':'1'
};

(2)提交参数字典

提交POST请求,就能够登录网站了。首先须要导入requests库,并建立一个session对象。用户浏览某个网站时,从进入网站到关闭浏览器所通过的这个过程,session对象会存储特定用户会话所须要的属性和配置信息。 session 对保存和操做cookies很是重要。

#encoding:utf-8;
import requests;

post_link='http://www.santostang.com./wp-login.php';#登录页面 url
agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36';
host='www.santostang.com';
oringin='http://www.santostang.com';
cookied='wordpress_test_cookie=WP+Cookie+check';
headers={'User-Agent':agent,'Host':host,'Origin':oringin,'Referer':post_link,'Cookie':cookied};#提交者
post_data={
    'log':'test',
    'pwd':'a12345',
    'wp-submit':'登陆',
    'redirect_to':'http://www.santostang.com/wp-admin/',
    'testcookie':'1'
};

login_page=requests.post(post_link,data=post_data,headers=headers,allow_redirects=False);
profile_page=login_page.headers['location'];
print (login_page.status_code);## 回复302
print (login_page.headers['location']);## 回复http://www.santostang.com/wp-admin/profile.php

提交post的过程很简单,即先创建各个参数,而后使用post方法,参数是post_url,data是postdata,headers是headers,allow_redirects。headers中,User-AgentHostOrigin(比host多了个http?)、Referer(就是登录页面的url)、cookies

  • 查看登录表单是否请求成功,可查看响应状态login_page.status_code。返回值200,表请求成功;303,表重定向;400,表请求错误;401,表未受权;403,表禁止访问;404,表文件未找到,500,表服务器错误。

表单登录页面:http://www.santostang.com/wp-login.php

表单中的重定向网址:http://www.santostang.com/wp-admin/

登录成功目标网址:http://www.santostang.com/wp-admin/profile.php

NOTE1

  • 得到Headers的参数的捷径, 在登陆页,不输入用户及用户名,点击登陆框,查看F12 中 request headers,post_data的参数,如上,headers中的cookied也必须有login_page=requests.post(post_link,data=post_data,headers=headers,allow_redirects=False)中的allow_redirects=False必须有,否则
    login_page.status_code 的返回值为200,其实去了post_data中的redirect_to 重定向网页中,而不是跳转到目标网页;添加该属性,返回的是302,完成了post的第一次请求,其respons header中location属性值即为profile的url,能够此url向服务器发送第二次请求。便可以此url采集数据。

  • 可是我不懂,资料中对headers的参数及post参数的设定不明确,漏掉了cookie及allow_redirects 致使刚开始一直进入重定向网址,而获取不到目标网页的网址。仍是官方文档比较靠谱。http://www.python-requests.org/en/master/user/quickstart/#redirection-and-history

二、处理cookies(记住cookies,登录)

参考网址:https://blog.csdn.net/zhu_free/article/details/50563756

经过session,可记录网页cookies中用户信息,以免每次登录的时候都要输用户名及密码。只要将第一次接触的网页cookies 用session 存储,或者将屡次网页的cookies从session中提取,便可。

三、疑难杂症

(1)一直搞不懂,网页network headers中response headers和requests headers 是干蛤的。

http://www.santostang.com/wp-login.php

post第一次请求 http://www.santostang.com/wp-admin/profile.php

登录后http://www.santostang.com/wp-admin/profile.php

  • 每一个url,都会有requests和respons,其实每次请求都会用到这两个。requests 能够理解是向服务器发送请求须要的,而respon是服务器接收到请求后,反馈回来的。

  • 在表单登录的过程当中,由login网页到进入profile的过程。由图二可知,因此咱们第一次从login进入到profile的request method 是post,status code 是302 Found;因此咱们在login到profile须要用post,而不是get。
  • post请求进入profile的过程咱们能够用两次请求理解。第一次以login 这个url想服务器发送请求返回login 的response有一个状态码 302 foubd、location和cookies(其实就是图二的respons 内容);第二次用login response headers 的这个location url再向服务器发送请求,返回的就是想进入的location url界面。
  • 由上可知,进入到profile url 前,想象增长一个中间页面,如图三,虽然浏览器中已是pofile的地址,但其general 的request url 仍是login ,其respons能够理解为post login url第一次请求后服务器返回的内容(location、cookies 已找到),request能够理解以location、cookies第二次向服务器发送请求的要求(因此Referer是login,而且在咱们post请求的headers 参数值中),且增长一块From data,就是post的参数字典。可是进入location url ,如图四,其general url 变成 profile 、request method 为get、status code 为200 。

  • 一个重定向网址,就是为了记住登陆前的网页,这样,不会每次登录后都回到 首页。

(2)cookies

其实cookies就是每一个登录的钥匙。

(3)其实仍是不是很懂这种网页的东西,记得很绕,不是理论,就是本身的催眠本身的理解。但愿不要误导到人。慎入,哈哈。

相关文章
相关标签/搜索