文档章节

perl登录各种网站的原理与实现

tkorays
 tkorays
发布于 2014/08/21 17:45
字数 1431
阅读 2986
收藏 13

perl登录各种网站的原理与实现

tkorays(tkorays@hotmail.com)

小孩子才践行大道理,大人只会讲。


        写脚本抓取某个页面内容很简单,但是往往事情没那么简单。有些页面必须是要登录才能查看的,比如你想抓取选课系统中自己的成绩?所以,下面介绍下使用perl登录网站的原理,以及实现。


原理

        如果你了解一些http原理的话,这就很好理解了。使用浏览器打开网页无非就是:你发送请求,然后服务器响应,给你所需要的页面内容。当然这些请求和相应都是有一定规律的。

        先说浏览器发送请求

       请求常用有POST和GET两种,撇去细节不谈,两者有个很大的区别就是POST传递的参数是不显示在url中,而GET方式传递的参数会在url中显示。而我们登录有表单提交,经常要用POST和GET。比如我在开源中国搜索apache:

        这个表单是GET方式的,所以url中会有参数。

        那么,是否浏览器就发送了这么多数据给服务器了呢,答案当然是,否。如上图中,点开头消息,请求头如下:

        其实还发送了这些数据,所以如果你要自己用c/c++等实现,不要忘记发送必要的数据哦。(提示,每个数据使用\r\n分割的)如果你使用perl,有现成的库,你不需要关注太多细节的,只需要知道,可能须有cookie!

        因此,请求你只需要关注,请求的参数以及可能需要的cookie。

        接下来说相应

        同样,浏览器返回的html网页不止是你查看源代码看到的那些,还包括响应头。

        相应头和请求头差不多,主要高速浏览器该怎么处理这些相应。注意上面的Content-Type没,后面的text/html表示返回的数据是html格式的。(返回javascript时,content-type是application/x-javascript)。当然并不是所有的相应都有响应头,而且大多时候,你也不需要关注它。这里我只是凑字数说说,完全可以忽略。返回的页面,你完全只需要获取头后面的东西(反正你也知道返回的是html还是javascript,何必还判断呢)。

        cookies是保存在浏览器端的一些小数据,可以用于保存一些信息。它其实就是一些键值对。很多时候,服务器会生成一些数据给浏览器,这些在之后的通信过程中是很重要的。所幸的是,perl有现成的库供我们管理cookies,如果你要一步步实现,就头大了。

        对了,还要注意的是url编码问题,有时候会出现。

实现

        说了原理当然要说实现了,不然我就是欺骗读者的感情了。

        perl中使用到的主要包有LWP,会用到它的UserAgent、Cookies、Response等类。这些类有不明白的地方可以查看cpan。

        这里我们需要模拟一个浏览器的行为,所以要创建一个UserAgent对象。

my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0");

        这样,请求头里面的浏览器就变成了火狐,服务器会以为我们是使用火狐呢。

        不能忘记cookies哦。

my $cookie_jar = HTTP::Cookies->new(
    file=>'lwp_cookies.txt',
    autosave=>1,
    ignore_discard=>1);
$ua->cookie_jar($cookie_jar);

        之后调用UserAgent的post和get方法,想干什么就干甚么。

        如果你看的不是很明白,下面给出一个登录人人并发状态的例子,好好领悟吧。有注释哦:

#!/usr/bin/perl
# Copyright 2014 tkorays. All rights reserved.
# author tkorays
# email tkorays@hotmail.com
use strict;
use warnings;
use LWP;
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Headers;
use HTTP::Response;
use Encode;
use URI::Escape;
use URI::URL;

my $email = '***@**.com';
my $password = '***';
my $domain = 'renren.com';
my $hostid='';
my $requestToken='';
my $rtk='';
my $channel='renren';

my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0");
my $cookie_jar = HTTP::Cookies->new(
    file=>'lwp_cookies.txt',
    autosave=>1,
    ignore_discard=>1);
$ua->cookie_jar($cookie_jar);

my $login_url = 'http://www.renren.com/PLogin.do';

# 这里面没有判断是否需要验证码,聪明的你学完后肯定知道怎么搞定的
# 人人是post登陆的,第一个参数是登陆的地址,第二个参数是一个匿名hash
my $res = $ua->post($login_url,{
        'email'=>$email,
        'password'=>$password,
        'domain'=>$domain});
my $homepage; 
# 判断响应头里面的location,确定是否登陆成功   
if($res->header('Location') eq 'http://www.renren.com/Home.do'){
    print 'login ok...',"\n";
    $homepage = $ua->get('http://www.renren.com/home'); 
}else{
    exit;
}
# 作为福利,下面还是贴上,发状态的吧,后面就不注释了
#####################################
if($homepage->is_success){
    my $pagect = $homepage->content;
    $pagect =~ /id\s:\s"(\d+)"/g;
    $hostid = $1;
    $pagect =~ /requestToken\s:\s'(.+)'/g;
    $requestToken = $1;
    $pagect =~ /_rtk\s:\s'(.+)'/;
    $rtk = $1;
    
            
}else{
    exit;    
}
my $purl = 'http://shell.renren.com/'.$hostid.'/status';
my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(); 
$year +=1900;
$mon++;
my $postret = $ua->post($purl,{
    'content'=>"renren test,by perl script,author:tkorays,date:$year-$mon-$day $hour:$min:$sec.",
    'hostid'=>$hostid,
    'requestToken'=>$requestToken,
    '_rtk'=>$rtk,
    'channel'=>$channel});
if($postret->is_success){
    print 'send ok...',"\n";
}else{
    print 'fuck!';
}

       

        有验证码怎么办?UserAgent的get、方法获取啊。

        给个简单的例子吧:

my $res = $ua->get($url.'/GenImg');
    if(!$res->is_success){
        return 0;
    }
    open(FILE_HANDLE,'>img.jpg');
    binmode FILE_HANDLE;
    print FILE_HANDLE $res->content;
    close FILE_HANDLE;

        上面的代码把验证码存为图片。所以验证码问题就解决了。

GO

        问题都解决了,你就赶快行动?











© 著作权归作者所有

tkorays
粉丝 16
博文 10
码字总数 6544
作品 0
深圳
程序员
私信 提问
python 自动登陆网页原理

有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录。 浏览器访问服务器的过程 在用户访问网页时,不论是通过URL输入域名或...

oanyt
2015/06/08
0
0
使用 Perl、jQuery、Ajax、JSON 和 MySQL 实现简单的登录

自 WWW 创始之初,开发人员就尝试为他们的网站提供新的特性和部件来吸引用户,并通过应用最新的技术来简化操作。如今,一个普通的 web 用户的主要活动就是网上购物、搜索信息、注册论坛和社区...

IBMdW
2011/06/10
1K
3
python 淘宝系列(一):模拟登陆

前言 想实现python登录淘宝,大概有两种思路:1. 使用淘宝开放API接口; 2.使用模拟登陆发送post 数据登录。 两种方式各有优缺点。使用淘宝API,首先得装API库,比较大,有200多M,对小程序而...

艾柯
2014/01/07
10.9K
8
PageAdmin Cms网站建设教程安全篇:如何预防管理员账户被被暴力破解

PageAdmin是国内最流行的网站管理系统和自助建站系统之一,全国拥有上千万个网站使用这个系统做网站,占据内容管理系统市场的60%以上的份额,被很多用户喜欢的原因不仅仅是其功能强大和灵活性...

郭生生
05/29
0
0
巧用 SecureCRT 实现复杂的 ssh 登录过程自动化

以前公司的服务器都是在 SecureCRT 里直接 ssh 连接,但是最近公司处于安全审计考虑,在所有服务器前加了一层堡垒机,而且密码采用 kerberos 集中授权认证。这样问题就来了,虽然安全审计的目...

大数据之路
2015/12/31
5.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

【0918】正则介绍_grep

【0918】正则介绍_grep 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 一、正则介绍 正则是一串有规律的字符串,它使用单个字符串来描述或匹配一系列符合某个语法规则的字符串。 二、grep工具 ...

飞翔的竹蜻蜓
9分钟前
3
0
为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
47分钟前
7
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
58分钟前
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
58分钟前
4
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部