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库的使用的更多相关文章

  1. Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  2. 3.爬虫 urlib库讲解 总结

    urllib库的总结: 用ProcessOn(安利这个软件,够用了)根据前面的几节内容做了个思维导图. urllib库一共有四个模块: request:它是最基本的模块,可以用来模拟发送请求 erro ...

  3. 2.爬虫 urlib库讲解 异常处理、URL解析、分析Robots协议

    1.异常处理 URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过这个类来处理. from urllib ...

  4. 1.爬虫 urlib库讲解 Handler高级用法

    在前面我们总结了urllib库的 urlopen()和Request()方法的使用,在这一小节我们要使用相关的Handler来实现代理.cookies等功能. 写在前面: urlopen()方法不支持 ...

  5. 0.爬虫 urlib库讲解 urlopen()与Request()

    # 注意一下 是import urllib.request 还是 form urllib import request 0. urlopen() 语法:urllib.request.urlopen(u ...

  6. urlib库

    urllib库是python中最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送请求,并可以保存服务器返回的数据. urlopen() urllib.request模块提供了最基本的构造ht ...

  7. 基本urllib库

    urlib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urllib ...

  8. requests库的基本使用

    1.发送get请求 import requests # response=requests.get('http://www.baidu.com') # 查看响应内容,返回的是已经解码的内容 # res ...

  9. Python爬虫与数据分析之模块:内置模块、开源模块、自定义模块

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

随机推荐

  1. 网络流24题 ——运输问题 luogu 4015

    题目描述:这里 题面已经提示我们这是费用流了 那么由源点向所有仓库连边,容量为仓库原有货物量,费用为0 然后由所有零售商店向汇点连边,容量为一个零售商店的需求量,费用为0 最后由仓库向零售商店连边,容 ...

  2. Logstash利用ruby将有用的日志放到一个ES_INDEX将无用的日志放到另一个ES_INDEX

    input{ kafka { bootstrap_servers => "127.0.0.1:9092" client_id => "nginxlog&quo ...

  3. 使用kubeadm创建kubernets集群

    参考:  http://docs.kubernetes.org.cn/459.html   https://blog.csdn.net/gui951753/article/details/833169 ...

  4. 关于postman各功能的说明及用法以及批量执行

    这玩意功能还不错,可以学学,在测试接口或者配合写代码测接口时是有帮助作用的.今天也去打听了一下,一下我就做了一下记录. 首先,主界面: 分开记录,写的详细一些. 左侧菜单栏: 主菜单(请求部分); 输 ...

  5. (DP) 关于最优三角剖分

    https://www.cnblogs.com/Konjakmoyu/p/4905563.html 这个人写的好 最优三角剖分的核心思想: 确定决策顺序. 有时一个解可以用许多决策顺序得出, 这时候我 ...

  6. Linux下PHP扩展pdo_mysql

    1.进入PHP源码包ext/pdo目录 cd ext/pdo 2.执行/usr/local/php/bin/phpize[假设PHP的安装目录为/usr/local/php] /usr/local/p ...

  7. Django——RESTful架构

    一.REST简述 来自维基百科的解释: 表现层状态转换(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博 ...

  8. 51nod 1387 移数字

    任意门 回来拉模版的时候意外发现这个题还没写题解,所以就随便补点吧. 题意其实就是要你求n的阶乘在模意义下的值. 首先找出来一个最大的$m$满足$m^2<=n$,对于大于$m^2$部分的数我们直 ...

  9. connect socket的超时设置

    最近项目中,有个需求是检测某ip地址是否是通的,使用了socket的connect函数.但是,当ip地址写错的话,connect就会一直阻塞在那里,大概2.3分钟才能返回连接失败.这对于用户来说是不可 ...

  10. java jdbc操作数据库通用代码

    1.准备工作 1> 新建一个配置文件,名为jdbc.properties将其放入src中 2>在项目中导入jdbc驱动,注意连接不同的数据库,所用到的驱动是不一样的,这些在网上都能找到 具 ...