urllib库

urllib库是python中的一个基本网络请求库。用于模拟浏览器的行为,向指定服务器发送请求,并接收返回的数据。

在python3中所有的网络请求相关函数都集中在urllib.request模块下面

urlopen函数

向服务器发起请求

urlopen函数的参数

  1. url 目标地址
  2. data 如果有这个参数,将变为post请求
  3. 返回值 http.client.HTTPResponse对象,其中含有下面几个方法:
    • read(size) size为空则读取所有
    • readline() 读取一行
    • readlines() 读取多行
    • getcode() 读取状态值

      基本的使用:
from urllib import request
res = request.urlopen("http://www.baidu.com")
print(res.read())

urlretrieve函数

这个函数可以方便的将网页的一个文件保存到本地。

urlretrieve函数的参数

  1. url 目标地址
  2. 下载路径

    基本使用
from urllib import request
request.urlretrieve("http://www.baidu.com","index.html") #下载百度首页到index.html

urlencode函数

用于完成url中中文以及特殊字符的编码和解码

基本使用:

from urllib import parse
params = {
"name": "张三",
"age": 14,
"地址": "上海市海河大道1544弄3号楼302"
}
res = parse.urlencode(params)
print(res)

执行结果:

age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302

在百度上搜索刘德华

from urllib import request
from urllib import parse # request.urlopen("http://www.baidu.com/s/?wd=刘德华") #直接这样请求会报错
url = "http://www.baidu.com/s/?"
# 定义参数字典
params = {
"wd": "刘德华"
}
# 参数转码
qs = parse.urlencode(params)
# url拼接
url += qs
# 发送请求
res = request.urlopen(url)
print(res.read())

parse_qs函数

将已经编码的url进行解码

基本使用

from urllib import parse
qs = "age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302"
res = parse.parse_qs(qs)
print(res)

执行结果

{'name': ['张三'], 'age': ['14'], '地址': ['上海市海河大道1544弄3号楼302']}

urlparse 和 urlsplit函数

用于将url各个部分进行分割

基本使用

from urllib import parse
url = "http://www.baidu.com/s/?wd=python" res = parse.urlsplit(url)
print(res)
res = parse.urlparse(url)
print(res)

执行结果:

SplitResult(scheme='http', netloc='www.baidu.com', path='/s/', query='wd=python', fragment='')

ParseResult(scheme='http', netloc='www.baidu.com', path='/s/', params='', query='wd=python', fragment='')

可以发现两个结果基本相同,唯一不同的是urlsplit()函数返回结果没有params属性

request.Request类

如果需要在请求中添加header信息,则必须用request.Request类实现

基本使用:

# 通过构造请求头 获取拉勾网的招聘信息
from urllib import request
from urllib import parse
url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false" headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
"Cookie": "_ga=GA1.2.620765502.1560083999; _gid=GA1.2.758158058.1560083999; user_trace_token=20190609203959-b18d608c-8ab3-11e9-a228-5254005c3644; LGUID=20190609203959-b18d64d3-8ab3-11e9-a228-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; JSESSIONID=ABAAABAAAIAACBI2C1935D6770E19BC5BE4390354414026; X_HTTP_TOKEN=b6c2ab256a325419948821065120ec66a55a5e4b49; _gat=1; LGSID=20190610090729-1e5547bf-8b1c-11e9-a22c-5254005c3644; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; LGRID=20190610090729-1e5549e6-8b1c-11e9-a22c-5254005c3644; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560084000,1560090525,1560128850; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560128850; TG-TRACK-CODE=index_search; SEARCH_ID=60cd24c737344a6f98c48dd4fc94c39c"
} data = {
"first": "true",
"pn": 1,
"kd": "python"
} req = request.Request(url, headers=headers, data=(
parse.urlencode(data)).encode("utf-8"), method="POST")
resp = request.urlopen(req)
print(resp.read().decode("utf-8"))

ProxyHandler代理

因为爬虫爬取信息频率过高,容易被服务器的检测机制通过ip地址判定为恶意访问,通过更换代理ip是预防这种情况的有效手段。

基本使用:

from urllib import request

# 不使用代理
req = request.Request("http://httpbin.org/ip")
resp = request.urlopen(req)
print(resp.read()) # 使用代理
# 1.构建handler
handler = request.ProxyHandler({"http": "175.23.43.193:8080"})
# 2.使用handler构建opener
opener = request.build_opener(handler)
# 3. 使用opener发送请求
resp = opener.open("http://httpbin.org/ip")
print(resp.read())

执行结果

b'{\n  "origin": "101.88.45.142, 101.88.45.142"\n}\n'
b'{\n "origin": "175.23.43.193, 175.23.43.193"\n}\n'

小练习 使用urllib登录人人网并访问个人主页

代码:

from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
# 1.人人网登录
# 创建cookiejar对象
cookiejar = CookieJar()
# 创建httpcookieprocess对象
handler = request.HTTPCookieProcessor(cookiejar=cookiejar)
# 创建opener
opener = request.build_opener(handler)
# 使用opener发送登录请求,需要传递用户名和密码
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
data = {
"email": "970138074@qq.com",
"password": "pythonspider"
}
data = parse.urlencode(data)
url = "http://www.renren.com/PLogin.do"
req = request.Request(url, data=data.encode("utf-8"), headers=headers)
opener.open(req) # 2.访问个人主页
dapeng_url = "http://www.renren.com/880151247/profile"
resp = opener.open(dapeng_url)
res = resp.read().decode("utf-8") with open("renren.html", "w") as f:
f.write(res)

通过opener携带cookie

cookiejar.save() 保存cookie 到本地以及从本地加载cookie

# 保存cookie到本地
cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open("http://httpbin.org/cookies/set?corse=python") cookiejar.save(ignore_discard=True) # 该参数设置保存即将过期的cookie # 加载本地的cookie
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load(ignore_discard=True)
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
resp = opener.open("http://httpbin.org/cookies") cookiejar.save(ignore_discard=True) # 该参数设置保存即将过期的cookie
for cookie in cookiejar:
print(cookie)

爬虫基础(1):urllib库的更多相关文章

  1. 爬虫基础之urllib库(代码演示)

    # 自定义opener   from urllib.request import ProxyHandler,build_opener from urllib.error import URLError ...

  2. 爬虫基础之urllib库

    urllib库的基本使用 urlopen() # 导入urllib库 import urllib # 往指定url发送请求,返回一个响应对象 response = urllib.request.url ...

  3. 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础

    第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...

  4. 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...

  5. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  6. 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...

  7. 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...

  8. 第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理

    第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术.设置用户代理 如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执 ...

  9. 爬虫入门之urllib库详解(二)

    爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...

随机推荐

  1. spring boot集成多数据源过程以及错误

    https://blog.csdn.net/aa456aaxxx/article/details/80346703 出现BindingException错误  解决如下 https://my.osch ...

  2. HDU 2138 How many prime numbers(Miller_Rabin法判断素数 【*模板】 用到了快速幂算法 )

    How many prime numbers Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  3. 计算机中丢失OPENGL.dll

    开发OpenGL项目时,在VS开发环境下可能会出现如图所示的错误. 在c:\windows\system32和SysWow64文件夹下存在opengl32.dll,此时,所写程序能够正常编译,但是,程 ...

  4. ResNeXt——与 ResNet 相比,相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半

    from:https://blog.csdn.net/xuanwu_yan/article/details/53455260 背景 论文地址:Aggregated Residual Transform ...

  5. 第十四章-MySQL

    1 安装 MySQL常见的版本 GA: 广泛使用的版本 RC: 最接近正式版本 Alpha和Bean: 内测版本和公测版本 有两种安装方式: 安装包和压缩包 1) 安装msi文件 2) 解压zip文件 ...

  6. BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化

    BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...

  7. windows下搭建绿色nodejs运行环境

    无意中在网上看到NodeJS的文章,发现最近还挺火的,正好我也是做技术的,那就下载个玩玩呗,试试它的魅力,也来亲自感受下. 网上nodejs的环境的搭建到处都是,我这里就不说了,今天我想通过我自己的环 ...

  8. hdu 1521 排列组合 —— 指数型生成函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1521 标准的指数型生成函数: WA了好几遍,原来是多组数据啊囧: 注意精度,直接强制转换(int)是舍去小 ...

  9. poj2777Count Color——线段树+状压

    题目:http://poj.org/problem?id=2777 状压每个颜色的选择情况,取答案时 | 一番: 注意题目中的区间端点可能大小相反,在读入时换一下位置: 注意pushdown()中要l ...

  10. vijos:P1155集合位置(次短路)

    描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法永远 ...