zoukankan      html  css  js  c++  java
  • 爬虫1-15

    Hacks #1?7
    Hack 1. A Crash Course in Spidering and Scraping
    Hack 2. Best Practices for You and Your Spider
    Hack 3. Anatomy of an HTML Page
    Hack 4. Registering Your Spider
    Hack 5. Preempting Discovery
    Hack 6. Keeping Your Spider Out of Sticky Situations
    Hack 7. Finding the Patterns of Identifiers
    URL /spiderhks?CHP?1

    Hacks #8?32

    爬取网站背后的想法往往是纯粹的,立即的 ,或者疯狂的欲望: 这是深夜, 你忘记了你儿子的足球比赛,你发誓永远不会让它再发生。

    当然,你可以再浏览器工具栏中放置一个书签到学校的日历,但你想要更阴险的东西,你不可能忘记或习惯于
    看到。

    晚一点,你已经有一个Perl 脚本, 自动发送邮件给你 每天每一小时,当游戏被放入几乎任务。

    你这是让你的生活不那么健忘,你的电脑更有用,你的儿子更可爱。 这就是爬虫在爬取, 当你痒了,最好能被划伤通过让你的电脑参与

    如果有一种编程语言,可以快速刮伤痒比任何其他,这是Perl。

    Perl是著名的“使容易的事情更容易和困难的事情成为可能,“赢得了声誉
    “瑞士军刀”,“互联网的管道胶带,”或最终的“胶水语言。”因为它是一个脚本
    语言(而不是一个编一个,像C),快速的发展是其做法;把
    一起从编码比特和各处,尝试,调整,哼哼,唧唧,和部署。随着
    其巨大的存储库的现有代码(见CPAN,ComprehensivePerlArchiveNetwork,在
    http://www.cpan.org)和不可思议的能力,“做你的意思是说,“这是一个完美的语言
    根据搜索技巧的书。

    在这本书中, 我们假设你有Perl的基本知识。你可能不会比一个助手会太多,但我们希望你可以创造一些更高级一点的 相比”Hello,World.”

    相信我们, 就像很多事情, Perl, 它比你想的要容易很多。在本章中,我们将致力于你需要知道的是, 安装网络 访问Perl模块,

    并学习如何使用它们,从简单的查询,伪造HTTP headers.

    Perl Modules

    你可能被前段的模块被绊倒了,不要担心,亲爱的读者。一个模块是一个简单的封装的perl代码,别人写的。

    通过遗忘细节和大部分的脏工作模块作者,使用一个模块,而不是写所有的代码自己做一个复杂的任务。

    当我们说要安装一个模块,我们真的意味着我们要从CPAN 获得一份,测试以确保它将在我们的工作环境,确保它不需要其他
    模块,我们尚未有,安装它,然后准备在我们自己的脚本一般使用。

    听起来挺复杂的,对吧? 重复循环往复,别担心,情爱的读者,CPAN覆盖可。Perl的最伟大的成就之一,是一个好−CPAN的分类选择
    由数百名作者创建和贡献的模块。在世界范围内,有一个很好的机会
    你“我希望我有一个。“..”不解被抚慰,错误−测试,包装你的我们。

    从CPAN 是如此强大的装备的Perl语言,模块的安装任务确保其能力已经远比以前更容易的繁文缛节,我说。我们盖
    如何在我们的第一个破解本章[黑客] # 8安装模块。

    当你浏览这本书,你会看到我们使用了一些非核心非核心模块,是
    定义为“没有你的Perl安装的一部分。”以下是一些更受欢迎的
    你会用你的一天到一天−−刮。再一次,不要担心,如果你不理解这一点
    我们会用时间来掩护:

    LWP
    一个封装模块的访问,也被称为lib www−Perl

    LWP::Simple
    简单函数获取网页文件

    LWP::UserAgent

    更强大的功能,实现爬虫的外观和行为更像一个专门的
    网络浏览器

    HTTP::Response

    一个纲领性的封装response 到一个HTTP 请求

    HTTP::Message and HTTP::Headers

    类提供更多的方法 to HTTP::Response,响应,如方便的设置
    和HTTP标头

    URI:

    方法在操作一个web地址, 比如获得URL的base, 转账一个相对的URL到一个决定的,并返回单独的路径段

    有关这些模块的更多信息,一旦安装,你可以发一个man Module::Name 命令

    你可能会发现有用的资源:

    如果你是Perl新手,或如果你想提升你的技能,通过以下的O’Reilly的叶
    书,都−尊敬的增加任何Perl程序员的图书馆:

    Hack 8 Installing Perl Modules (安装perl模块):

    很多我们的黑客需要的模块不包含在标准的Perl分布,在这里,我们将
    教你如何在Windows上安装这些模块,MAC OS X,和−UNIX系统:

    当你通过这本书, 你会发现, 我们经常提供的各种不同的Perl模块。

    有些是不标准的安装费用,所以这是不可能的,你已经有他们
    提供给您的编码。

    为什么我们提到非标准模块?很简单,我们不想重新发明轮子。我们做
    一些很奇怪的带着吊在这本书中,并没有帮助这些模块我们
    要做很多额外的编码(这只意味着更多的易碎的位在我们的脚本)

    如果你是新来的Perl,然而,你可能会感觉到安装模块的想法吓到了。不要
    担心,它是一个单元!如果你正在运行ActiveState Perl for Windows,您将要使用的程序
    软件包管理器(PPM)。否则,你将使用CPAN。

    Example: Installing LWP

    LWP 是贯穿本书的, 因为它是任何Perl脚本设计的主力
    与互联网的互动。一些Perl安装已安装;别人不这么做,我们将使用它
    这里是如何安装一个典型的Perl模块实例;步骤适用于几乎任何可用的
    非核心模块,我们使用我们的其他黑客,事实上,你可能在你的持续不断的遭遇
    编程。

    通常, 安装Perl模块最简单的方式是通过另一个module ,CPAN module,

    包括每个模块的描述, 自动安装perl 模块,取部件和任何先决条件和建筑而非全部你的飞行。

    Unix and Mac OS X installation via CPAN Unix 和 Mac OS X 安装通过CPAN

    假设你有CPAN模块,有root权限,并连接到互联网,安装
    应该没有比这更复杂

    % su
    Password:

    perl −MCPAN −e shell

    cpan shell −− CPAN exploration and modules installation (v1.52)
    ReadLine support available (try “install Bundle::CPAN”)
    cpan> install libwww−perl
    Or, if you prefer one−liners:
    % sudo perl −MCPAN −e ‘install libwww−perl’

    这个libwww-perl 是干什么用的? 我以为我们是在安装LWP! 他们其实是同一个

    在任何情况下,去拿一杯咖啡,在花园里漫步,阅读文章,并检查
    偶尔回到从前。你的终端会充斥着令人费解的官样文章,你
    可以,在大多数情况下,草率地忽略。你可能会被问到一个问题或三个问题,在大多数情况下,只是
    按返回接受默认的答案会做的伎俩。

    Unix and Mac OS X installation by hand

    Hack 9 Simply Fetching with LWP::Simple

    LWP(简称 ”Library for WWW”) 是用于访问数据的Perl 的模块,像大多数Perl模块分布,每个LWP的组件模块自带一个完整的参考资料。

    然而,有这么多的模块
    LWP,很难知道到哪里去寻找做连最简单的事情的信息。

    如果你想访问一个特定的URL,这样做的简单的方法就是使用LWP::Simple的功能。

    在一个Perl 程序,你可以简单的叫它得到(url URL的位置
    你感兴趣的内容。LWP::简单的将尝试把内容URL末尾。如果是
    成功的话,你将交给的内容;如果有一个错误的一些排序,得到函数将返回
    未,未定义的值。得到的是一个名副其实的HTTP GET请求,其中一条
    “把我的内容在这个网址”:

    !/usr/bin/perl −w

    use strict;
    use LWP::Simple;

    Just an example: the URL for the most recent /Fresh Air/ show

    my $url = ‘http://freshair.npr.org/dayFA.cfm?todayDate=current‘;
    my content=get(url);
    die “Couldn’t get url"unlessdefinedcontent;

    Do things with $content:

    if ($content =~ m/jazz/i) {
    print “They’re talking about jazz today on Fresh Air! ”;
    } else { print “Fresh Air is apparently jazzless today. ”; }

    Hack 10 More Involved Requests with LWP::UserAgent

    知道如歌下载网页是很好的,但它没有帮助我们,当我们要提交forms,假冒浏览器设置,或获得更多关于我们的请求的信息。在这里,我们将跳转到更有用的
    LWP::UserAgent

    LWP::Simple 的功能方便的简单情况,但它们不支持cookie或授权; 它们不支持HTTP 请求设置的标题行,通常,

    它们不支持读取header line 在HTTP的响应(最值得注意的是,完整的HTTP错误消息,如
    问题)。获得所有这些功能,你必须使用LWP Class模型

    LWP包含了几十个类, 你要明白的是LWP::UserAgent and HTTP::Response。

    LWP::UserAgent 是一个类用于各种浏览器, 你可以用来执行请求, HTTP::Response是一个类用于响应(错误信息) ,从请求中回来的。

    !/usr/bin/perl −w

    use strict;
    use LWP 5.64; # Loads all important LWP classes, and makes

    sure your version is reasonably recent.

    my $url = ‘http://freshair.npr.org/dayFA.cfm?todayDate=current‘;
    my browser=LWP::UserAgent>new;myresponse = browser>get(url );
    die “Can’t get url",response−>status_line
    unless response>issuccess;dieHey,IwasexpectingHTML,not,response−>content_type
    unless $response−>content_type eq ‘text/html’;

    or whatever content−type you’re dealing with.

    Otherwise, process the content somehow:

    if ($response−>content =~ m/jazz/i) {
    print “They’re talking about jazz today on Fresh Air! ”;
    } else {print “Fresh Air is apparently jazzless today. ”; }

    有两个对象调用 $browser,持有s LWP::UserAgent的对象 和响应对象,

    这是 HTTP::Response类。你一个程序只需要一个浏览器对象,但每一次你提出要求,你得到一个新的HTTP响应对象:,
    拥有一些有趣的属性.

    状态码表示成功/失败 ($response->is_success),一个HTTP 状态行,如果这里有失败 会提供信息。

    document 找不到 会返回404

    Hack 11 Adding HTTP Headers to Your Request (增加HTTP headers 到你的请求)。

    为你的程序添加更多的功能,或模仿常见的浏览器,绕过服务器−侧
    未知用户代理的过滤。

    LWP::UserAgent 请求 常见的用法是 response=browser−>get($url),

    但事实上 你可以添加额外的 HTTP header 在URL后的键值对

    response=browser−>get( url,key1, value1,key2, $value2, … );

    为什么加入HTTP 头有时候是必要的呢? 它真的取决于你的网站, 有些只会响应来自共同的目标−用户浏览器的行为,


    IE,Netscape,Mozilla,Safari。其他人,在绝望的尝试,以尽量减少带宽
    成本,将只发送压缩的数据[ 16 ]黑客#,需要在客户端解码。所有这些客户
    生活用品可以通过HTTP标头的使用使。例如,这里的如何发送更多
    Netscape−like headers

    my @ns_headers = (
    ‘User−Agent’ => ‘Mozilla/4.76 [en] (Win98; U)’,
    ‘Accept’ => ‘image/gif, image/x−xbitmap, image/jpeg,
    image/pjpeg, image/png, /‘,
    ‘Accept−Charset’ => ‘iso−8859−1,*’,
    ‘Accept−Language’ => ‘en−US’,
    );
    response=browser−>get($url, @ns_headers);

    Hack 12 Posting Form Data with LWP 用LWP post 表单数据

    自动化表单提交,无论是用户名或密码验证,提供你的邮政编码用于服务的定位,或简单地填写一些定制领域的搜索引擎.

    让你再Google 搜索 3个失明的老鼠,您的结果将取决于您的网址
    您已经设置的首选项,但它会看起来像这样

    http://www.google.com/search?num=100&hl=en&q=%22three+blind+mice%22

    查询本身变成一个邪恶的混乱, &q=%22three+blind+mice%22 ,但是为什么呢? 当你通过表单提交数据,

    数据必须被编码,以便它可以安全的到达目的地, 服务器,完整的。

    让我们打破那些URL中的位是什么意思

    Num = 100指的是搜索结果数量100页,在这种情况下。谷歌接受任何数字
    从10到100。改变num值在URL并重新加载页面是一个很好的捷径
    改变你的结果首选大小设置没有蜿蜒到高级搜索
    http://www.google.com/advanced_search?HL = EN)并重新运行您的查询

    H1 = EN意味着语言的接口,你用谷歌语言,体现在
    主页,消息和按钮是英文的。谷歌的语言工具
    http://www.google.com/language_tools?HL = EN)提供一系列的语言选择。

    三变量num,Q,和H1和其相关联的值代表一个被请求的形式;你可以
    总是在你的浏览器地址栏里有一个地址,你可以看到这个网址,
    然后一个问号(?),其次是键/值对分离的一个符号(&)。运行相同
    在LWP搜索,你使用URI模块组装一个URL嵌入键/值对,
    这是,反过来,通过现有的LWP $浏览器对象。下面是一个简单的例子:

    post 请求:

    use strict;
    use LWP;

    my browser=LWP::UserAgent>new();myresponse= $browser->post(“http://licai.yingyinglicai.com/user/smsVerifySend.do“, [ “mobile” => “18072722237” ]); #多加了

    my response=browser->post(“http://licai.yingyinglicai.com/user/smsVerifySend.do“, [ “mobile” => “13815876250” ]); #多加了

    print $response->content; # 输出获得的网页内容

    Hack 13 Authentication, Cookies, and Proxies

    访问受限制的资源来提供适当的认证令牌,饼干,或代理服务器信息。

    访问公告资源假定你有正确的权限,绝大多数你再网上遇到的,在网络上通常是敞开的,任何访问者 急于满足他的浏览欲望。

    一些网站,但是,需要密码认证在你允许进入前, 还要你提供特殊的文件叫cookie,没有你不会进一步进行。

    Authentication

    许多网站限制访问通过使用HTTP 认证,Web服务器发送一个HTTP的浏览器代码,说:“你正在进入一个受保护的领域,可
    只有rerequesting它随着一些特殊授权的标题。“典型的Web浏览器的交易
    这个请求通过您的用户名/密码的提示,如图2−1所示,通过
    无论您在适当的身份验证头中输入到网络服务器

    例如,unicode.org管理员 阻止邮件被机器人搜索,通过使用username and password

    如果你访问这个网址,你将被提示输入用户名和密码:

    比如登入人人网:

    !/usr/bin/perl

    Copyright 2014 tkorays. All rights reserved.

    author tkorays

    email tkorays@hotmail.com

    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 ua=LWP::UserAgent>new;ua->agent(“Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0”);
    my cookiejar=HTTP::Cookies>new(file=>lwpcookies.txt,autosave=>1,ignorediscard=>1);ua->cookie_jar(cookiejar);homepage = $ua->get(‘http://www.renren.com/home‘);
    print $homepage->decoded_content;
    [root@dr-mysql01 renren]# perl a2.pl | grep ‘李静’
    Wide character in print at a2.pl line 23.

    此时没有登录网站,拿不到信息


    [root@dr-mysql01 renren]# cat a1.pl

    !/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=zhao.yangjian@163.com;mypassword = ‘1985724’;
    my domain=renren.com;myhostid=”;
    my requestToken=;myrtk=”;
    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 cookiejar=HTTP::Cookies>new(file=>lwpcookies.txt,autosave=>1,ignorediscard=>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,确定是否登陆成功

    print “————— ”;
    print $res->header(‘Location’);
    print “————— ”;

    if($res->header(‘Location’) eq ‘http://www.renren.com/Home.do‘){
    print ‘login ok…’,” ”;
    homepage=ua->get(‘http://www.renren.com/home‘);
    print $homepage->decoded_content;
    }else{
    exit;
    }
    [root@dr-mysql01 renren]# perl a1.pl | grep ‘李静’
    Wide character in print at a1.pl line 51.
    李静 



    You have mail in /var/spool/mail/root

    此时登录成功,拿到信息

    Enabling Cookies 启用cookies

    你知道那些卡片由你当地的洗车场提供,提供披萨,或理发师— 你第一次去的时候选的, 他们在你每次拜访的时候都在?

    如果你幸运的话, 你有一个免费的洗车,薄片 或理发10, 20, 或者不管多少邮票。 现在想象 你有一个对那些受欢迎的网站的卡片。

    这背后有个想法,cookies—a cookie jar 填充了 magic cookies 厚厚的用标示符和 信息 。

    cookies 是通过你流量网站产生的文本,你的浏览器跟踪这些,在你下次访问的时候提供合适的站点。

    一些cookie 简单地跟踪你当前会话并没有保持很长的时间。 其他的跟踪取决你的喜好 从访问到访问。

    还有一些持有辨认信息和身份认证令牌,你通常会发现那些。

    这些神奇的cookies 的魔力是, 所有这一切发生在膜厚,你的流管理管理你获得的,提供的,维护所有的cookies.

    大多数浏览器实际上允许你再你的 cookie jar里的内容看一看(在MAC OS Safari
    X:Safari的偏好, 安全显示Cookies;在任何平台上的Mozilla: 工具 Cookie 管理器 管理存储的cookie;

    ; Internet Explorer on Windows: depends on OS/browser
    version,但是通常,一个文件夹叫做临时的互联网文件或者 你的home目录下的Cookies)

    你甚至可以删除cookies, 改变你的cookie的属性。 你会被警告任何进来的cookies,

    或者真正的拒绝 cookies.

    默认的LWP::UserAgent 对象 就像一个浏览器,它的cookie 支持被关闭。 有多种方式来启动cookie支持,通过设置 LWP::UserAgent

    对象的cookie_jar属性。 一个 cookie jar 是一个对象代表一个小的所有HTTP cookies 的小型数据库。

    使用一个内存里的空的cookie jar, 设置cookie_jar 属性,像这样:

    $browser−>cookie_jar({});

    给cookie jar 一个副本, 从磁盘上的文件读取任何修改被保存回到这个文件,当程序完成运行的时候,设置cookie_jar属性设置:

    use HTTP::Cookies;
    $browser−>cookie_jar( HTTP::Cookies−>new(
    ‘file’ => ‘/some/where/cookies.lwp’, # where to read/write cookies
    ‘autosave’ => 1, # save it to disk when done
    ));

    该文件将在一个LWP-指定的格式, 如果你需要访问cookies 文件,你需要使用HTTP::Cookies::Netscape

    use HTTP::Cookies; # yes, loads HTTP::Cookies::Netscape too
    $browser−>cookie_jar( HTTP::Cookies::Netscape−>new(
    ‘file’ => ‘c:/Program Files/Netscape/Users/DIR−NAME−HERE/cookies.txt’,
    ));

    Hack 14 Handling Relative and Absolute URLs

    处理相对和绝对的网址:

    收集任何相对参考完整的URL,如 “sample/index.html” or “../../images/flowers.gif”, 通过URI的helper 函数:

    偶尔, 当你解析HTML或者接受命令行的输入,你会收到一个相对的URL,一些看起来像 images/bob.jpg 代替更多的指定http://www.example.com/images/bob.jpg

    URI 提供了各种用于访问和修改 URLs部分的方法(如 得到什么类型的URL 是 url>scheme使url−>host 等等)

    use URI; my abs=URI>newabs(maybe_relative, $base);

    Hack 15 Secured Access and Browser Attributes 安全访问和浏览器属性:

    如果你正在计划访问 安全资源, 例如你的网上银行,内部网 ,你需要一个安全的LWP连接发送和接收数据。

    有些网站提供了一些重要的数据,简单的密码认证不能提供安全需要。例如,一个银行网站, 使用用户名和密码系统,以确保你说你是谁,

    但他们也会加密所有的流量从你的电脑到他们那。通过这样, 他们确保一个恶意的用户不能嗅到数据,你发送信用卡信息,

    账户历史和社交的安全数字。防止这种不必要的窥探,使用加密,服务器安装SSL 证书。

    你可以通过它的网址告诉一个安全站点: 它将开始https://

    你访问一个HTTPS 的URL时,就像一个HTTP URL,但如果你的LWP 安装有HTTPS支持:

    !/usr/bin/perl −w

    use strict;
    use LWP 5.64;
    my $url = ‘https://www.paypal.com/‘; # Yes, HTTPS!
    my browser=LWP::UserAgent>new;myresponse = browser>get(url);
    die “Error at url ",response−>status_line,
    “ Aborting” unless response>issuccess;printWhee,itworked!Igotthat,response−>content_type, ” document! ”;

    #

    !/usr/bin/perl −w

    use LWP::UserAgent;

    my ua=LWP::UserAgent>new;ua->timeout(10);
    ua>envproxy;ua->agent(“Mozilla/8.0”);

    my response=ua->get(‘https://zjcap.cn‘);

    if (response->is_success) {  
     print
    response->decoded_content; # or whatever
    }
    else {
    die $response->status_line;
    }

    如果你的LWP 没有安装HTTPS 支持, 脚本的响应会不成功,你会收到这个错误信息:
    Error at https://www.paypal.com/
    501 Protocol scheme ‘https’ is not supported

    如果你安装LWP 有HTTPS支持, 然后回应应该成功。

    关于安装HTTPS 支持你的LWP安装信息, 查看README.SSL 帮助文档。

    其它的浏览器属性:

    LWP::UserAgent 对象有很多的属性来控制它们如何工作:

    $browser−>timeout(15)

    设置此浏览器在15秒内不回答请求放弃:

    $browser−>protocols_allowed([‘http’,’gopher’]:

    设置浏览器对象不说出任何协议 相比HTTP和gopher,如果浏览器
    试图访问任何其他类型的URL(如FTP地址::,,或新闻:URL),那么它就不会
    其实尝试连接,但会立即返回一个错误代码500,与一个消息
    像“访问FTP地址已被禁用。

    Hack 16 Respecting Your Scrapee’s Bandwidth 关心你的挖的带宽

    做一个更好的网络公民,通过减少远程网站上的负载,确保你只下载改变的内容,或通过支持压缩。

  • 相关阅读:
    Raft Consensus Algorithm 分布式系统一致性协议
    Dynamic Programming 类问题的空间优化方法
    Bellman–Ford and SPFA Algorithm
    K8S
    SegmentTree
    TCP TIME_WAIT 状态
    When does locking or MVCC occur? Where do I need to specify which one the database should use?
    神经网络的工作原理
    React Native:State 及其 生命周期
    Css Animation
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351514.html
Copyright © 2011-2022 走看看