请求库 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)
具体的urllib3的使用可以参考https://www.cnblogs.com/KGoing/p/6146999.html