首页 > 代码库 > ┱Python中关于urllib和urllib2的问题

┱Python中关于urllib和urllib2的问题

python3对urllib和urllib2进行了重构
主要拆分成了:
1、urllib.request
  1、urllib.request.Request(url, data=http://www.mamicode.com/None, headers={}, method=None)

url = rhttp://www.lagou.com/zhaopin/Python/?labelWords=label
headers = {
User-Agent: rMozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
rChrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3,
 Referer: rhttp://www.lagou.com/zhaopin/Python/?labelWords=label,
 Connection: keep-alive
}
req = request.Request(url, headers=headers)
page = request.urlopen(req).read()
page = page.decode(utf-8)

用来包装头部的数据:
User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
Connection:表示连接状态,记录Session的状态。
  2、urllib.request.urlopen(url, data=http://www.mamicode.com/None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
    url:需要打开的网址urllib.request.urlopen(‘https://www.baidu.com/‘)

 from urllib import request
 response = request.urlopen(rhttp://python.org/) # <http.client.HTTPResponse object at 0x00000000048BC908> HTTPResponse类型
page = response.read()
page = page.decode(utf-8)

#此处为何不用page.encode(‘utf-8‘)
#decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312‘),表示将gb2312编码的字符串str1转换成unicode编码。
#encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312‘),表示将unicode编码的字符串str2转换成gb2312编码。
urlopen返回对象提供方法:
read()#读取整个文件 ,
readline()#每次读取一行内容 ,
readlines()#读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。
fileno()#方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
close() :关闭文件
info():返回HTTPMessage对象,表示远程服务器返回的头信息
getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
geturl():返回请求的url

    data:post提交的数据
    timeout:设置网站的访问超时时间
  3、urllib.request.ProxyHandler()

data =http://www.mamicode.com/ {
         first: true,
         pn: 1,
         kd: Python
     }
proxy = request.ProxyHandler({http: 5.22.195.215:80})  # 设置proxy
opener = request.build_opener(proxy)  # 挂载opener
request.install_opener(opener)  # 安装opener
data = parse.urlencode(data).encode(utf-8)
age = opener.open(url, data).read()
page = page.decode(utf-8)
return page

 

2、urllib.urlretrieve(url[, filename[, reporthook[, data]]]):

urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度,下面的例子会展示。参数data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。下面通过例子来演示一下这个方法的使用,这个例子将新浪首页的html抓取到本地,保存在D:/sina.html文件中,同时显示下载的进度。

def cbk(a, b, c):
  ‘‘‘回调函数
  @a: 已经下载的数据块
  @b: 数据块的大小
  @c: 远程文件的大小
  ‘‘‘
  per = 100.0 * a * b / c
  if per > 100:
    per = 100
  print (‘%.2f%%‘ % per)

url = ‘http://www.sina.com.cn‘
local = ‘d://sina.html‘
urllib.urlretrieve(url, local, cbk)


3、urllib.parse
  1、urllib.parse.urlencode()#将提交的数据encode为byte编码
4、urllib.error等几个子模块。#抛出请求错误

import urllib
from urllib import parse
from urllib import request


def get_page(url):
    headers = {
          User-Agent: rMozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
                      rChrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3,
         Referer: rhttp://www.lagou.com/zhaopin/Python/?labelWords=label,
          Connection: keep-alive
    }
    data = {
         first: true,
         pn: 1,
         kd: Python
    }
    data = parse.urlencode(data).encode(utf-8)
    req = request.Request(url, headers=headers)
    try:
        page = request.urlopen(req, data=http://www.mamicode.com/data).read()
        page = page.decode(utf-8)
        print(page)
    except error.HTTPError as e:
        print(e.code())
        print(e.read().decode(utf-8))
    return page
get_page(https://www.baidu.com/)

 

┱Python中关于urllib和urllib2的问题