python爬虫---从零开始(二)Urllib库
接上文再继续我们的爬虫,这次我们来述说Urllib库
1,什么是Urllib库
Urllib库是python内置的HTTP请求库
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块
urllib.robotparse robots.txt解析模块
不需要额外安装,python自带的库。
注意:
python2
import urllib2
response = urllib2.urlopen('http://baidu.com')
python3
import urllib.request
response = urilib.request.urlopen('http://www.baidu.com')
python2和python3使用urllib库还是有一定区别的。
2,方法以及模块:
1)request
基本运行:(get方式的请求)
import urllib.request
response = urilib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
运行结果如下:
在这里我们看到,当我们输入urllib.request.urlopen('http://baidu.com')时,我们会得到一大长串的文本,也就是我们将要从这个得到的文本里得到我们所需要的数据。
带有请求参数:(post方式的请求)
import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({'username':'cainiao'}),encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post',data = data)
print(response.read())
在这里我们不难看出,我们给予的data username参数已经传递过去了。
注意data必须为bytes类型
设置请求超时时间:
import urllib.request
response = urllib.request.urlopen('http://httpbin.org/get', timeout = )
print(response.read())
这时我们看到,执行代码时报出timed out错误。我们这时可以使用urllib.error模块,代码如下
import urllib.request
ipmort urllib.error
try:
response = urllib.request.urlopen('http://httpbin.org/get', timeout = 0.1)
print(response.read())
except urllib.error.URLError as e:
print('链接超时啦~!') # 这里我们没有判断错误类型,可以自行加入错误类型判断,然后在进行输出。
说到这,我们就把最简单,最基础的urlopen的基础全都说完了,有能力的小伙伴,可以进行详细阅读其源码,更深入的了解该方法。
2)响应 response
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(type(response))
# 得到一个类型为<class 'http.client.HTTPResponse'>
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(type(response)) # 响应类型
print(response.status) #上篇文章提到的状态码
print(response.getheaders) # 请求头
print(response.getheader('Server')) # 取得请求头参数
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8')) # 响应体,响应内容
响应体为字节流形式的内容,我们需要调用decode(decode('utf-8'))进行转码。
常用的post请求基本写法
from urllib import request,parse
url = 'http://httpbin.org/post'
headers = {
'User-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',
'Host':'httpbin.org'
}
dict = {
'name':'cxiaocai'
}
data = bytes(parse.urlencode(dict),encoding='utf8')
req = request.Request(url =url , data = data , headers = headers , method = 'POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
也可以写成这样的
from urllib import request,parse
url = 'http://httpbin.org/post'
dict = {
'name':'cxiaocai'
}
data = bytes(parse.urlencode(dict),encoding='utf8')
req = request.Request(url =url , data = data , headers = headers , method = 'POST')
req.add_header('User-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
说到这里,我们最基本的urllib请求就可以基本完成了,很大一部分网站也可以进行爬取了。
3,代理设置
代理设置我们这里简单的说一下,后面的博客我们会用实际爬虫来说明这个。
Hander代理
import urllib.request
proxy_hander = urllib.request.ProxyHeader({
'http':'http://127.0.0.1:1111',
'https':'https://127.0.0.1:2222'
})
opener = urllib.request.build_opener(proxy_hander)
response = opener.open('http://www.baidu.com')
print(response.read()) # 我这没有代理,没有测试该方法。
Cookie设置
import http.cookiejar, urllib.request
cookie = http.cookiejar.CookieJar()
hander = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(hander)
response = opener.open("http://www.baidu.com")
for item in cookie:
print(item.name + "=" + item.value)
例如某些网站是需要登陆的,所有我们在这里需要设置Cookie
我们也可以将Cookie保存为文本文件,便于多次进行读取。
import http.cookiejar, urllib.request
filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
hander = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(hander)
response = opener.open("http://www.baidu.com")
cookie.save(ignore_discard=True, ignore_expires=True)
代码运行以后会在项目目录下生成一个cookie.txt
另外一种Cookie的保存格式
import http.cookiejar, urllib.request
filename = 'cookie.txt'
cookie = http.cookiejar.LWPCookieJar(filename)
hander = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(hander)
response = opener.open("http://www.baidu.com")
cookie.save(ignore_discard=True, ignore_expires=True)
运行代码以后也会生成一个txt文件,格式如下
下面我们来读取我们过程保存的Cookie文件
import http.cookiejar, urllib.request
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie.txt',ignore_expires=True,ignore_discard=True)
hander = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(hander)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
4,异常处理
简单事例,在这里我们来访问一个不存在的网站
from urllib import request,error
try:
response = request.urlopen('https://www.cnblogs.com/cxiaocai/articles/index123.html')
except error.URLError as e:
print(e.reason)
这里我们知道这个网站根本不存在的,会报错,我们捕捉该异常可以保证程序继续运行,我们可以执行重试操作
我们也可以查看官网 https://docs.python.org/3/library/urllib.error.html#module-urllib.error5,URL解析
urlparse模块
主要用户解析URL的模块,下面我们先来一个简单的示例
from urllib.parse import urlparse
result = urlparse('https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1')
print(type(result),result)
这里我们看下输出结果:
该方法可以进行url的拆分
也可以制定请求方式http,或者https方式请求
from urllib.parse import urlparse
result = urlparse('www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1',scheme='https')
print(result)
输出结果如下所示:
在这里我们看到了,请求被制定了https请求
我们会看到输出结果里包含一个fragents,我们想将framents拼接到query后面,我们可以这样来做
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#commont',allow_fragments=False)
print(result)
输出结果为
如果没有frament,则拼接到path内
示例:
我们现在知道了URl怎么进行拆分,如果我们得到了URl的集合,例如这样dada = ['http','www.baidu.com','index.html','user','a=6','comment']
我们可以使用urlunparse还有urljoin,主要是来进行url的拼接的,接下来我们来看下我们的示例:
以后面的为基准,如果有就留下,如果没有就从前面取。
如果我们的有了一个字典类型的参数,和一个url,我们想发起get请求(上一期说过get请求传参),我们可以这样来做,
在这里我们需要注意的是,url地址后面需要自行加一个‘?’。
最后还有一个urllib.robotparser,主要用robot.txt文件的官网有一些示例,由于这个不常用,在这里我做过多解释。
官网地址:https://docs.python.org/3/library/urllib.robotparser.html#module-urllib.robotparser 感兴趣的小伙伴可以自行阅读官方文档。 到这里我们就把urllib的基本用法全部说了一遍,可以自己尝试写一些爬虫程序了(先用正则解析,后期我们有更简单的方法)。
想更深入的研读urllib库,可以直接登陆官方网站直接阅读其源码。官网地址: https://docs.python.org/3/library/urllib.html
注意:很多小伙伴看到我的代码直接复制过去,但发现直接粘贴会报错,还需要自己删除多余的空行,在这里我并不建议你们复制粘贴,后期我们整理一个github供大家直接使用。
下一篇文章我会弄一篇关于Requests包的使用,个人感觉比urllib更好用,敬请期待。
感谢大家的阅读,不正确的地方,还希望大家来斧正,鞠躬,谢谢python爬虫---从零开始(二)Urllib库的更多相关文章
- PYTHON 爬虫笔记二:Urllib库基本使用
知识点一:urllib的详解及基本使用方法 一.基本介绍 urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的 ...
- Python爬虫入门之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- Python爬虫入门之Urllib库的基本使用
那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解 ...
- Python爬虫入门:Urllib库的基本使用
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它 是一段HTML代码,加 JS.CS ...
- 芝麻HTTP:Python爬虫入门之Urllib库的基本使用
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...
- Python爬虫入门:Urllib库的高级使用
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 芝麻HTTP: Python爬虫入门之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用
第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...
- 第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理
第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术.设置用户代理 如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执 ...
- 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求
第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...
随机推荐
- Quartz 2D(常用API函数、绘制图形、点线模式)
Quzrtz 2D 绘图的核心 API 是 CGContextRef ,它专门用于绘制各种图形. 绘制图形关键是两步: 1.获取 CGContextRef ; 2.调用 CGContextRef 的方 ...
- 任务28:RequestDelegate管道实现思路
任务28:RequestDelegate管道实现思路 管道的实现机制 RequestDelegate是管道的核心.ApplicationBuilder就是接收了很多个RequestDelegae把它拼 ...
- Swift3.0 UITextView写反馈界面
效果图 适配用的 SnapKit 使用介绍: http://www.hangge.com/blog/cache/detail_1097.html private func creationTextV ...
- 51nod 1051 最大子矩阵和(DP)
题意 略 分析 一道经典的DP题,但是我弱到差点做不出来,真的垃圾 设置\(sum(i,j)代表1-i行第j列的前缀和\),然后枚举行i和行j,再枚举列k,做一遍类似一维的最大子段和即可 #inclu ...
- python 通过setup.py安装和卸载python软件包
安装:sudo python setup.py install 卸载:sudo python setup.py install --record log sudo cat log | sudo xar ...
- 问题 3: 糖果数(candy)
问题 3: 糖果数(candy) 题目描述 学校准备去春游,委托小明分发糖果,每位同学一袋,数量随机. 一共有N袋糖果,编号为1到N,小明拿了从编号a袋到编号b袋的糖果去分发,小明想知道,他一共拿了多 ...
- IT兄弟连 JavaWeb教程 经典面试题3
1.简述什么是重定向? 服务器向浏览器发送—个302状态码及一个Location消息头(该消息头的值是一个地址,称之为重定向地址),浏览器收到后会立即向重定向地址发出请求. 2.简述什么是转发?怎么实 ...
- EOS:dfuse stream 保证不会错过一个心跳
强大的 dfuse history API 给我们带来了高效的链数据获取途径,让我们的 dapp 在用户体验上了一个台阶. 官方示例 不会错过一个心跳 代码分析 函数 pendingActions 待 ...
- swiper.js插件的使用
swiper切换动画效果,需要先加载swiper.animate.min.js和animate.min.css. <!DOCTYPE html><html> <he ...
- compose 函数实现
总结componse函数实现过程 大致特点 参数均为函数, 返回值也是函数 第一函数接受参数, 其他函数接受的上一个函数的返回值 第一个函数的参数是多元的, 其他函数的一元的 自右向左执行 简单实现 ...