请求库urllib和urllib3
# coding=utf-8 # urllib """ 使用python的urllib库去模拟浏览器请求网页,常用内容如下: urllib.request 发送HTTP请求 urllib.error 处理请求过程中出现的异常 urllib.parse 处理url urllib.robotparser 解析robots.txt """
# 处理ssl异常 # import ssl # ssl._create_default_https_context = ssl._create_unverified_context # 1.使用urllib.request请求网页 # import urllib.request # url = "https://www.jianshu.com" # data = urllib.request.urlopen(url) # 请求url这个网页,返回值类型为对象 # print(data.read().decode()) # 打印网页源代码,默认为bytes类型,decode()后解码为utf-8 # print(data.geturl()) # 打印请求地址 # print(data.getcode()) # 返回请求结果的状态码 200表示请求正常 # print(data.info()) 返回请求url时的headers相关信息 # 2.模拟浏览器访问 添加headers头信息 ''' 代码访问网页和电脑访问时传递的headers内容不同, 因此将headers修改为电脑访问网址时的headers, 就可以将代码伪装成浏览器来访问网页。 ''' # import urllib.request # url = "https://www.jianshu.com" # # # headers类型是字典,尽量使用关键字参数传参 # headers = { # 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' # } # 在请求中添加已伪装好的headers ''' urllib.request.Request接受一个data(字典类型)的参数, 当没有传data参数时,默认为get请求 需要post请求时,传一个data参数,会自动识别为post请求 data = {'a':1} data = urllib.parse.urlencode(data).encode() # 编码为bytes类型 request = urllib.request.Request(url,data=data,headers=headers) #实例 ''' # request = urllib.request.Request(url, headers=headers) # # # 访问网站 # urllib.request.urlopen(request) # 3.cookie的使用,分三个步骤 """ 部分网站需药cookies信息才能登陆,urllib中提供携带cookie信息的请求 分三个步骤: 创建cookieJar对象 创建cookie处理器 安装处理器 """ # import urllib.request # import http.cookiejar # # url = "https://www.jianshu.com" # 1.创建cookieJar对象 # cookie_jar = http.cookiejar.CookieJar() # 2.使用HTTPCookieProcessor创建cookie处理器,并以它为参数创建opener对象 # opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_jar)) # # 3.把opener变成urlopen # urllib.request.install_opener(opener) # 此时发起的请求就已经携带了cookie信息 # data = urllib.request.urlopen(url) # print(cookie_jar) # 4.设置代理 请求别人的网站 """ 一般网站可能存在反爬虫机制,最基础的反爬就是检测IP, 如果一个IP频繁出现,可能就会被识别为爬虫 因此,使用代理(就是利用别人的IP+端口)伪装自己的IP地址 分为三个步骤: 创建代理处理器 创建opener对象 安装处理器 """ # import urllib.request # url = "http://httpbin.org/ip" # 用于测试ip地址的网站 # 使用代理时,将代理处理为一下格式 # proxy = {'http': '115.193.96.143:9000', 'https': '115.193.96.143:9000'} # 1.创建代理处理器 # proxies = urllib.request.ProxyHandler(proxy) # 2.创建opener对象 # opener = urllib.request.build_opener(proxies, urllib.request.HTTPHandler) # 3.安装 # urllib.request.install_opener(opener) # 此时,发起的请求就不是自己的ip地址,而是一个匿名的代理IP # data = urllib.request.urlopen(url) # print(data.read().decode()) # 5.异常处理urllib.error URLError(父类) HTTPError """ 用于处理请求时发生的一些异常,常用的URLError和HTTPError URLError用于处理请求地址或服务器不存在的情况 HTTPError用于服务器存在但是页面不存在的情况 """ import urllib.error import urllib.request # url = "http://www.1844hhjhhlkxxx.com" # try: # urllib.request.urlopen(url) # except urllib.error.URLError as e: # print(e.reason) # 打印异常原因 # url = 'https://jianshu.com/p/sddfsdf' # try: # urllib.request.urlopen(url) # except urllib.error.URLError as e: # # 判断是否有code属性,如果有code属性说明是HTTPError # if hasattr(e, "code"): # print("HTTPError") # # 判断是否有reason属性,如果有reason属性说明是URLError # elif hasattr(e, "reason"): # print("URLError") # 5.urllib.parse 解析url """ 对请求的url进行一定的处理 """ import urllib.parse # urllib.parse.urljoin() # 拼接字符串,对url进行一定的拼接 # urllib.parse.urlencode() # 将字典转化为转字符串 # urllib.parse.urlquote() # url解码 # urllib.parse.urlunquote() # url编码 # 请求地址中含有中文时,需要将其编码为ascii格式 # url = 'http://www.baidu.com/s?wd={}'.format(urllib.parse.urlunqote('爬虫')) # data = {'a': 1, 'b': 2} # print(urllib.parse.encode(data)) # # print(urllib.parse.urljoin('http://www.baidu.com/', 's?wd=')) # 6.urllib3请求库 # import urllib3 # http = urllib3.PoolManager() # 发送请求,参数为请求方法和请求地址 # r = http.request("GET", 'https://www.jianshu.com', redirect=False) # 关闭重定向