python爬虫之urllib库

Posted purplelavender

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫之urllib库相关的知识,希望对你有一定的参考价值。

请求库 urllib

urllib主要分为几个部分

urllib.request 发送请求
urllib.error 处理请求过程中出现的异常
urllib.parse 处理url
urllib.robotparser 解析robots.txt -->规定了该网站的爬虫权限

urllib.request方法

data = urllib.request.urlopen(url)  #返回response对象

data.read() --->取出网页源代码 (bytes类型,可以通过decode()转成utf-8) 注意网页源代码不包括js处理后的数据
data.info() --->取出响应的头信息
data.getcode() --->取出返回码
data.geturl() --->取出请求的url

用脚本发出的请求,headers中的User-Agent是python-urllib/3.6,有些网站会根据这个来识别请求是不是脚本发出的,进而过滤掉爬虫,那我们怎么来模拟浏览器访问呢?
用urllib.request.Request()来携带headers头信息

headers = {
User=Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36,
}
request = urllib.request.Request(url,headers=headers) #实例Request()对象,Request对象初始化可以传入headers
data = urllib.request.urlopen(request) #urlopen不仅可以传入一个url,并且可以传入一个Request对象

urllib.request是如何区分请求时get还是post呢?
看看urllib.request的源代码,可以知道,如果如果请求携带data参数,则为post请求,反之则为get请求

Cookies使用

固定写法

import http.cookiejar
# 创建cookieJar对象
cookie_jar = http.cookiejar.CookieJar()
# 使用HTTPCookieProcessor创建cookie处理器,并以它为参数构建opener对象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_jar))
# 把opener变成urlopen,安装之后,给urlopen加上了保存cookies功能
urllib.request.install_opener(opener) #如果不想安装也可以,直接用opener.open(url)打开

设置代理

固定写法

proxy = {http:183.232.188.18:80,https:183.232.188.18:80} # 代理 ip:port
# 创建代理处理器
proxies = urllib.request.ProxyHandler(proxy)
# 创建opener对象
opener = urllib.request.build_opener(proxies,urllib.request.HTTPHandler)
urllib.request.install_opener(opener) # 如果不想安装也可以,直接用opener.open(url)打开,这样opener就有代理而urlopen没有

urllib.error

URLError是父类 断网或者服务器不存在 有异常原因,没有code属性
HTTPError是子类 服务器存在,但是地址不存在,有code和reason属性

#url = ‘http://www.adfdsfdsdsa.com‘ URLError
#url = ‘https://jianshu.com/p/jkhsdhgjkasdhgjkadfhg‘ HTTPError

判断方法

try:
    data = urllib.request.urlopen(url)
    print(data.read().decode())
except urllib.error.URLError as e:
    if hasattr(e,code):
        print(HTTPError)
    elif hasattr(e,reason):
        print(URLError)

urllib.parse

import urllib.parse

# urllib.parse.urljoin() # 拼接url 字符串拼接,若都是域名,则以后面覆盖
# urllib.parse.urlencode() # 把字典转查询字符串
# urllib.parse.quote() # url采用ascii码编码,出现中文时需要进行url编码
# urllib.parse.unquote() # url解码 
#
urlencode

>>> from urllib import parse
>>> query = {
name: walker,
age: 99,
}
>>> parse.urlencode(query)
name=walker&age=99

quote/quote_plus

>>> from urllib import parse
>>> parse.quote(a&b/c) #未编码斜线
a%26b/c
>>> parse.quote_plus(a&b/c) #编码了斜线
a%26b%2Fc

unquote/unquote_plus

from urllib import parse
>>> parse.unquote(1+2) #不解码加号
1+2
>>> parse.unquote(1+2) #把加号解码为空格
1 2

url = http://www.baidu.com/?wd=书包
urllib.request.urlopen(url)  #会报错编码错误
#如果想正确请求,需要url = ‘http://www.baidu.com/?wd={}‘.format(urllib.parse.quote(‘书包‘)) 先把中文进行url编码,然后再去请求

urllib3

requests库底层用的urllib3

 import urllib3
 http = urllib3.PoolManager()

r = http.request(GET,https://www.jianshu.com,redirect=False) # 关闭重定向
print(r.status) 

 










以上是关于python爬虫之urllib库的主要内容,如果未能解决你的问题,请参考以下文章

python3爬虫之Urllib库

爬虫基础之urllib库

爬虫基础之urllib库

Python 爬虫之urllib库,及urllib库的4个模块基本使用和了解

Python 爬虫之urllib库,及urllib库的4个模块基本使用和了解

python爬虫之reuqests库,及基本使用