# urllib基础操作 # 爬虫基础-Urllib发送请求 import urllib.request import urllib.parse # 目标网址(一个竞赛网址) url = 'https://www.datafountain.cn/competitions' # 通过request配置请求参数 ''' urllib. request. Request ( url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) data 字节流格式,若是字典格式,先用urllib.parse.urlencode()转换 headers 请求头 origin_req_host 请求放的host名称或ip地址 method 请求方法 ''' headers = { 'User-Agent':'xxxxx' } req = urllib.request.Request(url,headers=headers) # 发送请求,返回整个网页源码 ''' urllib . request . urlopen(url, data=None, [timeout]*, cafile=None, capath=None, cadefault=False, context=None ) data 以表单的形式提交,需要将data参数转为bytes格式 timeout 设置响应时间 response = urllib.request.urlopen(url,data=data) ''' response = urllib.request.urlopen(req,timeout=1) # 获取响应 # 获取响应状态码 if response.status == 200: # 读取整个网页 print(response.read().decode('utf-8')) # 获取响应头信息 print(response.getheaders())
高级操作
需要用到处理器的集合工具Handler,request中的BaseHandler是其它Handler的父类。Handler常用处理器类有:
简单身份验证
from urllib.request import HTTPPasswordMgrWithDefaultRealm,build_opener,HTTPBasicAuthHandler from urllib.error import URLError # 如果打开一个界面需要身份验证,则可以用此方法解决,但不同于模拟登陆 # 目标网址 url = 'change' # 身份信息 username = 'xxxxxx' password = 'xxxxxx' # 构造管理器 p = HTTPPasswordMgrWithDefaultRealm() p.add_password(None,url,username,password) auth_handler = HTTPBasicAuthHandler(p) opener = build_opener(auth_handler) try: # 发送请求,接受响应 result = opener.open(url) html = result.read().decode('utf-8') print(html) except URLError as e: print(e.reason)
简单代理
from urllib.error import URLError from urllib.request import ProxyHandler,build_opener # 目标网址 url = 'https://www.baidu.com' # 构建代理池 proxy_Handler = ProxyHandler({ 'http' : 'http://127.0.0.1:9743 ', 'https' : 'https://127.0.0.1:9743 ' }) # 构建opener opener = build_opener(proxy_Handler) try: response = opener.open(url) if response.status == 200: print(response.read().decode('utf-8')) else: print('ByeBye') except URLError as e: print(e.reason) # [WinError 10061] 由于目标计算机积极拒绝,无法连接。
简单保存cookies
from urllib.request import HTTPCookieProcessor,build_opener from http import cookiejar ''' cookiejar是cookie类的的一个管理类,可以获取,添加,存储等等操作 ''' # 目标网址 url = 'https://www.baidu.com' # 构建cookiejar类作为HTTPCookieProcessor的参数 cookies = cookiejar.CookieJar() handler = HTTPCookieProcessor(cookies) opener = build_opener(handler) # 响应 opener.open(url) for item in cookies: print(item.name + ":" + item.value) # 保存到txt文件 cookies_save = cookiejar.MozillaCookieJar("cookies.txt") handler_save = HTTPCookieProcessor(cookies_save) opener_save = build_opener(handler_save) opener_save.open(url) cookies_save.save(ignore_discard=True , ignore_expires=True) ''' ignore_discard:是否保存需要被抛弃的cookie ignore_expires:是否保存过期的cookie '''
解析链接:urllib.parse
# 简单解析url from urllib.parse import urlparse ''' urllib.parse.urlparse(urlstring, scheme=”", allow_fragments=True) 所有url都符合同一规则’scheme://netloc/path ;params?query#fragment‘ scheme : 如果url没有指明scheme则使用默认协议 allow_fragments : 是否忽略fragment ''' # urlparse url = 'http://www.baidu.com/index.html;user?id=5#comment' result = urlparse(url) print(result) # urlunparse(长度必须是6位) from urllib.parse import urlunparse data = ['http','www.baidu.com','/index.html','user','id=5','comment'] print(urlunparse(data)) # urlsplit(会将path与params合并) from urllib.parse import urlsplit res = urlsplit(url) print(res) # urlunsplit(长度是5位) from urllib.parse import urlunsplit mark = ['http','www.baidu.com','/index.html;user','id=5','comment'] print(urlunsplit(mark)) # 另一种解析大方式:urljoin ''' urljoin(base_url,new_url) urljoin会分析base_url的scheme,netloc,path。如果base的前三项在new中不存在则new作为base的补充 如果存在,就用new代替base ''' #urlencode() ''' 将字典化为字符串,例: params = { ’name':'germey', age : 22 } urlencode(params) = 'name=germey&age=22' ''' # parse_qs() ''' 反序列化 将字符串转为字典 ''' # quote() ''' 避免中文出现乱码现象 将中文字转化为url编码 ''' # unquote() ''' 将url编码转为中文 '''
Robots 协议
机器人协议,规定哪些页面可以爬,哪些不行。
# 简单的判断页面能否爬 from urllib.robotparser import RobotFileParser #构建机器人解析对象 rp = RobotFileParser() print(rp.can_fetch(url + '/robot.txt'))