urllib库
爬虫基础 1.爬虫:请求网站并请求数据的自动化程序。 2.爬虫的基本流程: 1.发起请求 ??通过http库向目标站点发起请求,即发送一个request,请求包含额外的headers信息,等待服务器响应。 2.解析内容 ??得到内容是HTML,可以用正则表达式、网页解析库进行解析。可能是json,可能是二进制,可以做进一步处理 3.获取响应内容 ??如果服务器正常响应会得到一个response页面内容,类型可能是json字符串、二进制数据、HTML等。 4.保存数据 ??可以保存为文本,或者数据库,特定格式。 2.urllib基本用法 官方文档地址:https://docs.python.org/3/library/urllib.html Urllib是python内置的HTTP请求库 1.urlopen关于urllib.request.urlopen参数的介绍: url参数的使用 urlopen一般常用的有三个参数,它的参数如下: data参数的使用 这里就用到urllib.parse,通过bytes(urllib.parse.urlencode())可以将post数据进行转换放到urllib.request.urlopen的data参数中。这样就完成了一次post请求。 import urllib.request import urllib.parse data=bytes(urllib.parse.urlencode({‘word‘:‘hello‘}),encoding=‘utf-8‘) print(data) response=urllib.request.urlopen(‘http://httpbin.org/post‘,data=data) print(response.read()) timeout参数的使用 import urllib.request response = urllib.request.urlopen(‘http://httpbin.org/get‘,timeout=1) print(response.read())
import urllib.request import urllib.error import socket try: ????response=urllib.request.urlopen(‘http://httpbin.org/get‘,timeout=1) except urllib.error.URLError as e: ????if isinstance(e.reason,socket.timeout): ????????print(‘‘TIME OUT‘‘) 3.设置Headers #添加请求头 from urllib import request,parse url = ‘http://httpbin.org/post‘ headers = { ????‘User-Agent‘: ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘, ????‘Host‘: ‘httpbin.org‘ } dict = { ????‘name‘: ‘zhaofan‘ } data=bytes(parse.urlencode(dict),encoding=‘utf8‘) req=request.Request(url=url,data=data,headers=headers,method=‘POST‘) response=request.urlopen(req) print(response.read().decode(‘utf-8‘)) #第二种添加头部信息方式 from urllib import request,parse ? url = ‘http://httpbin.org/post‘ dict = { ????‘name‘: ‘Germey‘ } data = bytes(parse.urlencode(dict),encoding=‘utf8‘) req = request.Request(url=url,method=‘POST‘) req.add_header(‘User-Agent‘,‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘) response = request.urlopen(req) 4.高级用法各种handler 代理,ProxyHandler 通过rulllib.request.ProxyHandler()可以设置代理,网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止你的访问,所以这个时候需要通过设置代理来爬取数据 import urllib.request ? proxy_handler = urllib.request.ProxyHandler({ ????‘http‘:‘112.35.29.53:8088‘, ????‘https‘:‘165.227.169.12:80‘ }) opener = urllib.request.build_opener(proxy_handler) response = opener.open(‘http://www.baidu.com‘) print(response.read()) 5.cookie,HTTPCookiProcessor cookie中保存中我们常见的登录信息,有时候爬取网站需要携带cookie信息访问,这里用到了http.cookijar,用于获取cookie以及存储cookie。 import http.cookiejar,urllib.request ? 同时cookie可以写入到文件中保存,有两种方式http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar()。 具体代码例子如下: ? import?http.cookiejar,urllib.request filename = "cookie.txt" cookie = http.cookiejar.MozillaCookieJar(filename) 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) ? http.cookiejar.LWPCookieJar()方式 ? import?http.cookiejar,urllib.request filename = ‘cookie.txt‘ cookie = http.cookiejar.LWPCookieJar(filename) 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) ? 同样的如果想要通过获取文件中的cookie获取的话可以通过load方式,当然用哪种方式写入的,就用哪种方式读取。 ? import?http.cookiejar,urllib.request cookie = http.cookiejar.LWPCookieJar() cookie.load(‘cookie.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‘)) ? 异常处理在很多时候我们通过程序访问页面的时候,有的页面可能会出现错误,类似404,500等错误 from urllib import request,error try: ????response = request.urlopen("http://pythonsite.com/1111.html")except error.URLError as e: ????print(e.reason) 上述代码访问的是一个不存在的页面,通过捕捉异常,我们可以打印异常错误 这里我们需要知道的是在urllb异常这里有两个个异常错误: URLError里只有一个属性:reason,即抓异常的时候只能打印错误信息,类似上面的例子 HTTPError里有三个属性:code,reason,headers,即抓异常的时候可以获得code,reson,headers三个信息,例子如下: ? from?urllib import?request,errortry: ????response = request.urlopen("http://pythonsite.com/1111.html")except?error.HTTPError as e: ????print(e.reason) ????print(e.code) ????print(e.headers)except?error.URLError as e: ????print(e.reason) else: ????print("reqeust successfully") ? 同时,e.reason其实也可以在做深入的判断,例子如下: ? import?socket from?urllib import?error,request try: ????response = request.urlopen("http://www.pythonsite.com/",timeout=0.001)except?error.URLError as e: ????print(type(e.reason)) ????if?isinstance(e.reason,socket.timeout): ????????print("time out") ? URL解析urlparse urllib.parse.urlparse(urlstring,scheme=‘‘,allow_fragments=True) 功能一: from?urllib.parse import?urlparse ? result = urlparse("http://www.baidu.com/index.html;user?id=5#comment")print(result) 结果为: ? 这里就是可以对你传入的url地址进行拆分 urlunpars 其实功能和urlparse的功能相反,它是用于拼接,例子如下: from?urllib.parse import?urlunparse ? data = [‘http‘,‘www.baidu.com‘,‘index.html‘,‘user‘,‘a=123‘,‘commit‘]print(urlunparse(data)) 结果如下 ? urljoin 这个的功能其实是做拼接的,例子如下: ? from?urllib.parse import?urljoin print(urljoin(‘http://www.baidu.com‘,‘FAQ.html‘))print(urljoin(‘http://www.baidu.com‘,‘https://pythonsite.com/FAQ.html‘))print(urljoin(‘http://www.baidu.com/about.html‘,‘https://pythonsite.com/FAQ.html?question=2‘))print(urljoin(‘http://www.baidu.com?wd=abc‘,‘https://pythonsite.com/index.php‘))print(urljoin(‘http://www.baidu.com‘,‘?category=2#comment‘))print(urljoin(‘www.baidu.com‘,‘?category=2#comment‘))print(urljoin(‘www.baidu.com#comment‘,‘?category=2‘)) ? 结果为: 从拼接的结果我们可以看出,拼接的时候后面的优先级高于前面的url urlencode ? from?urllib.parse import?urlencode ? params = { ????"name":"zhaofan", ????"age":23, } base_url = "http://www.baidu.com?" ? url = base_url+urlencode(params)print(url) ? 结果为: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |