模拟登录的那些事
背景
我们在,网页抓取,模拟登陆,抓取动态网页等等,过程中,往往要先通过工具去分析,如何访问一个url,然后获得对应的数据,然后搞懂逻辑了,再用代码实现出来。
而此时,就涉及到,访问对应的url是GET是,要发送,一堆的Header,
而如果是POST的话,还需要有额外的post data要发送;
对此,其过程往往不仅繁琐,而且作为不熟悉的人,完全没有概念和逻辑,去搞懂这些数据到底该如何取舍;
即对于某个header,比如refer,到底是否需要发送;
对于某个post data中的参数,到底是否需要发送;
等等。
转载:https://blog.csdn.net/Fastones/article/details/51766000
以及这些参数,以及参数的值,的含义是啥,都很模糊;
下面就来尽量详细的,阐述一下,相关的Header的含义,以及如何取舍对应的变量:
如何取舍对应Header和Post data参数
如上所述,如果我们确定知道哪些header,哪些post data,需要发送,那么我们自然知道接下来,去搞懂参数的值,从何而来,然后再去用代码实现对应的逻辑过程即可。
但是在此之前,我们很多时候是,对于众多的Header以及post data中的参数,觉得无从下手,一是不清楚其含义,二是不清楚,对应的header或post data是否需要,是否可以舍弃等等问题。
下面,就来解释一下我的一些经验以及所知道的相关的知识:
其中,此处的数据,是来自于:
【教程】以抓取网易博客帖子中的最近读者信息为例,手把手教你如何抓取动态网页中的内容
所以,想要更透彻的理解下面的解释,还请先去看上述帖子。
此处,简单总结一下:
需要访问:
http://api.blog.163.com/green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr
对应的方法是POST,而可能要发送的Heade,其中包括Cookies,以及由于是POST,所以另外还有Post data。
下面,就来解释,如何设置这些值,如何取舍这些值。
对于header和post data,cookie等的取舍原则
不过,在详细分析之前,先要介绍一下,其中的基本逻辑:
其实我们的目的是:通过代码模拟浏览器的行为,通过代码访问对应的url,获得和浏览器中返回的一样的结果
为此,我们,理论上,应该模拟浏览器的完整的行为,即应该把所有的Headers,所有的Post data,都模拟出来。
换句话说:
对于N多个Header,都要去搞懂对应的header的含义,搞懂如何设置对应的header值;
对于N多个Post Data值:搞懂每个post data参数的值,都是怎么获得的;
如果写代码,都需要这么写,说实话,写代码的人,很多时候,早就被累死了。
因为在写代码之前,需要为了实现上述的逻辑,需要通过工具分析出上述的各种的值,都是怎么来的,
很多时候,都是非常耗精力的,甚至有时候是非常难以实现的。
而重新审视我们的目的,即用代码模拟浏览器的行为,获得对应的返回结果,之后我们会想:
我们只是为了获得对应的结果,那么是否有可能,忽略掉,其中次要的参数,比如某些不重要的Header,某些无关紧要的post data参数,
而仍然获得正确的返回值呢?
经过长期的编程实践,我们已知:
如上的想法是可行的,实际上,的确很多时候,未必准备好所有的header和post data,然后去访问对应的url,
就已经可以获得了对应的数据了。
所以,我们在实际编程中,完全可以忽略掉对应的不重要的参数。
但是,现存的困难是,很多时候,我们无法通过直观的方式,一眼就看出,哪些参数要,哪些参数必须保留。
所以,我们正常去分析这些参数,去写代码的过程中,其实是,先是只是写上我们,看起来,觉得重要的参数,然后如果,幸好,已经可以正确获得对应url的返回值了,那么自然省去了精力,不用关心余下的参数;
如果程序运行不正确,没法从url中获得期望的值,再一点点调试,把被忽略的参数一点点加上去,再继续测试是否可以了。
期间,每加上一个参数,意味着,你对于这个参数对应的值,要搞懂是如何获得的。
而实际上,某些参数的值,很容易分析出来如何获得的,比如别之前的某个html中,直接提取而得即可;
而有些参数,需要复杂的过程,甚至需要搞懂背后计算的逻辑,去一点点计算出来;
然后如此地,一点点加上参数,最终调试结果得到可以正确获得返回内容了,
才算结束;
期间,有时候,还需要涉及到cookie,需要把对应的cookie加上,然后随着一些header,(如果有,再加上post data),然后访问对应url,才能获得所需返回值的。
总之,很多时候:
- 分析网页执行逻辑,和写代码调试,是不断交替的过程;
- 而对于所要分析的参数,能少则少,这样可以尽量减少精力,减少去分析无关紧要的参数值是如何获得的那些精力。
然后,才是具体分析,例子中各种header和post data,都是什么含义,以及如何取舍。
Headers, Cookies, Post Data概览
Headers
此部分所要解释的Headers部分,是访问url之前,所要提交的头部信息,简称头信息,或Headers;
其包含了,你可能之前就听说过的,诸如Accept,Referer,Content-Type等等信息;
其中每个参数,叫做(单个的)header;
此处的头信息,是访问任何url,不论是GET,还是POST,全都是需要的。
只不过,有些url,只需要其中部分header。
其中,特别的,对于某url提交POST请求时,对应的有个特殊的header,Content-Type,其值一般都是application/x-www-form-urlencoded
Cookies
更多解释可参考:
Post Data
如何处理Headers
Request Headers截图:
对应的headers值是:
Key Value |
(1)Request POST /green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr HTTP/1.1
这个是浏览器发送的。
对应程序中,不需要我们关心,程序中对应的库函数,会根据我们所设置的url地址和POST,自动发送这部分的内容的;
(2)Accept */*
根据经验;直接照着设置一下,即可;
表示接受的数据类型,是任何类型都可以;
(3)Accept-Language en-us
表示所接受的语言,是英文;
此处照着做即可。实际情况是,很多时候忽略此参数也没事;
(4)Referer http://api.blog.163.com/crossdomain.html?t=20100205
此referer,一般可忽略;
有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载;
(5)Content-Type text/plain
表示内容类型;
程序中照着设置,即可;一般来说,也可以忽略之;
(6)Accept-Encoding gzip, deflate
此处,多数浏览器,会设置Accept-Encoding为gzip, deflate
然后浏览器获得的数据,就是压缩的数据,子会自动解压,然后显示对应的内容。即,你作为用户看到的数据,都是
程序中,如果设置了
如何处理Cookies
Cookies,单独列出来,以方便查看:
对应的值是:
Direction Key Value Expires Domain Path Secure HTTP only |
对于GET方法,很多时候,往往可以不需要cookie;
对于POST方法,往往需要有对应的Cookie;
类似的,即使需要cookie,对于多个cookie,往往也是可以省略掉部分次要的,但是具体哪些是次要的,可以忽略的,还是需要根据程序调试结果,才知道的。
如何处理Post Data
由于此处是POST,所以对应的还有post data:
对应的 post data 数据是:
callCount=1 |
1.自己多次用工具去分析,对比多次的数据,对于其中那些没有变化的,自然就是可以固定写死的数据,即在程序实现时,可以直接赋值,无需另外计算的。
比如post data中的
c0-methodName=getBlogReaders
就是这类。
这点无所多谈,自己多试试就知道了。
2.对于Request Headers中的值,很多项,比如
Accept-Language en-us
Cache-Control no-cache
对于程序实现是,往往是(但不绝对是),无关紧要,可以直接忽略,即在代码中,可以不设置这些参数的。
3.其他一些,必须的,必备,不可少的几类:
post data:如果是POST,那么必然有post data。而post data中,一般有很多个参数和参数值,其中,很多时候,只需要关系最核心的几个参数,保证其参数和参数值正确,往往就可以获得正确的返回值了。
所以,可以忽略那些相对次要的参数的值,是怎么得到的,从而省却一定精力。
具体保留哪些值,省去哪些值,没有规律。只能靠自己的实际代码的调试,一点点分析得知。
但是,此处,咱照常理,很明显的,像:
c0-methodName=getBlogReaders
的值,肯定是必须的,因为本身此url的目的就是去获得对应的博客读者的信息,所以很明显这个告诉服务器,就是去getBlogReaders的。
而此处,对于其他一些值,比如:
scriptSessionId=${scriptSessionId}187
c0-param0=string:fks_082070080086087066093087094095087084087068083080081075
看起来,就很像是,必须的,需要另外去找到,对应的参数值,都是如何计算出来的,如何获得的。
此处,接着去分析上面的内容中,哪些要保留,哪些可以取消。
或者说,去解释一下,对于我,是如何取舍这些值,如何分析这些值的:
首先,我根据经验的值,和直观的查看而推测:
1. 先看相对最重要的post data:
post data中:
(1)callCount=1 -> 这也许可以忽略;如果是必须的,则要去看看这个1是如何得到的;
(2)scriptSessionId=${scriptSessionId}187 -> 看起像是必须的。此处要搞清楚187是从哪来的;
(3)c0-scriptName=VisitBeanNew -> 估计也是必须的,而且好像是固定的值;
(4)c0-methodName=getBlogReaders -> 估计也是必须的,而且好像是固定的值;
(5)c0-id=0 -> 估计是可以忽略的;
(6)c0-param0=string:fks_082070080086087066093087094095087084087068083080081075 -> 看起来就是必须的。要去搞清楚fks_082070080086087066093087094095087084087068083080081075是从哪获得的;
(7)c0-param1=number:32677678 -> 不清楚是否必须;可以先忽略,等程序返回错误结果,再去加上;
(8)batchId=998946 -> 不清楚是否必须;可以先忽略,等程序返回错误结果,再去加上;