模拟登录的那些事

背景

我们在,网页抓取,模拟登陆,抓取动态网页等等,过程中,往往要先通过工具去分析,如何访问一个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

对应的headers值是:

Key Value 
Request POST /green-waste/dwr/call/plaincall/VisitBeanNew.getBlogReaders.dwr HTTP/1.1 
Accept */* 
Accept-Language en-us 
Referer http://api.blog.163.com/crossdomain.html?t=20100205 
Content-Type text/plain 
Accept-Encoding gzip, deflate 
User-Agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) 
Host api.blog.163.com 
Content-Length 230 
Connection Keep-Alive 
Cache-Control no-cache 
Cookie 12_04_post_ad_postid=fks_081075080081086074084094094095087084087068083080081075; 12_04_post_ad_ct=3; NTESBLOGSI=E99863FF24FA53138B538832EC731DA4.app-93-8010; USERTRACK=58.240.218.42.1354607689499283; _ntes_nnid=2b3cdc377ee1621bda1f627d5965a266,1354607692730; _ntes_nuid=2b3cdc377ee1621bda1f627d5965a266

 

(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,单独列出来,以方便查看:

cookies

对应的值是:

Direction    Key    Value    Expires    Domain    Path    Secure    HTTP only 
Sent    12_04_post_ad_postid    fks_081075080081086074084094094095087084087068083080081075                    
Sent    12_04_post_ad_ct    3                    
Sent    NTESBLOGSI    E99863FF24FA53138B538832EC731DA4.app-93-8010                    
Sent    USERTRACK    58.240.218.42.1354607689499283                    
Sent    _ntes_nnid    2b3cdc377ee1621bda1f627d5965a266,1354607692730                    
Sent    _ntes_nuid    2b3cdc377ee1621bda1f627d5965a266                   

 

 

对于GET方法,很多时候,往往可以不需要cookie;

对于POST方法,往往需要有对应的Cookie;

类似的,即使需要cookie,对于多个cookie,往往也是可以省略掉部分次要的,但是具体哪些是次要的,可以忽略的,还是需要根据程序调试结果,才知道的。

 

如何处理Post Data

由于此处是POST,所以对应的还有post data:

request body

对应的 post data 数据是:

callCount=1 
scriptSessionId=${scriptSessionId}187 
c0-scriptName=VisitBeanNew 
c0-methodName=getBlogReaders 
c0-id=0 
c0-param0=string:fks_082070080086087066093087094095087084087068083080081075 
c0-param1=number:32677678 
batchId=998946

 

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 -> 不清楚是否必须;可以先忽略,等程序返回错误结果,再去加上;

posted @ 2018-09-04 20:49  不停地走  阅读(639)  评论(0编辑  收藏  举报