系统学习下python网络爬虫的知识


1、爬虫的定义


Web Spider,把互联网定义为一个蜘蛛网,网络蜘蛛通过网页的链接地址来寻找网页。


具体过程:从网站的某一个网页(通常是首页)开始,读取网页的内容,找到在网页中的其他链接地址,然后通过这些链接地址寻找下一个页面,这样一直循环下去,直到所有的网页都抓取完成为止。


其实,网络爬虫就是一个爬行程序,一个抓取网页的程序。我们如何才能找到自己想要的网页和去掉网页中其他不相关的部分?我们首先得找到自己想要的网页的URL.


2、浏览网页的过程


抓取网页的过程其实就是浏览器作为一个浏览的客户端,向服务器端发送了一次请求,把服务器端的文件抓到本地,再进行解释、展现。


HTML语言是一种标记语言,用标签标记内容并加以解析和区分。浏览器的功能是将获取到的HTML代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。


3、URL


uniform resource locator的缩写,统一资源定位符。

URL的格式由三部分组成: 

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

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

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

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

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

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


4、python中的urllib2模块抓取制定URL网页内容


我们所说的网页抓取工作,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。


urllib2是python的一个模块,使用函数urlopen获取网页源代码。

eg,最简单的应用代码:

import urllib2
response = urllib2.urlopen('https://gendertrender.wordpress.com/')
content = response.read()
print(content)

urllib2用一个Request对象来映射设置好的HTTP请求,并且用这个地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求request对象,然后可以在Request中调用read()。

import urllib2
res = urllib2.Reaquest('https://gendertrender.wordpress.com/')
response = urllib2.urlopen(req)
content = response.read()
print(content)

5、HTTP请求的操作


在HTTP请求时,可以额外做的两件事情。


a、发送data表单数据


发送一些数据到URL,比如用户登录信息,我们在抓取网页的过程中,有时候会涉及到登陆以后显示内容的网站,这个时候就会用到发送账号数据到URL。一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。编码工作使用urllib的函数而非urllib2。

import urllib
import urllib2
url = 'http://www.baidu.com/register.cgi'
values = {'user':'qester'
  'pwd':'******'}
data = urllib.urlencode(values)#对values进行编码encode
req = urllib2.Request(url,data)
response = urllib2.urlopen(req)
content = response.read()
print content


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


b、设置Headers和http请求


有一些站点不喜欢被程序访问,或者发送不同的版本到不同的浏览器。默认的urllib2是以"python-urllib/x.y"的身份进行访问的。对于这个身份站点会有不同的操作。对于这个情况,我们可以请求对象一个包含头数据的字典。把自己伪装起来。

import urllib    
import urllib2    
  
url = 'http://www.baidu.com/register.cgi'  
  
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
values = {'name' : 'qester',    
          'location' : 'SDU',    
          'language' : 'Python' }    
  
headers = { 'User-Agent' : user_agent } #把自身伪装成一个IE浏览器
data = urllib.urlencode(values)    
req = urllib2.Request(url, data, headers)    
response = urllib2.urlopen(req)    
the_page = response.read()


6、异常的处理和HTTP状态码的分类


当urlopen不能够处理一个response时,产生urlError。HTTPError是urlError的子类,通常在特定的HTTP URLs中产生。


a、URLError

URLError在没有网络连接或者服务器不存在的情况下产生。异常会带有"reason"属性,它是一个tuple,包含了一个错误号和一个错误信息。


b、HTTPError

假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理。其他不能处理的,urlopen会产生一个HTTPError。典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。HTTP状态码表示HTTP协议所返回的响应的状态。比如客户端向服务器发送请求,如果成功地获得请求的资源,则返回的状态码为200,表示响应成功。如果请求的资源不存在, 则通常返回404错误。


一般处理这两个异常最常用的方法如下:

from urllib2 import Request, urlopen, URLError, HTTPError  
req = Request('http://bbs.csdn.net/callmewhy')  
try:    
    response = urlopen(req)    
except URLError, e:    
    if hasattr(e, 'code'):    
        print 'The server couldn\'t fulfill the request.'    
        print 'Error code: ', e.code    
    elif hasattr(e, 'reason'):    
        print 'We failed to reach a server.'    
        print 'Reason: ', e.reason       
else:    
    print 'No exception was raised.'