python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python爬虫urllib库

python爬虫请求页面urllib库详解

作者:milk-request

这篇文章主要介绍了python爬虫请求页面urllib库详解,python3将urllib和urllib2模块整合并命名为urllib模块,urllib模块有多个子模块,各有不同的功能,需要的朋友可以参考下

基本库urllib

学习爬虫,最初的操作便是模拟浏览器向服务端发出请求,这里我们就学习使用urlib库的用法

使用urllib

首先,我们需要了解urllib库,它是python内置的HTTP请求库,也就是说不需要额外安装即可使用,它包含4个模块

发送请求

urllib.request模块提供了最基本的构造HTTP请求的方法,urllib.request.urlopen(),若在获取请求对象时,不需要过多的参数传递,可以直接选择urllib.request.urlopen();

如果需要加入Headers等信息请求则使用urllib.request.Request()。

1.urlopen()

这里我们以www.baidu.com为例,把这个网页抓取下来. 代码如下:

import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))

添加data(附加数据)参数

data参数是可选的。如果要添加该参数,需要使用bytes()方法将参数转化为bytes类型。

另外,如果传递了这个参数,则它的请求方式就不再是GET方式,而是POST方式。

实例:

import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf-8')
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())

我们传递的参数出现在了form字段中,这表明是模拟了以表单提交的方式,以POST方式传输数据,这里的 //httpbin.org是一个提供HTTP请求测试的站点。

添加timeout(超时时间)参数

timeout参数用于设置超时时间,单位为s,如果请求超出了设置的这个时间还未响应,就会抛出异常。 实例:

import urllib.request
response = urllib.request.urlopen('http://httpbin.org/post', timeout=1)
print(response.read())

在爬取页面的过程中,若一个页面长时间无法响应将导致后续工作无法进行,所以设置timeout超时时间很有必要。

urllib.request官方文档

2.Request()

实例:

import urllib.request
request = urllib.request.Request('https://www.baidu.com')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

Request的构造方法如下:

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

Request参数

多参数实例:

import urllib.request
import urllib.parse
url = 'http://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
                  'Host':'httpbin.org'
}
dict = {
    'name': 'zhangsan'
}
data = bytes(urllib.parse.urlencode(dict), encoding='utf-8')
request = urllib.request.Request(url, data=data, headers=headers, method='POST')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

高级用法

1.验证

出现情景:有些网站在打开时就会弹出提示框,提示你输入用户名和密码,验证成功后才能查看页面,如果要请求这样的页面,该怎么办呢?借助HTTPBasicAuthHandler就可以完成。 代码如下:

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
username = '用户名'
password = '密码'
url = '你要请求的url'
#构建一个密码管理对象,用来保存需要处理的用户名和密码
passwdmgr = HTTPPasswordMgrWithDefaultRealm()
# 添加账户信息,第一个参数realm是与远程服务器相关的域信息,一般没人管它都是写None,后面三个参数分别是 代理服务器、用户名、密码
passwdmgr.add_password(None, url , username, password)
auth_handler = HTTPBasicAuthHandler(passwdmgr)
opener = build_opener(auth_handler)
try:
   result = opener.open(url)
   html = result.read().decode('utf-8)
   print(html)
except URLError as e:
   print(e.reason)

2.代理

添加代理

from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
proxy_handler = ProxyHandler({
    'http': 'http://127.0.0.1:9743',
    'https': 'http://127.0.0.1:9743'
})
opener = build_opener(proxy_handler)
try:
    response = opener.open('https://www.baidu.com')
    print(response.read().decode('utf-8'))
except URLError as e:
    print(e.reason)

3.Cookies

从网站中获取Cookies

代码:

import http.cookiejar
import urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
    print(item.name + "=" + item.value)

为什么要获取Cookies?

维持同一个对话。例如:你用post方式登入了某个网站,又使用了get方式来获取网站个人页面信息,这相当于打开了两个浏览器,是两个会话,不能成功获取个人信息。所以可以在get方式添加cookies参数来维持对话。

保存Cookies

将CookieJar换成MozillaCookieJar,它在生成文件时会用到,是CookieJar的子类,用来处理Cookie和文件相关的事件。 代码:

import http.cookiejar
import urllib.request
filename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)

运行之后,可以发现项目文件夹中生成了一个cookies.txt文件,另外LWPCookieJar可以保存LWP格式的Cookies文件。

如果想获取更多高级用法,可查看官方文档

处理异常

为何要处理异常? 在请求过程中,可能会出现多种多样的错误,如果 爬取多个页面,其中一个页面出现错误会使程序报错而终止运行,所以异常处理是十分有必要的。这里我们学习处理HTTP请求错误异常。

HTTPError

属性:
code:返回HTTP状态码
reason:返回错误原因
headers:返回请求头

实例:

import urllib.error
import urllib.request
try:
    response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01)
except urllib.error.HTTPError as e:
    print(e.reason, e.code, e.headers, sep='\n')

这里为了实现异常将超时间设置为0.01,抛出了time out异常。

解析链接

为什么要解析链接?

当你在爬取网页时,可能会需要搜索此网页的其他信息。这时就需要解析链接,构造链接。

URL由6个部分构成: (://)符号前的是协议scheme,第一个/符号前是域名netloc,后面是path路径,分号(;)后面是参数params,问号(?)后面是查询条件query,一般用作GET类型的URL,井号(#)后面是锚点,用于直接定位页面内部下拉位置。

标准链接格式: scheme://netloc/path;params?query#fragment

urlparse()

该方法可以实现URL的识别和分段

参数
urlstring:这是必填项。待解析的URL。
scheme:默认协议。
allow_fragments:是否忽略fragment。如果被设置为False,fragment部分就会被忽略,被解析为path,parameters,query的一部分。

实例:

from urllib.parse import urlparse
result = urlparse('https://docs.python.org/3/library/urllib.request.html#urllib.request.OpenerDirector')
print(type(result), result)

对url进行解析的各种方法官方文档

到此这篇关于python爬虫请求页面urlib库详解的文章就介绍到这了,更多相关python爬虫urlib库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文