Python爬虫入门笔记 urllib, urllib2

非教程,笔记而已。

抓包(packet capture)

就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。

常用http应答码
  • 2xx:成功
  • 200:请求成功
  • 206:partial content 客户发送了一个带有Range头的GET请求,服务器完成了它。
  • 3xx:重定向
    • 301:Moved Permanently 所请求的页面已经转移至新的url。
    • 303:See Other 所请求的页面可在别的url下被找到。
    • 304:Not modified 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
  • 4xx:客户端错误
    • 400:Bad Request 服务器未能理解请求。
    • 404:Not Found 服务器无法找到被请求的页面。
  • 5xx:服务端错误
    • 500:Internet Server Error 请求未完成。服务器遇到不可预知的情况。
    • 501:Not Implemented 请求未完成。服务器不支持所请求的功能。
URL
  • URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。
  • URL由协议、路径、参数组成。
  • [关于URL编码]
URL格式:prot_sch://net_loc/path;params?query#frag

prot_sch:网络协议或者下载规划
net_loc:服务器位置(或许也有用户信息)
path:斜杠( / )限定文件或者 CGI 应用程序的路径。
Params:可选参数
query:连接符( & )连接键值对
frag:拆分文档中的特殊锚

Cookies
  • cookies中文名称为小型文本文件,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
  • 客户端发送cookies时:cookies信息片断以"键/值"对(key-value pairs)的形式储存,一个"键/值"对仅仅是一条命名的数据;
  • 服务器端保存cookies时:Set-Cookies:key1 = value1; path = /; domain = xx
  • cookies的应用
  • 小结:
    • 服务器在客户端存储的信息;
    • 请求时,客户端需要把未曹氏的cookies发送回给客户端;
    • 应答时,服务器会把新的cookies发给客户端,一边下次请求时带上这些cookies;
urllib urllib2差异
  • urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接收一个URL。这意味着,你不能伪装你的用户代理字符串等。
  • urllib模块可以提供进行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具有这样的功能。这就是urllib与urllib2经常在一起使用的原因。
urllib.urlopen(url, data=None, proxies=None, context=None)
  • 创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据;参数proxies用于设置代理。
  • urlopen返回一个类文件对象;它提供了如下方法:
    • read() , readline() , readlines(),fileno()和close(): 这些方法的使用与文件对象完全一样。
    • info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息。
  • getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。
  • geturl():返回请求的url地址。
urllib.urlopen(url, data, timeout)
  • 第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。
  • 第二三个参数是可以不传送的,data默认为空None,timeout默认为 socket._GLOBAL_DEFAULT_TIMEOUT
  • 第一个参数URL是必须要传送的,在这个例子里面我们传送了百度的URL,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面。
urllib.urlretrieve(url[, filename[, reporthook[, data]]])
  • urlretrieve() 方法直接将远程数据下载到本地。
  • 参数 finename 指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
  • 参数 reporthook 是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
    • 参数1:当前传输的块数
    • 参数2:块大小
    • 参数3:数据总大小
  • 参数 data 指 post 到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename 表示保存到本地的路径,header 表示服务器的响应头。
  • 返回(filename, HTTPMessage)
>>> import urllib
>>> def progress(a, b, c):  
    '''回调函数 
    @a: 已经下载的数据块 
    @b: 数据块的大小 
    @c: 远程文件的大小 
    '''  
    per = 100.0 * a * b / c  
    if per > 100:  
        per = 100  
    print '%.2f%%' % per
    
>>> url = 'http://www.google.com'
>>> fname = 'd://google.html'
>>> urllib.urlretrieve(url, fname, reporthook=progress)
-0.00%
-819200.00%
-1638400.00%
-2457600.00%
('d://google.html', )
urllib.urlencode
  • 把字典数据转换为url编码(相当于把你想要请求的数据合成为url)
  • 用途:
    • 对url参数进行编码
    • 对post上去的form数据进行编码
urlparse.parse_qs

把url编码转化为字典数据(恰好和urlencode相反)

urllib2.urlopen(url, [,data, [timeout]])
  • urlopen()是最简单的请求方式,它打开url并返回类文件对象,并且使用该对象可以读取返回的内容。参数url可以是包含url的字符串,也可以是urllib2.request类的实例。data是经过编码的post数据(一般使用urllib.urlencode()来编码)。timeout是可选的超时期(以秒为单位),供所有阻塞操作内部使用。
  • 假设urlopen()返回的文件对象u,它支持下面的这些常用的方法:
  • u.read([nbytes]) 以字节字符串形式读取nbytes个数据
  • u.readline() 以字节字符串形式读取单行文本
  • u.readlines() 读取所有输入行然后返回一个列表
  • u.close() 关闭链接
  • u.getcode() 返回整数形式的HTTP响应代码,比如成功返回200,未找到文件时返回404
  • u.geturl() 返回所返回的数据的实际url,但是会考虑发生的重定向问题
  • u.info() 返回对象的字典对象,该字典描述了获取的页面情况。该对象带有与url关联的信息,对HTTP来说,返回的服务器响应包含HTTP包头。对于FTP来说,返回的报头包含'content-length'。对于本地文件,返回的报头包含‘content-length’和'content-type'字段。
urllib2.Request (url [data,headers [,origin_req_host ,[unverifiable]]]])

对于比较简单的请求,urlopen()的参数url就是一个代表url的但如果需要执行更复杂的操作,如修改HTTP报头,可以创建Request实例并将其作为url参数。

  • url为url字符串
  • data是伴随url提交的数据(比如要post的数据)。不过要注意,提供data参数时,它会将HTTP请求从'GET'改为‘POST’。
  • headers是一个字典,包含了可表示HTTP报头的键值映射(即要提交的header中包含的内容)。
  • originreqhost通常是发出请求的主机的名称,如果请求的是无法验证的url(通常是指不是用户直接输入的url,比如加载图像的页面中镶入的url),则后一个参数unverifiable设为TRUE。

假设Request实例r,其比较重要的方法有下面几个:

  • r.add_data(data) 向请求添加数据。如果请求是HTTP请求,则方法改为‘POST’。data是向指定url提交的数据,要注意该方法不会将data追教导之前已经设置的任何数据上,而是使用现在的data替换之前的。
  • r.add_header(key, val) 向请求添加header信息,key是报头名,val是报头值,两个参数都是字符串。
  • r.addunredirectedheader(key, val) 作用基本同上,但不会添加到重定向请求中。
  • r.set_proxy(host, type) 准备请求到服务器。使用host替换原来的主机,使用type替换原来的请求类型。
opener

urllib2.urlopen()函数不支持验证、cookie或者其它HTTP高级功能。要支持这些功能,必须使用build_opener()函数创建自定义Opener对象。

install_opener(opener)

安装opener作为urlopen()使用的全局URL opener,即意味着以后调用urlopen()时都会使用安装的opener对象。opener通常是build_opener()创建的opener对象。

build_opener([handler1 [ handler2, ... ]])

参数handler是Handler实例,常用的有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler等。
build_opener ()返回的对象具有open()方法,与urlopen()函数的功能相同。

# 如果要修改http报头,可以用:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')
密码验证(HTTPBasicAuthHandler)
  • HTTPBasicAuthHandler()处理程序可用add_password()来设置密码。
  • h.add_password(realm,uri,user,passwd)
  • realm是与验证相关联的名称或描述信息,取决于远程服务器。uri是基URL。user和passwd分别指定用户名和密码。
import urllib2
auth=urllib2.HTTPBasicAuthHandler()
auth.add_password('Administrator','http://www.example.com','Dave','123456')
opener=urllib2.build_opener(auth)
u=opener.open('http://www.example.com/evilplan.html')

你可能感兴趣的:(Python爬虫入门笔记 urllib, urllib2)