1.简单爬取一个页面html
import urllib f = urllib.urlopen('http://www.qq.com') # HTTP协议,也能够是FTP,FILE,HTTPS等 print f.read() # 读取整个页面
2.经过构造Request请求对象json
import urllib2 req = urllib2.Request('http://www.qq.com') # 构造一个Request请求对象 f = urllib2.urlopen(req) # 传入一个Request请求对象 print f.read().decode('gbk') # 读取整个页面,read()返回的是字节对象,转为gbk编码显示中文
3.POST和GET数据传送浏览器
import urllib # POST data = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) # 数据字典 print data # eggs=2&bacon=0&spam=1 f = urllib.urlopen('http://www.musi-cal.com/cgi-bin/query', data) # POST,若是data里有中文,要data.encode('utf-8') print f.geturl() # 获取url,http://www.musi-cal.com/cgi-bin/query print f.read(100) # 返回的是字节对象,读取前100个字节 # GET f = urllib.urlopen('http://www.musi-cal.com/cgi-bin/query?%s' % data) # GET,若是data里有中文,要data.encode('utf-8') print f.geturl() # 获取url,http://www.musi-cal.com/cgi-bin/query?eggs=2&bacon=0&spam=1 print f.read(100) # 返回的是字节对象,读取前100个字节
4.设置Headers服务器
import urllib2 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0'} # 设置User-Agent req = urllib2.Request(url='https://www.qq.com', headers=headers) # 构造一个Request请求对象,并传入Headers f = urllib2.urlopen(req) # 传入一个Request请求对象 print f.read().decode('gbk') # 读取整个页面,read()返回的是字节对象,转为gbk编码显示中文 req = urllib2.Request(url='https://www.qq.com') # 构造一个Request请求对象 req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0') # 添加User-Agent到Headers f = urllib2.urlopen(req) # 传入一个Request请求对象 print f.read().decode('gbk') # 读取整个页面,read()返回的是字节对象,转为gbk编码显示中文
Header的一些属性说明:cookie
User-Agent:经过该值来判断是否为浏览器发出的请求。网络
Content-Type:使用REST接口时,服务器会检查此值来肯定Body中的内容要怎样解析。app
application/xml:在XML RPC调用时使用。post
application/json:在JSON RPC调用时使用。ui
application/x-www-form-urlencoded:浏览器提交Web表单时使用。编码
5.代理(Proxy)设置
import urllib2 proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'}) # 代理处理器 proxy_auth_handler = urllib2.ProxyBasicAuthHandler() # 代理验证处理器 proxy_auth_handler.add_password('realm', 'host', 'username', 'password') # 添加用户名和密码 opener = urllib2.build_opener(proxy_handler, proxy_auth_handler) # 创建一个opener,传入了代理处理器和代理验证处理器 f = opener.open('http://www.example.com/login.html') # 用创建的opener直接打开网页,不须要调用urllib2.install_opener() # 或者这样使用 # urllib2.install_opener(opener) # 安装opener # f = urllib2.urlopen('http://www.example.com/login.html') # 调用urlopen() print f.read() # 得到页面内容
6.超时(timeout)设置
# 参考5中的代码 f = opener.open('http://www.example.com/login.html', timeout=5) # 超时5秒则抛出URLError异常
7.异常处理(URLError,HTTPError)
URLError是IOError的子类,HTTPError是URLError的子类。URLError产生的缘由有:网络无链接,链接不到服务器,服务器不存在,请求超时等。URLError异常有reason
属性,说明了异常的缘由。
import urllib2 req = urllib2.Request(url='http://www.baidu123456123456123456.com') # 一个不存在的网页 try: f = urllib2.urlopen(req) # 试图打开不存在的网页 print f.read() except urllib2.URLError as e: # 抛出异常 print e.reason # [Errno 11001] getaddrinfo failed else: print u'成功'
import urllib2 req = urllib2.Request(url='https://www.douyu.com/Json.html') # 一个不存在的网页 try: f = urllib2.urlopen(req) # 试图打开不存在的网页 print f.read() except urllib2.HTTPError as e: print e.reason # Not Found print e.code # 404 except urllib2.URLError as e: # 抛出异常 print e.reason else: print u'成功'
HTTPError异常除了继承了reason
属性,还有code
属性,是异常对应的状态码。HTTP状态码有:
100:客户端继续发送请求的剩余部分,如请求已完成,忽略。 101:发送完此响应的最后空行,服务器切换到Upgrade消息头中定义的协议。 102:处理被继续执行。 200:请求成功。 201:请求完成。 202:请求被接受,处理还没有完成。 204:服务器已实现请求,但没有返回信息。 300:存在多个可用的被请求资源。 301:请求到的资源会分配一个永久的URL,未来经过此URL来访问。 302:请求到的资源在一个不一样的URL临时保存。 304:请求的资源未更新。 400:非法请求。 401:未受权。 403:禁止。 404:找不到。 500:服务器内部错误。 501:服务器没法识别。 502:错误网关。 503:服务出错。
8.Cookie的使用(cookielib.CookieJar,cookielib.FileCookieJar,cookielib.MozillaCookieJar,cookielib.LWPCookieJar)
cookielib.MozillaCookieJar和cookielib.LWPCookieJar是cookielib.FileCookieJar的子类,cookielib.FileCookieJar是cookielib.CookieJar的子类。
# cookie保存在变量中 import urllib2 import cookielib cj = cookielib.CookieJar() # CookieJar对象,cookie会保存在这个变量中 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) # 传入cookie处理器来构建opener f = opener.open('http://www.baidu.com') # 打开页面 for item in cj: # 历遍cookie中的键值对 print u'键:' + item.name print u'值:' + item.value
# cookie保存到文件 import urllib2 import cookielib filename = 'cookie.txt' cj = cookielib.MozillaCookieJar(filename) # MozillaCookieJar对象,cookie会保存在文件中 processor = urllib2.HTTPCookieProcessor(cj) # cookie处理器 opener = urllib2.build_opener(processor) # 传入cookie处理器来构建opener f = opener.open('http://www.baidu.com') # 打开页面 cj.save(ignore_discard=True, ignore_expires=True) # 保存,cookie被丢弃也保存,cookie到期也保存
# 读取cookie import urllib2 import cookielib cj = cookielib.MozillaCookieJar() # MozillaCookieJar对象 cj.load('cookie.txt', ignore_discard=True, ignore_expires=True) # 读取cookie文件 processor = urllib2.HTTPCookieProcessor(cj) # cookie处理器 req = urllib2.Request('http://www.baidu.com') # 创建请求 opener = urllib2.build_opener(processor) # 传入cookie处理器来构建opener f = opener.open(req) # 打开页面 print f.read() # 读取页面内容
# 模拟登录的过程 import urllib import urllib2 import cookielib filename = 'cookie.txt' cj = cookielib.MozillaCookieJar(filename) # MozillaCookieJar对象,cookie会保存在文件中 processor = urllib2.HTTPCookieProcessor(cj) # cookie处理器 opener = urllib2.build_opener(processor) # 传入cookie处理器来构建opener data = {} # 数据字典 data['username'] = 'xxxxxxx' # 用记名 data['password'] = '1111111' # 密码 post = urllib.urlencode(data) # 生成用于传递的数据字符串 url = 'http://www.xxxx.com/login' # 登录页面 req = urllib2.Request(url=url, data=post) # 创建请求,传入登录须要的数据,如用户名密码之类 f = opener.open(req) # 打开页面 cj.save(ignore_discard=True, ignore_expires=True) # 保存,cookie被丢弃也保存,cookie到期也保存 other_url = 'http://www.xxxx.com/other' # 须要登录才能访问的页面 f = opener.open(other_url) # 访问须要登录才能访问的页面 print f.read() # 读取页面内容