# 自定义opener
 
from urllib.request import ProxyHandler,build_opener
from urllib.error import URLError
#设置代理
Proxy_Handler = ProxyHandler({
'http': 'http://127.o.o .1:9743',
'https': 'https://127.0 .0.1:9743'
})
opener = build_opener(Proxy_Handler)
try:
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
 
#获取cookie
import http.cookiejar,urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
print(item.name +'='+item.value)
 
#处理异常
URLError
from urllib import request,error
#打开一个不存在的网页
try:
respense = request.urlopen( 'https://cuiqingcai.com/index.htm')
except error.URLError as e:
print(e.reason)
#reason :同父类一样,用于返回错误的原因
 
因为 URLError 是 HTTP Error 的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,所
以上述代码更好的写法如下:
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')
这样就可以做到先捕获 HTTP Error ,获取它的错误状态码 、原因、 headers 等信息 。 如果不是
HTTP Error 异常,就会捕获 URLError 异常,输出错误原因 。 最后,用 else 来处理正常的逻辑 。 这是一
个较好的异常处理写法 。
有时候, reason 属性返回的不一定是字符串,也可能是一个对象 。 再看下面的实例:
import socket
import urllib.request
import urllib .error
try:
response = urllib.request.urlopen(’ https://WvM.baidu.com’, tim
except l」rllib . err口r.URLError as e:
print(type(e.reason))
if isinstance(e .reason, socket .tir陀out):
print(' TIME OUT')
这里我们直接设置超时时间来强制抛出 timeout 异常 。
运行结果如下:
<class ’ socket .timeout ’>
TIME OUT
可以发现, reason 属性的结果是 socket.timeout 类。 所以,这里我们可以用 is instance ()方法来
判断它的类型,作出更详细的异常判断。
#urlparse()该函数实现url识别与分段
from urllib.parse import urlparse
res = urlparse('https://i.cnblogs.com/EditPosts.aspx?postid=9531564')
print(type(res), res)
结果:
<class 'urllib.parse.ParseResult'> ParseResult(scheme='https', netloc='i.cnblogs.com', path='/EditPosts.aspx', params='', query='postid=9531564', fragment='')
 
from urllib import parse
params = {
'name':'123',
'age':22
}
url = 'http://www.baidu.com?'
n_url = url + parse.urlencode(params)
print(n_url)
结果http://www.baidu.com?name=123&age=22
这个方法非常常用 。 有时为了更加方便地构造参数,我们会事先用字典来表示 。 要转化为 URL
的参数时,只需要调用该方法即可 。
# quote()
该方法可以将内容转化为 URL 编码的格式 。 URL 中带有中文参数时,有时可能会导致乱码的问
题,此时用这个方法可以将巾文字符转化为 URL 编码,示例如下:
from urllib.parse import quote
keyword =’壁纸’
url =’ https://www.baidu.com/s?wd=’+ quote(keyword)
print(url)
这里我们声明了一个中文的搜索文字,然后用 quote ()方法对其进行 URL 编码,最后得到的结果
如下:
https://www.baidu.com/s?wd=%81%E7%BA%B8
#有了 quote ()方法,当然还有 unquote ()方法,它可以进行 URL 解码,示例如下:
from urllib.parse import unquote
url = 'http://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B'
print(unquote(url))

 

爬虫基础之urllib库(代码演示)的更多相关文章

  1. 爬虫基础(1):urllib库

    urllib库 urllib库是python中的一个基本网络请求库.用于模拟浏览器的行为,向指定服务器发送请求,并接收返回的数据. 在python3中所有的网络请求相关函数都集中在urllib.req ...

  2. 爬虫基础之urllib库

    urllib库的基本使用 urlopen() # 导入urllib库 import urllib # 往指定url发送请求,返回一个响应对象 response = urllib.request.url ...

  3. 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础

    第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...

  4. 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...

  5. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  6. 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...

  7. 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...

  8. 第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理

    第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术.设置用户代理 如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执 ...

  9. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

随机推荐

  1. ClientDataSet使用locate或Filter定位到字段为空值的记录

    场景,程序想检查是否存在某个字段的值是空的,如果存在,则不允许增加记录,否则允许增加记录. 解决这个问题,我一开始用了两种错误的方法 if not clientdataset.locate('AFie ...

  2. Metasploit模块简述

    辅助模块.渗透攻击模块.后渗透攻击模块.攻击载荷模块.空指令模块.编码器模块 做了一个思维导图,方便理解. 有需要的就下载吧: 链接:https://share.weiyun.com/5e4XVa1 ...

  3. bzoj2369

    题解: 显然把每一个环求出来 然后做一个lcm即可 代码: #include<cstdio> using namespace std; ],f[],n; int gcd(int x,int ...

  4. servlet的url-pattern的缺省匹配【<url-pattern>/<url-pattern>】

    最近在学习配置springmvc的框架,对配置springMVC时的url用“/”很是疑惑,经查阅前辈文章,学习了servlet的url-pattern匹配规则 <servlet-mapping ...

  5. Object.create()和new object()和{}的区别

    Object.create()介绍 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString ...

  6. RN开发第二天

    今天上午配置了windows的Android的环境,下载node,Python,安装Android SDK和Android studio,JSK,然后配置用户变量和系统变量,然后npm install ...

  7. URL 通过Get方式传递数组参数

    URL 通过Get方式传递数组参数 方法1: ?id=1&id=2&id=3 后台获取时,只需要reqeust.getParameterValues("id") 获 ...

  8. linux - man 提示:No entry for tty in section 4 of the manual

    在使用man手册时,出现空章节的情况: 如: 原因:在CentOS6.5安装时,采用了minimal方式安装,许多包都没有安装上,man手册的man-pages包也没有安装 解决方案:安装man-pa ...

  9. hdu1011(树形背包)(提供一个特殊样例)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011 Starship Troopers Time Limit: 10000/5000 MS (Jav ...

  10. Nginx原理

    原理机制 Nginx采用多进程(每个worker进程只对应一个线程)和I/O多路复用机制,实现并发的事件驱动处理: 多路复用即通过一种机制监视多个文件描述符,一旦文件描述符就绪(读写就绪),就可通知程 ...