python爬虫请求页面urllib库详解
作者:milk-request
基本库urllib
学习爬虫,最初的操作便是模拟浏览器向服务端发出请求,这里我们就学习使用urlib库的用法
使用urllib
首先,我们需要了解urllib库,它是python内置的HTTP请求库,也就是说不需要额外安装即可使用,它包含4个模块
- request:它是最基本的HTTP请求模块,可以用来模拟发送请求。
- error:异常处理模块。
- parse:一个工具模块,提供了许多URL处理方法。
- robotparser:主要时用来识别网站的robot.txt文件然后判断那些网站是否可以爬。
发送请求
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超时时间很有必要。
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参数
- url 第一个参数,必传参数,其他都是可选参数。
- data 第二个参数,如果要传,必须传bytes类型,如果是字典可先用urllib.parse模快里的urlencode()编码。
- headers 第三个参数,可以在构造请求时通过header参数直接构造,也可通过调用请求实例的add_header()方法添加。
- origin_req_host 第四个参数指的是请求方的host名称或IP地址。
- unverifiable 第五个参数表示这个请求时否时无法验证的默认时False,意思就是说用户没有足够的权限来选择接收这个请求的结果。
- methon 第六个参数是一个字符串,指示请求使用的方法,比如GET POST和PUT等。
多参数实例:
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)
到此这篇关于python爬虫请求页面urlib库详解的文章就介绍到这了,更多相关python爬虫urlib库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!