Python爬虫之urllib库详解
作者:人猿宇宙 发布时间:2022-01-09 23:03:27
一、说明:
urllib库是python内置的一个http请求库,requests库就是基于该库开发出来的,虽然requests库使用更方便,但作为最最基本的请求库,了解一下原理和用法还是很有必要的。
二、urllib四个模块组成:
urllib.request
请求模块(就像在浏览器输入网址,敲回车一样)
urllib.error
异常处理模块(出现请求错误,可以捕捉这些异常)
urllib.parse
url解析模块
urllib.robotparser
robots.txt解析模块,判断哪个网站可以爬,哪个不可以爬,用的比较少
在python2与python3中有所不同
在python2中:
import urllib2
response = urllib2.urlopen('http://www.baidu.com')
在python3中:
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
三、urllib.request
1、urlopen函数
urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=None)
url参数
from urllib import request
response = request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))
data参数
没有data参数时,发送的是一个get请求,加上data参数后,请求就变成了post方式(利用’http://httpbin.org测试网址)
import urllib.request
import urllib.parse
data1= bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf-8')
response = urllib.request.urlopen('http://httpbin.org/post',data = data1)
print(response.read())
data参数需要bytes类型,所以需要使用bytes()函数进行编码,而bytes函数的第一个参数需要时str类型,所以使用urllib.parse.urlencode将字典转化为字符串。
timeout参数
设置一个超时的时间,如果在这个时间内没有响应,便会抛出异常
import urllib.request
try:
response = urllib.request.urlopen('http://www.baidu.com', timeout=0.001)
print(response.read())
except:
print('error')
将超时时间设置为0.001秒,在这个时间内,没有响应,输出error
2、response 响应类型
import urllib
from urllib import request
response = urllib.request.urlopen('http://www.baidu.com')
print(type(response))
状态码与响应头
import urllib
from urllib import request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))
read方法
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(type(response.read()))
print(response.read().decode('utf-8'))
response.read()返回的是bytes形式的数据,所以需要用decode(‘utf-8’)进行解码。
3、Request对象
如果我们需要发送复杂的请求,在urllib库中就需要使用一个Request对象
import urllib.request
#直接声明一个Request对象,并把url当作参数直接传递进来
request = urllib.request.Request('http://www.baidu.com')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
声明了一个Request对象,把url当作参数传递给这个对象,然后把这个对昂作为urlopen函数的参数
更复杂的请求,加headers
#利用Request对象实现一个post请求
import urllib.request
url = 'http://httpbin.org/post'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
data = {'word':'hello'}
data = bytes(str(data),encoding='utf-8')
req = urllib.request.Request(url = url,data = data,headers = headers,method = 'POST')
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))
上面的这个请求包含了请求方式、url,请求头,请求体,逻辑清晰。
Request对象还有一个add_header方法,这样也可以添加多个键值对的header
4、高级请求方式
设置代理
很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。ProxyHandler(设置代理的handler),可以变换自己的IP地址。
from urllib import request # 导入request模块
url = 'http://httpbin.org' # url地址
handler = request.ProxyHandler({'http': '122.193.244.243:9999'}) # 使用request模块ProxyHandler类创建代理
#handler = request.ProxyHandler({"http":"账号:密码@'122.193.244.243:9999'"})
#付费代理模式
opener = request.build_opener(handler) # 用handler创建opener
resp = opener.open(url) # 使用opener.open()发送请求
print(resp.read()) # 打印返回结果
cookie
import urllib.request
import urllib.parse
url = 'https://weibo.cn/5273088553/info'
# 正常的方式进行访问
# headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
# }
#携带cookie进行访问
headers = {
'GET https': '//weibo.cn/5273088553/info HTTP/1.1',
'Host': ' weibo.cn',
'Connection': ' keep-alive',
'Upgrade-Insecure-Requests': ' 1',
'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
'Accept': ' text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
# 'Referer: https':'//weibo.cn/',
'Accept-Language': ' zh-CN,zh;q=0.9',
'Cookie': ' _T_WM=c1913301844388de10cba9d0bb7bbf1e; SUB=_2A253Wy_dDeRhGeNM7FER-CbJzj-IHXVUp7GVrDV6PUJbkdANLXPdkW1NSesPJZ6v1GA5MyW2HEUb9ytQW3NYy19U; SUHB=0bt8SpepeGz439; SCF=Aua-HpSw5-z78-02NmUv8CTwXZCMN4XJ91qYSHkDXH4W9W0fCBpEI6Hy5E6vObeDqTXtfqobcD2D32r0O_5jSRk.; SSOLoginState=1516199821',
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
# 输出所有
# print(response.read().decode('gbk'))
# 将内容写入文件中
with open('weibo.html', 'wb') as fp:
fp.write(response.read())
四、urllib.error
可以捕获三种异常:URLError,HTTPError(是URLError类的一个子类),ContentTooShortError
URLError只有一个reason属性
HTTPError有三个属性:code,reason,headers
import urllib.request
from urllib import error
try:
response = urllib.request.urlopen('http://123.com')
except error.URLError as e:
print(e.reason)
import urllib
from urllib import request
from urllib import error
#先捕捉http异常,再捕捉url异常
try:
response = urllib.request.urlopen('http://123.com')
except error.HTTPError as e:
print(e.reason, e.code, e.headers)
except error.URLError as e:
print(e.reason)
else:
print('RequestSucess!')
五、URL解析urllib.parse
urlparse函数
该函数是对传入的url进行分割,分割成几部分,并对每部分进行赋值
import urllib
from urllib import parse
result = urllib.parse.urlparse('http://www,baidu.com/index.html;user?id=5#comment')
print(type(result))
print(result)
结果方便的拆分了url
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www,baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
Process finished with exit code 0
从输出结果可以看出,这几部分包括:协议类型、域名、路径、参数、query、fragment
urlparse有几个参数:url,scheme,allow_fragments
在使用urlparse时,可以通过参数scheme = 'http’的方式来指定默认的协议类型,如果url有协议类型,scheme参数就不会生效了
urlunparse函数
与urlparse函数作用相反,是对url进行拼接的
urljoin函数
用来拼接url
urlencode函数
可以把一个字典转化为get请求参数
六、urllib.robotparser
使用较少,可作为了解
来源:https://blog.csdn.net/s_unbo/article/details/122821635
猜你喜欢
- 很早就在这里看到过解决方案,与嗷嗷讨论后发现这个方案还是很可靠的。当然,唯一的缺点就是每一个属性都要去Hack,但我在很多实践中,只用‘修正
- 本文实例讲述了Python图像处理之直线和曲线的拟合与绘制。分享给大家供大家参考,具体如下:在数据处理和绘图中,我们通常会遇到直线或曲线的拟
- 很多的朋友一而再,再而三的在Server.Mappath上卡壳,cnbruce也是一遍两遍地重复,还是不能全部解决,所以通过下面的举例,希望
- 前言当我们需要对列表(list)、元组(tuple)、字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是
- 以下的文章主要介绍的是SQL Serve数据库到DB2连接服务器的实现过程,我们大家都知道不同数据库平台的互连,一般对其称之为数据库的异构服
- 简介  在现在的移动端App中,由于开发效率、需求频繁变更的需求情况下,经常有相关的运营需求,经常要进行更新,如果全部采用
- '************************************* 'asp计算随机数&nb
- access中可以将文本中的数据轻松导入表中,mysql中用起来没那么方便,其实起来也很简单。首先将数据记录按行处理好用特定的字符分开如:“
- 所谓线性最小二乘法,可以理解为是解方程的延续,区别在于,当未知量远小于方程数的时候,将得到一个无解的问题。最小二乘法的实质,是保证误差最小的
- Player.playState0 Undefined Windows Media Player is in an undefined st
- 首先要说的是python中的除法运算,在python 2.5版本中存在两种除法运算,即所谓的true除法和floor除法。当使用x/y形式进
- Golang精编100题能力模型(测试)初级primary:熟悉基本语法,能够看懂代码的意图;在他人指导下能够完成用户故事的开发,编写的代码
- 这个间歇性向上滚动js代码很适合做广告展示,友情链接等等。与平常的无缝向上连续滚动不同的是它每滚动一个就会停顿一会儿。<!DOCTYP
- 本文实例为大家分享了微信小程序实现图片上传功能的具体代码,供大家参考,具体内容如下前端:微信开发者工具后端:.Net服务器:阿里云这里介绍微
- python中format的使用format函数这是一种字符串格式化的方法,用法如str.format()。基本语法是通过 {} 和 : 来
- VS2013的简单WInForm控件,通过WebRequest,WebResponse来访问,接收:private void btn_int
- 使用xhtml+css布局经常性地会使用到float,很多邪门的事儿都有可能是浮动在作怪,那么清除浮动就是必须要做的,而且随时性地对父级元素
- 目录获取二维码部分获取关注状态值解析微信服务器报文大致思路:调用微信带参数二维码接口生成二维码,前端显示二维码同时于服务器进行长链接通信,监
- 这章是结合之前学习的Tensforboard与Transforms的一个练习。直接上代码:from PIL import Imagefrom
- 本文介绍了使用XMlhttp技术来生成html页面,值得借鉴。相关函数:<% ’定义xmlhttp funct