[python]爬虫之urllib使用

之前一直在复习考试,有十来天没敲代码,有些知识遗忘了,今天又把《python 3网络爬虫实战》翻出来重温,同时总结一下套路。早上花了约一个小时把urllib的使用看了一遍。抄录了书上一些代码:
import urllib.request
# 最简单的一个请求如下,打印处理的是使用urllib.request请求到的网页数据
response = urllib.request.urlopen('http://xxx.xxx./')
# decode一开始我使用utf8,然后发现有些没有解码成功,以/x88 编码形式出现,所以使用gbk,这样便能得到网页数据
print(response.read().decode('gbk'))
# 如果想给链接传递一些参数,该怎么实现呢?首先看一下urlopen()函数的API:
# urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)
# data参数使用方法
import urllib.parse
# 将要传的数据转为字节流形式,用到bytes方法
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())
# timeout 参数用于设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间,还没有得到响应,就会抛出异常。
# 用法:
import socket
import urllib.request
import urllib.error
try:
    response = urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('time out')
# 利用urlopen()方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求.如果请求中需要加入Headers等信息,就可以利用更强大的Request类来构建
# Request 可以通过怎样的参数来构造,它的构造方法如下:
# class urllib.request.Request(ur1, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
# 使用代理
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener
proxy_handler = ProxyHandler({'http':'http://127.0.0.1:9743','https':'https://127.0.0.1:9743'
})
opener = build_opener(proxy_handler)
try:
    response = opener.open('https://www.baidu.com')
    print(response.read().decode('utf-8'))
except URLError as e:
    print(e.reason)
# cookies使用
# 先用实例来看看怎样将网站的 Cookies 获取下来,相关代码如下:
import http.cookiejar, urllib.request
filename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
# cookie = http.cookiejar.LWPCookieJar(filename)保存成LWP格式的Cookies 文件
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)
# 读取利用cookies文件
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
# 这里调用load()方法来读取本地的Cookies文件,获取到了Cookies的内容。不过前提是我们首先生成了LWPCookieJar格式的Cookies,并保存成文件,然后读取Cookies 之后使用同样的方法构建Handler和 Opener 即可完成操作
# 处理异常
# URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由 request模块生的异常都可以通过捕获这个类来处理。下面是一种比较好的异常处理写法,可以做到先捕获 HTTPError。获取它的错误状态码、原因、 headers等信息。如果不是HTTPError异常,就会捕获 URLError 异常,输出错误原因。最后,用else 来处理正常的逻辑,这是一个较好的异常处理写法。
from urllib import request, error
try:
#以书中例子为例
    response = request.urlopen('https://cuiqingcai.com/index.htm')
except error.HTTPError as e:
    print(e.reason, e.code, e.headers, sep='\n')
except error.URLError as e:
    print(e . reason)
else:
    print('Request Successfully')

# urllib库里还提供了 parse 模块,它定义了处理 URL 的标准接口,例如实现 URL 各部分的抽取、合并以及链接转换。
#  urlparse()该方法可以实现 URL 的识别和分段
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html; user?id=5#comment')
print(type(result), result)
# 这里我们利用 urlparse()方法进行了一个 URL 的解析.首先,输出了解析结果的类型,然后将结果也输出出来。运行结果如下:
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc=' www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
# 所以,可以得出一个标准的链接格式,具体如下,利用 urlparse ()方法可以将它拆分开来 。
scheme://netloc/path ;params?query#fragment
# URL 的构造
from urllib.parse import urlunparse
data =['http','www.baidu.com ', 'index.html' , 'user' ,'a=6', 'comment')
print(urlunparse(data))
# 运行结果如下:
http://www.baidu.com/index.html;user?a=6#comment

# urlsplit()
from urllib.parse import urlsplit
result = urlsplit (’ http://www.baidu .com/index.html;user?id=5#comment’)
print(result)
# 也可以用索引来获取 print(result.scheme, result[0])
运行结果如下 :
SplitResult(scheme='http', netloc = 'www.baidu.com', path =' /index.html;user', query = 'id=5',
fragment = 'comment')
# 同理,还有urlunsplit(),跟urlunparse()用法类似
# urljoin()可以完成链接的合并,我们可以提供一个 base_url (基础链接)作为第一个参数,将新的链接作为第二个参数,该方法会分析 base_url 的 scheme ,netloc 和 path 这 3 个内容并对新链接缺失的部分进行补充,最后返回结果 。base_url 提供了三项内容 scheme , netloc 和 path 。如果这 3 项在新的链接里不存在,就予以补充;如果新的链接存在,就使用新的链接的部分。
# 一个常用的方法url_encode(),它在构造 GET 请求参数的时候非常有用
#from urllib.parse import urlencode
params = {
    'name': 'aa',
    'age': 22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)
# 输出为: http://www.baidu.com?name=germey&age=22
#反序列化。如果我们有一串 GET 请求参数,利用 parse_qs()方法,就可以将它转回字典
# from urllib.parse import parse_qs
# query= 'name=germey&age=22'
# print(parse_qs(query))
# 运行结果如下:
# {'name': ['germey'],'age': ['22']}
# 另外,还有一个parse_qsl()方法,它用于将参数转化为元组组成的列表
# quote() 该方法可以将内容转化为 URL 编码的格式。URL中带有中文参数时,有时可能会导致乱码的问题,此时用这个方法可以将巾文字符转化为 URL 编码,示例如下:
# from urllib.parse import quote
# keyword = '壁纸'
# url = 'https://www.baidu.com/s?wd=' + quote(keyword)
# print(url)
# 有了 quote()方法,当然还有unquote()方法,它可以进行 URL 解码,示例如下:
# from urllib.parse import unquote
# url = 'https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8'
# print(unquote(url))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值