Scrapy学习笔记-基本库的使用urllib

了解一下urllib库,它是Python内置的HTTP 请求库,也就是说不需要额外安装即可使用它,包含如下4 个模块。
在这里插入图片描述

发送请求

使用urllib的request模块,我们可以方便地实现请求的发送并得到响应。本节就来看下它的具体用法。

urlopen

urllib.request模块提供了最基本的构造HTTP请求的方法, 利用它可以模拟浏览器的一个请求发起过程, 同时它还带有处理授权验证( authenticaton )、重定向( redirection) 、浏览器Cookies 以及其他内容。
利用最基本的urlopen方法,可以完成最基本的简单网页的GET请求抓取

import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(type(response))
print(response.read().decode('utf-8'))

在这里插入图片描述
response是一个HTTPResponse类型的对象,主要包含read、readinto、getheader、getheaders、fileno等方法,以及msg、version、status、reason、debuglevel、closed等属性。调用read方法可以得到返回的网页内容,调用status 属性可以得到返回结果的状态码

前两个输出分别输出了响应的状态码和响应的头信息,最后一个输出通过调用getheader方法并传递一个参数Server 获取了响应头中的Server 值,结果是nginx ,意思是服务器是用Nginx搭建的。
在这里插入图片描述

在这里插入图片描述
data 参数是可选的。如果要添加该参数,并且如果它是字节流编码格式的内容,即bytes类型,则需要通过bytes方法转化。另外,如果传递了这个参数,则它的请求方式就不再是GET 方式,而是POST 方式
在这里插入图片描述
传递了一个参数word ,值是hello o 它需要被转码成bytes (字节流)类型。其中转字节流采用了bytes方法,该方法的第一个参数需要是str (字符串)类型,需要用urllib.parse模块里的urlencode方法来将参数字典转化为字符串;第二个参数指定编码格式,这里指定为utf8 。我们传递的参数州现在了form 字段中,这表明是模拟了表单提交的方式,以POST 方式传输数据。

timeout参数用于设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间, 还没有得到响应, 就会抛出异常。如果不指定该参数,就会使用全局默认时间。它支持HTTP , HTTPS 、FTP请求。
在这里插入图片描述
抛出了URLError异常,该异常属于urllib.error模块,错误原因是超时。因此,可以通过设置这个超时时间来控制一个网页如果长时间未响应,就跳过它的抓取。这可以利用try except语句来实现。
在这里插入图片描述
这里我们请求测试链接,设置超时时间是O l 秒,然后捕获了URLError 异常,接着判断异常是socket.timeout 类型(意思就是超时异常)。

context参数,它必须是ssl.SSLContext类型,用来指定SSL设置。cafile 和capath这两个参数分别指定CA 证书和它的路径,这个在请求HTTPS链接时会有用。cadefault参数现在已经弃用了,其默认值为False 。

Request

利用urlopen方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求。如果请求中需要加入Headers 等信息,就可以利用更强大的Request类来构建。依然是用urlopen方法来发送这个请求,只不过这次该方法的参数不再是URL,而是一个Request类型的对象
在这里插入图片描述
在这里插入图片描述
第一个参数url用于请求URL ,这是必传参数,其他都是可选参数。第二个参数data 如果要传,必须传bytes(字节流)类型的。如果它是字典,可以先用urllib.parse 模块里的urlencode()编码。
第三个参数headers 是一个字典,它就是请求头,我们可以在构造请求时通过headers 参数直接构造,也可以通过调用请求实例的add_ header方法添加。添加请求头最常用的用法就是通过修改User-Agent 来伪装浏览器,默认的User-Agent 是一Python-urllib ,我们可以通过修改它来伪装浏览器。比如要伪装火狐浏览器,你可以把它设置为:Mozilla/s.o (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11
第四个参数origin_req_host 指的是请求方的host 名称或者IP 地址。
第五个参数unverifiable 表示这个请求是否是无法验证的,默认是False ,意思就是说用户没有足够权限来选择接收这个请求的结果。例如,我们请求一个HTML 文档中的图片,但是我们没有向动抓取图像的权限,这时unverifiable 的值就是True。
第六个参数method是一个字符串,用来指示请求使用的方法,比如GET 、POST 和PUT 等。
在这里插入图片描述
在这里插入图片描述

urllib.request模块里的BaseHandler 类,它是所有其他Handler 的父类,它提供了最基本的方法,例如default_open 、protocol_request 等。接下来,就有各种Handler子类继承这个BaseHandler 类,举例如下。
在这里插入图片描述
另一个比较重要的类就是OpenerDirector ,我们可以称为Opener 。我们之前用过urlopen这个方法,实际上它就是urllib 为我们提供的一个Opener。那么,为什么要引人Opener 呢?因为需要实现更高级的功能。之前使用的Request 和urlopen相当于类库为你封装好了极其常用的请求方法,利用它们可以完成基本的请求,但是现在不一样了,我们需要实现更高级的功能,所以需要深入一层进行配置,使用更底层的实例来完成操作,所以这里就用到了Opener 。
Opener 可以使用open方法,返回的类型和urlopen如出一辙。那么,它和Handler 有什么关系呢?简而言之,就是利用Handler来构建Opener
验证
在这里插入图片描述
首先实例化HTTPBasicAuthHandler 对象,其参数是HTTPPasswordMgrWithDefaultRealm 对象,它利用add_password 添加进去用户名和密码,这样就建立了一个处理验证的Handler。接下来,利用这个Handler 并使用build_opener方法构建一个Opener ,这个Opener 在发送请求时就相当于已经验证成功了。接下来,利用Opener的open方法打开链接,就可以完成验证了。
代理
在这里插入图片描述
这里在本地搭建了一个代理,它运行在9743端口上。使用了ProxyHandler ,其参数是一个字典,键名是协议类型(比如HTTP 或者HTTPS 等),键值是代理链接,可以添加多个代理。

Cookies
将网站的Cookies 获取下来
在这里插入图片描述在这里插入图片描述
声明一个CookieJar对象。接下来,就需要利用HTTPCookieProcessor来构建一个Handler ,最后利用build_opener方法构建出Opener ,执行open函数即可。
输出成文件格式,CookieJar 就需要换成问ozillaCookieJar ,它在生成文件时会用到,是CookieJar 的子类,可以用来处理Cookies 和文件相关的事件,比如读取和保存Cookies ,可以将Cookies 保存成Mozilla 型浏览器的Cookies 格式。
LWPCookieJar 同样可以读取和保存Cookies ,但是保存的格式和MozillaCookieJar 不一样,它会保存成libwww-perl(LWP)格式的Cookies 文件。
在这里插入图片描述
生成了Cookies 文件后,怎样从文件中读取并利用呢?以LWPCookieJar 格式为例来看一下:
在这里插入图片描述
这里调用load方法来读取本地的Cookies 文件,获取到了Cookies 的内容。不过前提是我们首先生成了LWPCookieJar格式的Cookies ,并保存成文件,然后读取Cookies 之后使用同样的方法构建Handler 和Opener 即可完成操作。

处理异常

urllib的error模块定义了由request 模块产生的异常。如果出现了问题, request模块便会抛出error模块中定义的异常。

URLError

URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块生的异常都可以通过捕获这个类来处理。它具有一个属性reason ,即返回错误的原因。
在这里插入图片描述
打开一个不存在的页面照理来说应该会报错,但是这时我们捕获了URL Error 这个异常,运行结果如下:Not Found 程序没有直接报错,而是输归了如上内容,这样通过如上操作,我们就可以避免程序异常终止,同时异常得到了有效处理。

HTTPError

它是URLError 的子类,专门用来处理HTTP 请求错误,比如认证请求失败等。它有如下3 个属性
code : 返回HTTP 状态码,比如404 表示网页不存在, 500 表示服务器内部错误等。
reason :同父类一样,用于返回错误的原因。
headers : 返回请求头。
在这里插入图片描述
因为URLError是HTTPError的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,所以上述代码更好的写法如下:
在这里插入图片描述
这样就可以做到先捕获HTTPError ,获取它的错误状态码、原因、headers 等信息。如果不是HTTPError 异常,就会捕获URLError 异常,输出错误原因。最后,用else 来处理正常的逻辑。
有时候, reason 属性返回的不一定是字符串,也可能是一个对象
在这里插入图片描述
可以发现, reason 属性的结果是socket.timeout 类。所以,这里我们可以用isinstance方法来判断它的类型,作出更详细的异常判断。

解析链接

urllib库里还提供了parse模块,它定义了处理URL的标准接口,例如实现URL各部分的抽取、合并以及链接转换。它支持如下协议的URL处理:file、ftp、gopher、hdl、http、https、imap、mailto、mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、sip、sips、snews、svn、svn+ssh、telnet和wais。
urlparse方法可以实现URL 的识别和分段
在这里插入图片描述
返回结果是一个ParseResult类型的对象,它包含6个部分,分别是scheme、netloc、path、params、query和fragment 。可以发现, urlparse方法将其拆分成了6 个部分。大体观察可以发现,解析时有特定的分隔符。比如,😕/前面的就是scheme ,代表协议;第一个/符号前面便是netloc ,即域名,后面是path,即访问路径;分号;前面是params,代表参数;问号?后面是查询条件query,一般用作GET类型的URL;井号#后面是锚点,用于直接定位页面内部的下拉位置。
在这里插入图片描述
在这里插入图片描述
urlstring :这是必填项,即待解析的URL。scheme:它是默认的协议(比如http或https等)。假如这个链接没有带协议信息,会将这.个作为默认的协议。allow_ fragments:即是否忽略fragment 。如果它被设置为False,fragment 部分就会被忽略,它会被解析为path、parameters或者query的一部分,而fragment部分为空。
返回结果ParseResult实际上是一个元组,我们可以用索引顺序来获取,也可以用属性名获取
在这里插入图片描述

urlunparse实现URL的构造,接受的参数是一个可迭代对象,但是它的长度必须是6 , 否则会抛出参数数量不足或者过多的问题。
在这里插入图片描述

urlsplit和urlparse方法非常相似, 只不过它不再单独解析params这一部分,只运回5个结果。params会合并到path中。返回结果是SplitResult , 它其实也是一个元组类型, 既可以用属性获取值,也可以用索引来获取。
在这里插入图片描述
urlunsplit是将链接各个部分组合成完整链接的方法,传人的参数也是一个可迭代对象,例如列表、元组等,唯一的区别是长度必须为5
在这里插入图片描述
urljoin 提供一个base_url(基础链接)作为第一个参数,将新的链接作为第二个参数,该方法会分析base_url的scheme 、netloc和path这3 个内容并对新链接缺失的部分进行补充,最后返回结果。

base_url提供了三项内容scheme、netloc和path。如果这3 项在新的链接里不存在,就予以补充;如果新的链接存在,就使用新的链接的部分。而base_url中的params 、query和fragment是不起作用的。
在这里插入图片描述
urlencode 构造GET 请求参数
在这里插入图片描述
首先声明了一个字典来将参数表示出来,然后调用urlencode方法将其序列化为GET请求参数。
parse_qs GET 请求参数转回字典
在这里插入图片描述
parse_qsl 将参数转化为元组组成的列表
在这里插入图片描述

quote 将内容转化为URL编码的格式。URL中带有中文参数时,有时可能会导致乱码的问题,此时用这个方法可以将巾文字符转化为URL编码
在这里插入图片描述
unquote URL 解码

分析Robots协议

利用urllib的robotparser模块,可以实现网站Robots协议的分析。robots.txt文件,放在网站的根目录下,和网站的人口文件(比如index.php 、index.html 和index.jsp 等)放在一起。
禁止所有爬虫访问任何目录的代码如下:
在这里插入图片描述
允许所有爬虫访问任何目录的代码如下:
在这里插入图片描述
禁止所有爬虫访问网站某些目录的代码如下:
在这里插入图片描述
只允许某一个爬虫访问的代码如下:
在这里插入图片描述
在这里插入图片描述
robotparser提供了一个类RobotFileParser,它可以根据某网站的robots.txt 文件来判断一个爬取爬虫是否有权限来爬取这个网页。
该类用起来非常简单,只需要在构造方法里传人robots.txt 的链接即可。当然,也可以在声明时不传人,默认为空,最后再使用set_url方法设置一下也可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章