urllib的使用
简介
- 可以利用url打开网址,然后下载网页。是python自带的一个爬虫库,你可以通过它模拟浏览器行为给浏览器返送请求,然后将浏览器反馈的页面数据进行抓取
基本用法
- 打开目标网址的方法
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefult=False,context=None)
url:目标网址的地址
data:post提交的数据
timeout:超时后不发送数据,参数以秒为单位
cafile和capath参数为HTTP请求一组信任的CA证书(百度文库对CA的介绍)cafile指向的就是CA证书的的单个文件,而capath是指向的是证书的文件目录。
cadefault:官方给出的说法是[该参数被忽略]。。。。好TNiang随意啊。老外。
context:这个参数也是有关CA证书的,然后子3.6版本之后就不推荐用cafile和cadefault了,推荐用context。推荐使用
ssl.create_default_context()
这个方法可以帮助你选择系统承认的CA证书。
上面的这些参数,url是必须要有的,其他都是选填。
只要熟悉url,data,timeout参数就好了。至于CA认证,后面会说到。
该函数会返回页面的代码和数据
- 举个栗子。。
from urllib import request #包的引入
res = request.urlopen(r'https://www.baidu.com')#打开目标页面
page = res.read()#读取返回的页面,注意数据返回的是字节流
page = page.decode('utf-8')#将字节流页面解码成utf8格式
print(page)#打印数据查看
- 简单的说几个urlopen的返回对象提供的方法,有这些也差不多够用,不够的去官网自己扒拉官方对应的地址 1.read(),readline,readlines(),fileno(),close,这都是对HTTPResponse类型数据进行操作的。
2.info()返回HTTPMessage对象,也就是远程服务器给你的返回的头的信息。
3.getcode()返回http状态码,就是200(请求成功),404(找不到目地址)之类的信息,状态码有好多,可以出门去百度,了解下,一般2开头的都挺好的。
使用Request
urllib.request.Request(url,data=None,headers={},method=None)
使用这个函数可以向网页,提交请求,请求有post和get两种,这个的区别和解释我们后面再说。先看下参数的作用
url:目标地址。。。
data:需要提交的请求。。。
haders:一个字典,用来存放,提交的时候模拟浏览器的头信息,在反爬虫机制中很有用的。
method:请求方式。POST/GET
- 举个例子,自己把代码拷贝下来试试。。
from url import request #库的导入
url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label'#目标地址
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}#模拟的头
req = request.Request(url, headers=headers)#提交请求,这时候的请求不带数据。
page = request.urlopen(req).read()#同样打我们获取的页面,然后读取面数据
page = page.decode('utf-8')#将字节流进行解码
print(page)#打印获取后的页面。
简单的解释下
User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
Referer:可以用来防止盗链。
这些就是为了让那些服务器认为你不是在用爬虫,是人在操作,好多网址是不希望你大量大量的抓取人家数据的。
post请求数据
- 在这里给大家说一下GET和POST的区别,其实也好理解,POST比起GET来说比较安全,解释如下:
GET就是把你请求的参数放在了URL里头,POST是通过请求和body来传递参数,也就是前者你可以直观的看到网页的向服务器请求数据的接口和方式,而post则会把请求的参数和参数的内容都隐藏。 - GET请求网页的方法也就是直接访问地址,就好,读者可以自己亲自试验一下。POST的我给举个例子。
我这里使用的是谷歌浏览器。
找个post类型的网页。。。
嗯。。http://httpbin.org…这个网址可以帮助你在学习爬虫使用拿来练习使用。
1.用谷歌打开是这样的。
2.然后再点击HTTP Methods就会出现如图的内容,再点击post就会看到如图的内容。
3.然后你在点击 try it out然后再点击Excute然后你就看到了一堆展开,其中就会有你请求的地址(request url)和响应体(response body)。
4.编码测试一下
from urllib import request,parse
url = "http://httpbin.org/post"#目标地址
data = {
"1":"hahah",
"2":"wulala"
}#要提交给页面的字典
#这个时候需要注意了,大家还记得我们下载页面后需要解码才可以使用吗?
#这里在提交的时候同样我门需要把内容进行编码成字节流,然后提交部编码的现象,自行观察
data = parse.urlencode(data).encode("utf-8")#进行编码操作
req = request.Request(url,data=data,method="POST")#提交请求
page = reuest.urlopen(req)#打开对应的页面
page = page.read().decode("utf-8")#读取页面,让后解码打印
执行结果如下
异常处理
- 程序在运行时很可能发生异常,当这些异常发生时,如果不做任何的处理,那么程序就会在这时结束运行,死掉啦。
- 处理方法:
固定句式
try:
#可能执行出错语句
except Exception as e:
#出错后。补救的方法,让程序继续执行
#e 可以打印出来查看异常出现的原因
需要注意的是可以有多个异常处理函数。。。
使用代理
urllib.request.ProxyHandler(proxies=None)
- 每一个人或者公司在网络中都有唯一的地址标识符,也就是网络IP。使用爬虫抓取数据时,我们可能1秒10条或者更多的数据,这时候很多网址就会认为你是恶意攻击的坏人,就会把你的IP关在小黑屋,然后我们可以使用代理的IP把我们真正的IP隐藏起来。
- 我比较常用的是89ip代理(89代理地址)。。。不是打广告大家可以使用别的,但是要注意,免费的代理有一定的时效性和不稳定的问题,当然花钱买的话就,,氪金玩家就会不一样。
- 写个例子看下
from urllib import request
dic = "36.25.243.51:80"#代理IP和端口号
my_proxy = request.ProxyHandler({"http":dic})#设置代理ip
opener = request.build_opener(my_proxy)#挂载opener
request.install_opener(opener)#安装opener 经过这3步成功将代理IP挂起来使用
print("使用的IP为{0}".format(my_proxy))
req = request.Request("http://www.baidu.com")
res = request.urlopen(req)
print(res.code)
print(res.read().decode("utf-8"))
部分结果
部分结果
代理IP有时候确实会出现被远程主机拒绝访问或者强制关闭的问题这时候你就需要更换你的代理了。
我有一个构建代理池的方法,连接