urlib库的使用
urlib库实际上不是很常用,因为其api调用复杂,已被requests模块取代。
1.request发送请求
from urllib import request
#默认指定的是get请求
#urlopen可以指定data,设置了这个值,那么将变成post请求
response=request.urlopen('http://www.baidu.com')
# print(response)
#返回值:返回值是一个http.client.HTTPResponse对象,有read,readline,readlines以及getcode等方法
# print(response.read())
#读取前10个字节
# print(response.read(10))
#readline读取一行
# print(response.readline())
#readlines(),读取整个文件所有行,保存在一个列表变量中,每行作为一个元素,但读取大文件比较占内存
print(response.readlines())
#获取响应的状态码
# print(response.getcode())
2.request进行下载
from urllib import request
#下载网页内容,第一个参数指定url,第二个参数指定要写入哪个文件的文件名
# request.urlretrieve('http://www.baidu.com','baidu.html')
request.urlretrieve('https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3478835771,1633744087&fm=26&gp=0.jpg','luban.jpg')
3.request的编码与解码
这个主要是针对url的
from urllib import parse
from urllib import request #urlencode函数的用法
# params={'name':'张三','age':18,'great':'hello world'}
#传一个字典
# result=parse.urlencode(params)
# print(result) # url='http://www.baidu.com/s'
# params={'wd':'蔡徐坤'}
# params=parse.urlencode(params)
# print(params)
# url=url+'?'+params
# response=request.urlopen(url)
# print(response.read()) #parse_qs函数的用法 解码
params={'name':'张三','age':18,'great':'hello world'}
qs=parse.urlencode(params)
print(qs)
result=parse.parse_qs(qs)
print(result)
4.将url进行分割的功能
from urllib import request
from urllib import parse url='http://www.baidu.com/s?wd=python&username=lqz#1'
# result=parse.urlparse(url)
# print(result)
#有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse或urlsplit来进行分割
# print('scheme:',result.scheme)
# print('netloc:',result.netloc)
# print('path:',result.path)
# print('params:',result.params)
# print('query:',result.query)
# print('fragment:',result.fragment) #fragment锚点
#urlsplit和urlparse的区别是urlsplit不会分割出params,以后使用的时候随便用哪个
#params用到的很少
#urlparse可以获取分号后的hello
url2='http://www.baidu.com/s;hello?wd=python&username=lqz#1'
print(parse.urlparse(url2)) result=parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
5.使用代理
from urllib import request #7-ProxyHandler处理器
#通过ProxyHandler来设置使用代理服务器,防止同一ip访问网站次数过多被封禁
#常用的代理有:西刺,快代理,代理云
#httpbin.org专门测试http请求的,http://httpbin.org/ip 显示当前ip #没有使用代理的本机IP
url='http://httpbin.org/ip'
# resp=request.urlopen(url)
# print(resp.read()) #使用代理的
#1.使用ProxyHandler传入代理构建一个handler
#2.使用上面创建的handler构建一个opener
#3.使用opener去发送一个请求 #使用代理
#传入一个字典
handler=request.ProxyHandler({'http':'60.2.44.182:46534'})
opener=request.build_opener(handler)
resp=opener.open(url)
print(resp.read())
6.携带cookie登录
from urllib import request #HTTP无状态协议,是指协议对于交互性场景没有记忆能力。
#参数含义
#NAME:cookie的名字
#VALUE:cookie的值
#Expires:cookie的过期时间
#Path:cookie作用的路径
#Domain:cookie作用的域名。设置的cookie默认只在主域名起作用,要设置子域名也起作用,要加这个。
#SECURE:是否只在https协议下起作用 #使用cookie模拟登陆
from urllib import request
#老师人人网账户
email='970138074@qq.com'
password='pythonspider' url='http://www.renren.com/880151247/profile'
#不使用cookie
# headers={
# 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
#
# }
# req=request.Request(url=url,headers=headers)
# resp=request.urlopen(url)
# with open('renren.html','w',encoding='utf-8') as f:
# f.write(resp.read().decode('utf-8')) #使用cookie,这样做太麻烦了,还有其他办法
# headers={
# "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
# "Cookie":"anonymid=ju1t9qsph90pys; depovince=GW; _r01_=1; JSESSIONID=abcXfLxdWqMHi6Pe3ALNw; ick_login=e10e1e18-39d2-4e5c-a8b8-b90e4675fe8d; t=0ee4fa42a5f337b7e6368ed4f71ab8189; societyguester=0ee4fa42a5f337b7e6368ed4f71ab8189; id=970296329; xnsid=1a888270; jebecookies=f850bf5b-ecb9-40f2-b99e-541671612347|||||; ver=7.0; loginfrom=null; jebe_key=d6dba89f-a272-4afe-9157-347b5d152e41%7C49aae11d2fe745dc68a15c417d170403%7C1554333011073%7C1%7C1554333010402; wp_fold=0"
# }
# req=request.Request(url=url,headers=headers)
# resp=request.urlopen(url)
# with open('renren.html','w',encoding='utf-8') as f:
# f.write(resp.read().decode('utf-8')) from http.cookiejar import CookieJar '''
CookieJar:管理HTTP cookie值,存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie对象。
整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失
''' headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
}
#模拟登陆
def get_opener():
#创建一个cookiejar对象
cookiejar=CookieJar()
#使用cookiejar创建一个HTTPCookieJar对象
handler=request.HTTPCookieProcessor(cookiejar)
#使用上一步创建的handler创建一个opener
opener=request.build_opener(handler)
#使用opener发送登陆的请求(人人网的邮箱和密码)
return opener def login_renren(opener): data={
'email':'970138074@qq.com',
'password':'pythonspider'
}
from urllib import parse
login_url='http://www.renren.com/ajaxLogin/login'
req=request.Request(login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers)
opener.open(req) def visit_profile(opener):
#访问个人主页
dapeng_url='http://www.renren.com/880151247/profile' req=request.Request(dapeng_url,headers=headers)
resp=opener.open(req)
with open('renren.html','w',encoding='utf-8') as f:
f.write(resp.read().decode('utf-8')) if __name__ == '__main__':
opener=get_opener()
login_renren(opener)
visit_profile(opener)
7.cookie信息的加载与保存
from urllib import request #保存cookie到本地
from http.cookiejar import MozillaCookieJar
#指定保存到哪个文件
cookiejar=MozillaCookieJar('cookie.txt')
handler=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(handler)
# resp=opener.open('http://www.baidu.com') #前面已经传了文件名,现在save不用传文件名。前面如果没传,则save要传文件名。每次写都会重新覆盖文件
# cookiejar.save() #浏览器关闭,cookie过期的这种cookie是无法写入文件的。
resp=opener.open('http://httpbin.org/cookies/set?course=python')
# print(resp.read())
#ignore_discard即使cookie将被丢弃也保存,ignore_expires即使cookie将过期也进行保存
cookiejar.save(ignore_discard=True,ignore_expires=True) #load 重用cookie信息,从本地loadcookie信息。要指定文件名,前面创建cookiejar的时候指定了文件名,则不用传 for cookie in cookiejar:
print(cookie)
urlib库的使用的更多相关文章
- Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式
专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...
- 3.爬虫 urlib库讲解 总结
urllib库的总结: 用ProcessOn(安利这个软件,够用了)根据前面的几节内容做了个思维导图. urllib库一共有四个模块: request:它是最基本的模块,可以用来模拟发送请求 erro ...
- 2.爬虫 urlib库讲解 异常处理、URL解析、分析Robots协议
1.异常处理 URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过这个类来处理. from urllib ...
- 1.爬虫 urlib库讲解 Handler高级用法
在前面我们总结了urllib库的 urlopen()和Request()方法的使用,在这一小节我们要使用相关的Handler来实现代理.cookies等功能. 写在前面: urlopen()方法不支持 ...
- 0.爬虫 urlib库讲解 urlopen()与Request()
# 注意一下 是import urllib.request 还是 form urllib import request 0. urlopen() 语法:urllib.request.urlopen(u ...
- urlib库
urllib库是python中最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送请求,并可以保存服务器返回的数据. urlopen() urllib.request模块提供了最基本的构造ht ...
- 基本urllib库
urlib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urllib ...
- requests库的基本使用
1.发送get请求 import requests # response=requests.get('http://www.baidu.com') # 查看响应内容,返回的是已经解码的内容 # res ...
- Python爬虫与数据分析之模块:内置模块、开源模块、自定义模块
专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...
随机推荐
- SpringMVC概述
1. SpringMVC是什么 SpringMVC 是 Spring 框架内置的 MVC 的实现.SpringMVC 就是一个 Spring 内置的 MVC 子框架 Spring 子框架:意味着 Sp ...
- 传输层的端口与TCP标志中的URG和PSH位
一.协议端口号的提出 运输层提供了进程间通信的能力(即端-端通信).但是不同的操作系统可能无法识别其他机器上的进程.为了用统一的方法对 TCP/IP体系的应用进程进行标志,使运行不同操作系统的计算机的 ...
- UOJ#172. 【WC2016】论战捆竹竿 字符串 KMP 动态规划 单调队列 背包
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ172.html 题解 首先,这个问题显然是个背包问题. 然后,可以证明:一个字符串的 border 长度可 ...
- Promise源码深入理解
) ) }); ) }, ) }); ) ) }, ) }); ) }, ) }); p.then(function (x) { console.log(x) }) //输出 1 链式调用1 链式调用 ...
- 【Vue】-- 数据双向绑定的原理 --Object.defineProperty()
Object.defineProperty()方法被许多现代前端框架(如Vue.js,React.js)用于数据双向绑定的实现,当我们在框架Model层设置data时,框架将会通过Object.def ...
- python学习中遇到的问题
问题1: ‘unicodeescape’ codec can’t decode bytes in position XXX: trun错误解决方案 http://blog.csdn.net/u0112 ...
- angular.isString()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java 读取 Json格式的 内容
一.Json 报文格式如下: 二.获取 Json 报文中字段的内容 import java.io.IOException; import com.fasterxml.jackson.core.Json ...
- (90)Wangdao.com第二十三天_JavaScript CSS 操作
CSS 操作 通过 JavaScript 操作 CSS HTML 元素的 style 属性 <div style="background-color:red; border:1px s ...
- [LeetCode] Rotate String 旋转字符串
We are given two strings, A and B. A shift on A consists of taking string A and moving the leftmost ...