爬虫笔记课后习题1

1.什么是爬虫?

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫

2.什么是聚焦爬虫

聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫[8]。 和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求

3.什么是http协议?

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。

工作原理:

一次HTTP操作称为一个事务,其工作过程可分为四步:
首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客
  http工作流程图
户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,由显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。在Internet上,HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP 80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。
这个过程就好像我们打电话订货一样,我们可以打电话给商家,告诉他我们需要什么规格的商品,然后商家再告诉我们什么商品有货,什么商品缺货。这些,我们是通过电话线用电话联系(HTTP是通过TCP/IP),当然我们也可以通过传真,只要商家那边也有传真。
 
4.什么是url?
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。[1] 
它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准RFC1738了。
 
5.URL的基本构成是怎样的?
三部分组成:协议类型,主机名和路径及文件名.
通过URL有:http、ftp、gopher、telnet、file等.
(以下是粘贴复制的,仅供参考)

URL的结构介绍

URL的结构,关于这方面的blog也能一搜一大把。。。最近也在看方面的基础,也记录下。。。

参考:Web之困

  1. 什么是URL

URL(Uniform Resource Locator)统一资源定位符,就是由一串简单的文本字符组成。一条符合规范的URL对应的是服务器的一个特定的资源(如HTML页面,一张图片等)。

Scheme:

//

Login:password@

Address

:port

/path/to/resource

?query_string

#fragment

按照完整的URL的结构定义,一共分成上述8个部分,其中各部分有着一定的特征,并且有些部分是必须的,有些是可选的。而标准的定义与浏览器对这些标准的实现又有着很大的差异。

Scheme部分:协议部分。

      协议名称是由一串不区分大小写的字母组成,以 作为结束符。协议所表示的是获取该资源需要使用的协议。如HTTP、HTTPS等。而浏览器将支持一些额外的协议,如data:和javascript:等。

 

//部分:层级URL标识符号

      基本上每个URL中都会包含这个符号,是固定的;可以理解为把协议与后面的信息进行分隔开的一个符号。按照书上的说明,一个好处是Web应用无需关注某个协议的具体实现,而只需要关注于’//’符号后面的指向地址即可。

      但是也存在这非层级结构的URL:例如,mailto:协议。当使用

mailto:user@example.com?....的时候,该URL将能够传递到默认的邮件客户端程序而无需其他的解析。

 

Login:password@部分:身份验证

      其实这一块信息我们看到的比较少,这是一个可选部分,一般的协议(httphttps之类)都会使用默认的匿名形式进行数据获取,该部分使用的是@作为该部分的结束符号。

 

Address部分:服务器地址

      这是一个很关键的部分,这关系到你需要从哪个服务器上去获取资源。而我们看到的比较多的是这部分以域名(htc.org)的形式呈现,还有以Ipv4(220.181.111.188)的地址呈现。当然也能够以Ipv6的形式呈现。

      按照标准的描述是这部分只能用:数字、“.”、“-”组成。但浏览器对这支持的字符会比较多。

 

Port部分: 服务器端口

      这里是属于网络端口,16位, 因此可选为[0~2^16),这里的端口并不是物理端口,而是逻辑端口;只要是为了处理多进程时数据进行传输的时候,保证各进程中数据不会发生紊乱,能够传送到相应的进程中所设定的(参考:http://baike.baidu.com/link?url=MDeMzLjNepWAvUUhGaHPFZMnUk8z3oFGIVz_qqPkOr_HEFxGDf6Gf5pdJd7lVc_XOAfgta2D0augSiFRadL0Kq

不同网络协议都有自己特定的端口号:如http 80

 

/path/to/resource:文件路径

      前面提到的URL指向的是一个唯一确定的资源,而这里指向的是资源的完整路径(即存储的位置),一般都是用 / 进行分层描述。

 

?query_string:查询字符串

      这里的查询字符串是用于参数传递给服务器端。但标准没有对这一部分有着特别严格的规定。这一部分是以 ? 开始作为标识,而现在一般的用法都是类似于以下的形式,?name=hello&id=5&… ,并且这种用法也被服务器端语言(如PHP等)所支持,如PHP获取该查询值的方法是:

$_GET['id']
$_POST['id']

#fragment: 片段ID

      该部分与上面的?后面的表单信息本质的区别就是这部分内容不会被传递到服务器端。一般用于页面的锚。就是我们常见的网站右下脚一般有一个回到顶部的按钮,一般就是使用其实现的。

例如:

复制代码
<!DOCTYPE HTML>
<html>
    <head>
        <title>    return </title>
        <script>
            function file(){
                var xx = "hello<br/>world<br/>" ;
                for( var i = 0; i < 100; i++ ){
                    xx += "<br/>" ;
                }
                xx += "ni<br/>hao<br/>" ;
                document.getElementById('aa').innerHTML = xx ;
            }
        </script>
    </head>
    <body onload = "file();">
        <p> nihao </p>
        <br>
        <br>
        <a name='hello'> hello hello hello </a> <br/>
        <p id = 'aa'>
        </p>
        <a href="#hello"> 返回HELLO </a>
        <a href="#" target="_self">返回顶部</a>
    </body>
</html>
复制代码

Python获取URL并处理

参考:

http://www.cnblogs.com/qq78292959/archive/2013/04/07/3005763.html

http://my.oschina.net/guol/blog/95699

python里面获取这一部分信息使用的是urlparse模块。

解析成为6部分,返回元组(scheme, netloc, path, parameters, query, fragment)

Scheme:

//

Login:password@

Address

:port

/path/to/resource

?query_string

#fragment

复制代码
from urlparse import urlparse


url = "https://www.zhangsanlisi.com/questions/1000;hello_world?id=10&name=zhangsan#hello"

end_url = urlparse(url)

print end_url
复制代码

 

可以与上面对应,其中netloc描述的是包括验证信息+服务器地址+端口号;而params用的比较少,基本上比较难看到,用于指定特定的参数,参考(http://blog.csdn.net/yueguanghaidao/article/details/16368399

用;(分号)作为开始标识。

6.URL的编码规则?

 1)url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况,在服务器端的表单输入格式样子象这样:
theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes
 2)前言
编码问题是JAVA初学者在web开发过程中经常会遇到问题,其中之一是URL中使用中文等非ASCII的字符造成服务器后台程序解析出现乱码的问题。

常见出错部分

也就是容易出现中文字符的部分:
(1)Query String中的参数值
(2)servlet path

常见出错原因

(1)浏览器:我们的客户端(浏览器)本身并没有遵循URI编码的规范。
(2)Servlet服务器:Servlet服务器的没有正确配置。
(3)开发人员并不了解Servlet的规范和API的含义。

servlet规范

(1)HttpServletRequest.setCharacterEncoding()方法 仅仅只适用于设置post提交的requestboda的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。
(2) HttpServletRequest.getPathInfo()返回的结果是由Servlet服务器解码(decode)过的。
(3) HttpServletRequest.getRequestURI()返回的字符串没有被Servlet服务器decoded过。
(4) POST提交的数据是作为request body的一部分。
(5) 网页的Http头中ContentType("text/html; charset=GBK")的作用:
(a) 告诉浏览器网页中数据是什么编码;
(b) 表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。
注意:这里所说的ContentType是指http头的ContentType,而不是在网页中mete中的ContentType。

7.什么是url参数规则?

htttp是最常见的web协议,而http的通信大部分是通过一串URL去表示所有定位的页面

在网络中,URL被定义为统一资源定位符(URL,英语UniformResourceLocator的缩写)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆·伯纳斯-李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为因特网标准RFC1738了。
一般就是
scheme://host:port/prepath/path?param1=value1&param2=value2......
schemem可以是 ftp,http,https;
host默认80,filder默认8888,tomcat默认8080;
今天想说下关于?后面的参数问题
1.一般都是?k=v&k=v&k=v 
2.偶尔也会遇到 ?k=v&&k=v的情况

但是对于2实际是符合http url协议的,他影响的是对于后端的解析字段,对于浏览器来说他关心的是?号前面的内容,对应?后面的内容,是逻辑层的处理。这里要对一些异常情况进行安全性编码,防止数组越界,非空判断等。

8.爬虫都有哪些种类,哪些区别?


1)众所周知,网络爬虫(或称为网络爬虫、网络蜘蛛、机器人)是搜索引擎最上游的一个模块,是负责搜索引擎内容索引的第一关。
很多人为了提高自己网站的索引量,都是去网上随便找一些爬虫工具来使用。但是很多人不知道,这些抓取网站的小爬虫是有各种各样的不同性格的。

常见的优秀网络爬虫有以下几种类型:
1.批量型网络爬虫:限制抓取的属性,包括抓取范围、特定目标、限制抓取时间、限制数据量以及限制抓取页面,总之明显的特征就是受限;
2.增量型网络爬虫(通用爬虫):与前者相反,没有固定的限制,无休无止直到抓完所有数据。这种类型一般应用于搜索引擎的网站或程序;
3.垂直网络爬虫(聚焦爬虫):简单的可以理解为一个无限细化的增量网络爬虫,可以细致的对诸如行业、内容、发布时间、页面大小等很多因素进行筛选。

这些网络爬虫的功能不一,使用方法也不同。例如谷歌、百度搜索就是典型的增量型爬虫,提供大而全的内容来满足世界各地的用户。另外像天猫、京东很多店铺都需要屏蔽外来的抓取,这时就需要爬虫根据一些低级域名的链接来抓取他们进行排名。

后来随着爬虫使用越来越灵活,很多网站都使用多个爬虫同步进行抓取。例如现下很多视频网站,都是先通过一般爬虫或者人工批量抓取内容,然后给用户一些可选项,让客户自己给聚焦爬虫划定范围最后找到匹配度足够高的内容,整个过程极大的降低了资源和时间的消耗。相反如果这些内容全部用聚焦爬虫来完成,不仅要消耗大量的网络资源,而且会延长搜索时间时间,影响客户体验。

2)什么是分布式爬虫 和单机爬虫有什么区别

  分布式爬虫就是多台计算机上都安装爬虫程序,重点是联合采集。单机爬虫就是只在一台计算机上,叫做单机。

前嗅的ForeSpider数据采集系统就有单机和服务器版,比如只在一台服务器上的爬虫,虽然开了多进程,但还是服务器单机的。

但是如果在多个服务器上,并且能够协同采集,就是分布式的。

 
 
 
 
原文地址:https://www.cnblogs.com/GUIDAO/p/6678788.html