您的位置:首页 > 编程语言 > Python开发

随手记录--爬虫基本概念

2017-05-01 21:01 176 查看
爬虫

    Web spider,网络蜘蛛,通过网页的链接地址来寻找网页,从某一页面开始,读取网页内容,找到网页的其他链接地址,一直循环下去,基本操作就是抓取网页。浏览器的功能就是将获取的HTML代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。大部分网站都会定义robots.txt文件,这样有利于让爬虫了解爬去该网站存在那些限制。

爬取网站的常用方法:

(1)爬取网站地图

(2)便利每个网页的数据库ID

(3)跟踪网页链接

(4)连接网页,搜去自己所需要的内容,然后根据需要筛选

附robots.txt代码:

#section1禁止用户代理为BadCrawler                       User-agent:BadCrawler

Disallow: /

#section2:无论哪种用户代理都应该在两次下载请求之间黑出五秒的抓取延迟以免服务器过载

User-agent:*

Disallow:/trap

#section3:网站地图,可以帮助爬虫定位网站最新的内容

Sitemap:http:/xxxxxxxxx.com/sitemap.xml

URI:

    一个字符串,Web上的资源都是通过一个通用资源标识符来定位,URI有三部分组成:(1)访问资源的命名机制;(2)存放资源的主机名;(3)资源自身的名称,有路径表示。例如:https://douyu.com/93912

URL:URL是URI的一个子集。它是Uniform Resource Locator的缩写,译为“统一资源定位 符”。通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。,除了"http:",URL同样可以使用"ftp:","file:"等等来替代。HTTP是基于请求和应答机制的:客户端提出请求,服务端提供应答。URL的一般格式为(带方括号[]的为可选项):

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

组成:

(1)第一部分是协议(或称为服务方式)

(2)第二部分是存有该资源的主机IP地址(有时也包括端口号)

(3)第三部分是主机资源的具体地址,如目录和文件名等。

第一部分和第二部分用“://”符号隔开,

第二部分和第三部分用“/”符号隔开。

第一部分和第二部分是不可缺少的,第三部分有时可以省略。 

URL和URI的比较:URI属于URL更低层次的抽象,一种字符串文本标准。换句话说,URI属于父类,而URL属于URI的子类。URL是URI的一个子集。

URI的定义是:统一资源标识符;

URL的定义是:统一资源定位符。

二者的区别在于,URI表示请求服务器的路径,定义这么一个资源。而URL同时说明要如何访问这个资源(http://)。

例子:

1.HTTP协议的URL示例:

使用超级文本传输协议HTTP,提供超级文本信息服务的资源。 

例:http://www.peopledaily.com.cn/channel/welcome.htm

2.文件的URL

用URL表示文件时,服务器方式用file表示,后面要有主机IP地址、文件的存取路 径(即目录)和文件名等信息。

有时可以省略目录和文件名,但“/”符号不能省略。 

例:file://ftp.yoyodyne.com/pub/files/foobar.txt 

上面这个URL代表存放在主机ftp.yoyodyne.com上的pub/files/目录下的一个文件,文件名是foobar.txt。

检查网站构建的技术类型——builtwith,安装方法:pip install builtwith,该模版将URL作为参数,下载该URL并对其进行分析,然后返回该网站实用的技术,

附源码:

import builtwith

builtwith.parse('http://xxxxx.com')

寻找网站的所有者——WHOIS协议,安装方法:pip install python-whois

附源码:

import whois

print whois.whois(' .com')

urllib2,是Python的一个获取URLs(Uniform Resource Locators)的组件。

它以urlopen函数的形式提供了一个非常简单的接口。

urllib2用一个Request对象来映射你提出的HTTP请求。在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read();要获取真正的地址防止重定向需要使用geturl()方法:urlopen(Request(url)).geturl();info()方法返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage
实例。经典的headers包含"Content-length","Content-type",和其他内容,urlopen(Request(url)).info()。

附源码:

(1)import urllib2  

response = urllib2.urlopen('http://www.baidu.com/')  

html = response.read()  

print html

(2)import urllib2    

req = urllib2.Request('http://www.baidu.com')    

response = urllib2.urlopen(req)    

the_page = response.read()    

print the_page  

(3)req = urllib2.Request('ftp://example.com/') 

(4)import urllib2  #支持重新下载错误发生在5xx的url

def download(url,user_agent='wswp',num_retries=2)

    print url

    headers={'User-agent': user_agent}

    request=urllib2.Request(url,headers=headers)

    try:
html=urllib2.urlopen(request).read()

    except urllib2.URLError as e:
print e.reason  #4xx为请求存在问题
html = None  #5xx为服务器端存在问题

    if num_retries > 0;
if hasattr(e,'code') and 500<= e.code <600
return download(url,user_agent,num_retries-1)
return html

在HTTP请求时,允许你做额外的两件事。

1.发送data表单数据,在HTTP中,这个经常使用熟知的POST请求发送。这个通常在你提交一个HTML表单时由你的浏览器来做。

并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象,编码工作使用urllib的函数而非urllib2。

附源码:

import urllib    

import urllib2    

url = 'http://www.someserver.com/register.cgi'      

values = {'name' : 'WHY',    

          'location' : 'SDU',    

          'language' : 'Python' }     

data = urllib.urlencode(values) # 编码工作  

req = urllib2.Request(url, data)  # 发送请求同时传data表单  

response = urllib2.urlopen(req)  #接受反馈的信息  

the_page = response.read()  #读取反馈的内容  

如果没有传送data参数,urllib2使用GET方式的请求。

GET和POST请求的不同之处是POST请求通常有"副作用",

它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。Data同样可以通过在Get请求的URL本身上面编码来传送。

2.设置Headers到http请求

URLError:在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),

包含了一个错误号和一个错误信息。e.reason

HTTPError:服务器上每一个HTTP 应答对象response包含一
4000
个数字"状态码"。有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答。包含read、geturl、info方法,这里要注意的一点,except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError 。

例如:假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理。其他不能处理的,urlopen会产生一个HTTPError。

典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。

HTTP状态码表示HTTP协议所返回的响应的状态。

HTTP状态码通常分为5种类型,分别以1~5五个数字开头,由3位整数组成:200:请求成功      处理方式:获得内容,处理 

201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到    处理方式:爬虫中不会遇到 

202:请求被接受,但处理尚未完成    处理方式:阻塞等待 

204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。    处理方式:丢弃

300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。    处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃

301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源    处理方式:重定向到分配的URL

302:请求到的资源在一个不同的URL处临时保存     处理方式:重定向到临时的URL 

304 请求的资源未更新     处理方式:丢弃 

400 非法请求     处理方式:丢弃 

401 未授权     处理方式:丢弃 

403 禁止     处理方式:丢弃 

404 没有找到     处理方式:丢弃 

5XX 回应代码以“5”开头的状态码表示服务器端发现自己出现错误,不能继续执行请求    处理方式:丢弃

三种网页抓取(某些数据)的方法:

(1)正则表达式:

import re      

re.findall(' ',html)

(2)BeautifulSoup模块

    该模版可以解析网页,用pip install beautifulSoup4安装,使用的第一步是将已下载的HTML内容解析为soup的文档,需要对其实际格式进行确定

from bs4 import BeautifulSoup

BeautifulSoup(' ','html.parser').prettify()

也可以使用find()和find_all()方法来定位我们需要的元素

(3)lxml模版

Lxml是基于libxml2这一XML解析库的Python封装,使用lxml模版的第一步也是将有可能不合法的HTML解析为统一的格式,lxml也可以正确解析属性两侧缺失的引号,并闭合标签,不过该模块没有额外添加<html>和<body>标签,解析完输入内容之后,进入选择元素的步骤,此时lxml有几种不同的方法,比如Xpath选择器和类似于BeautifulSoup的find()方法,可以使用CSS选择器:lxml.html.fromstring(html).cssselect(' '),CSS选择器表示选择元素所使用的模式,常见示例如下:

(1)选择所有标签:*

(2)选择<a>标签:a

(3)选择所有class="link”的元素:.link

(4)选择id="home"的<a>标签:a#home

(5)选择父元素为<a>标签的所有<span>子标签:a > span

(6)选择<a>标签内部的所有<span>标签: a span

(7)选择title属性为“Home”的所有<a>标签:a[titlr=Home]

性能比较:BeautifulSoup较其他两种方式要慢很多,在lxml搜索元素之前,必须将输入解析为内部格式,因此产生额外的开销,二档抓取同意网页的多个特征时,这种初始化解析产生的开销会降低。

正则表达式 性能快
使用困难 内置模块

BeautifulSoup 性能慢
使用简单 安装简单

LXML 性能块
使用简单 安装相对困难

这个没搞懂:http://blog.csdn.net/pleasecallmewhy/article/details/8924889

urllib2的使用细节

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 爬虫