python爬虫学习6_UrlLib使用进阶

版权声明:随意了,开心就好。反正是给大家分享的笔记 https://blog.csdn.net/u011486491/article/details/83211676

python爬虫学习6_UrlLib使用进阶

基础使用的话参看之前的文档:

基础使用:https://blog.csdn.net/u011486491/article/details/82844587

请求头和代理:https://blog.csdn.net/u011486491/article/details/82973379

异常处理:https://blog.csdn.net/u011486491/article/details/82973364

该库有四个模块,分别是urllib.request,urllib.error,urllib.parse,urllib.robotparser。

网络请求

urlopen

简单的网络请求模块,如果直接通过url去访问的话,user-agent内的内容直接是Python-urllib/x.y。直接就被识别成了爬虫,所以我们需要通过Request去封装我们的data和header之后再通过urlopen去访问。

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

data 是 bytes 类型的内容,可通过 bytes()函数转为化字节流。它也是可选参数。使用 data 参数,请求方式变成以 POST 方式提交表单。使用标准格式是application/x-www-form-urlencoded

timeout 参数是用于设置请求超时时间。单位是秒。

cafilecapath代表 CA 证书和 CA 证书的路径。如果使用HTTPS则需要用到。

context参数必须是ssl.SSLContext类型,用来指定SSL设置

cadefault参数已经被弃用,可以不用管了。

该方法也可以单独传入urllib.request.Request对象

该函数返回结果是一个http.client.HTTPResponse对象。

Request的使用

urlopen() 方法可以发起简单的请求。但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入headers(请求头)指定请求方式等信息,我们就可以利用更强大的Request类来构建一个请求。

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

data 参数跟 urlopen() 中的 data 参数用法相同。

headers 参数是指定发起的 HTTP 请求的头部信息。headers 是一个字典。它除了在 Request 中添加,还可以通过调用 Reques t实例的 add_header() 方法来添加请求头。

origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。

unverifiable 参数表示这个请求是否是无法验证的,默认值是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,我们就要将 unverifiable 的值设置成 True。

method 参数指的是发起的 HTTP 请求的方式,有 GET、POST、DELETE、PUT等。

Request的高级用法

如果我们需要在请求中添加代理、处理请求的 Cookies,我们需要用到HandlerOpenerDirector

1) Handler Handler 的中文意思是处理者、处理器。 Handler 能处理请求(HTTP、HTTPS、FTP等)中的各种事情。它的具体实现是这个类 urllib.request.BaseHandler。它是所有的 Handler 的基类,其提供了最基本的Handler的方法,例如default_open()、protocol_request()等。 继承 BaseHandler 有很多个,我就列举几个比较常见的类:

  • ProxyHandler:为请求设置代理

  • HTTPCookieProcessor:处理 HTTP 请求中的 Cookies

  • HTTPDefaultErrorHandler:处理 HTTP 响应错误。

  • HTTPRedirectHandler:处理 HTTP 重定向。

  • HTTPPasswordMgr:用于管理密码,它维护了用户名密码的表。

  • HTTPBasicAuthHandler:用于登录认证,一般和 HTTPPasswordMgr 结合使用。

2) OpenerDirector 对于 OpenerDirector,我们可以称之为 Opener。我们之前用过 urlopen() 这个方法,实际上它就是 urllib 为我们提供的一个Opener。那 Opener 和 Handler 又有什么关系?opener 对象是由 build_opener(handler) 方法来创建出来 。我们需要创建自定义的 opener,就需要使用 install_opener(opener)方法。值得注意的是,install_opener 实例化会得到一个全局的 OpenerDirector 对象。

代理的使用

在高频率访问网站的时候,为了防止网站封我们ip,我们使用代理进行访问。

import urllib.request
​
url = "http://tieba.baidu.com/"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
​
proxy_handler = urllib.request.ProxyHandler({
    'http': 'web-proxy.oa.com:8080',
    'https': 'web-proxy.oa.com:8080'
})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
​
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
​

认证登录

带账号密码的访问;

使用 HTTPPasswordMgrWithDefaultRealm() 实例化一个账号密码管理对象;然后使用 add_password() 函数添加账号和密码;接着使用 HTTPBasicAuthHandler() 得到 hander;再使用 build_opener() 获取 opener 对象;最后使用 opener 的 open() 函数发起请求。

import urllib.request
​
url = "http://tieba.baidu.com/"
user = 'user'
password = 'password'
pwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
pwdmgr.add_password(None,url ,user ,password)
​
auth_handler = urllib.request.HTTPBasicAuthHandler(pwdmgr)
opener = urllib.request.build_opener(auth_handler)
response = opener.open(url)
print(response.read().decode('utf-8'))

cookie登录

为了免去重复登录,我们可以使用cookie来进行登录。

获取 Cookies 需要使用 http.cookiejar.CookieJar() 实例化一个 Cookies 对象。再用 urllib.request.HTTPCookieProcessor 构建出 handler 对象。最后使用 opener 的 open() 函数

import http.cookiejar
import urllib.request
​
url = "http://tieba.baidu.com/"
fileName = 'cookie.txt'
​
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)
​
f = open(fileName,'a')
for item in cookie:
    f.write(item.name+" = "+item.value+'\n')
f.close()
​

User-Agent

为了显得合法地访问别人网站,我们需要设置User-Agent头。

最早的user-Agent是因为不同核心架构浏览器需要加载不同的内容,所以为了区分浏览器和版本,我们有个这个参数。这也是伪装请求的时候必须加入的一个头。

猜你喜欢

转载自blog.csdn.net/u011486491/article/details/83211676
今日推荐