Python3爬虫之Urllib库

本文详细介绍了Python3的Urllib库,包括request模块的urlopen方法、响应(response)处理、request方法、Handler(如代理、Cookie、验证处理)、异常处理、Urlparse模块的多种方法(如urlsplit、urljoin、urlencode等)以及robotparser模块解析robots.txt协议。内容涵盖Get、Post请求、响应头、请求头、代理设置、Cookie管理、URL解析和编码等爬虫基础操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、总述

Urllib为Python内置的HTTP请求库:

urllib.request :请求模块(模拟发送请求)

urllib.error :异常处理模块(出现请求错误时便于后续处理,使程序不会突然中止)

urllib.parse :url解析模块(提供url处理方法)

urllib.rebotparser: robots.txt解析模块(判断哪些可爬、不可爬)

 

二、request模块中的urlopen方法

整体参数介绍:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
#urlopen前三个参数用的最多,分别是:网站、网站的数据、超时设置.
#cafile和capath这两个参数分别指定CA证书和它的路径,这个在请求HTTPS链接时会有用.
#cadefault参数现在已经弃用了,其默认值为False.

1.url参数

实例代码:爬取百度主页源代码(Get请求)

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com') 
#把请求的结果传给response
print(response.read().decode('utf-8'))
#注意的是read()方法获取的是响应体中的内容(bytes形式)将字节流转换为utf-8(字符串)输出

2.data参数

实例代码:把'word':'hello'这个字典通过urlopen函数以Post形式传递,从而完成一个POST请求(加了data参数就是以Post形式请求,否则就是Get方式)

import urllib.request
import urllib.parse

data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
#这里我们传递了一个参数word,值是hello,它需要被转码成bytes(字节流类型)
#其中转字节流用了bytes()方法,所需的第一个参数是str(字符串)类型
#它需要用urllib.parse模块里的urlencode()方法来将参数字典转化为字符串
#第二个参数则用来指定编码类型.
response = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(response.read())

运行结果:

传递的参数出现在了form字段中,表明是模拟了表单提交的方式,以Post形式传输数据。

 

 3.timeout(超时设置)

import urllib.request

response = urllib.request.urlopen('http://httpbin.org/get',timeout=1)
print(response.read())
#如果超过了时间没有得到相应则抛出异常,否则会正常显示结果

还可以通过设置超时时间来控制一个网页如果长时间未响应,就跳过它的抓取。这可以利用try except语句来实现。 

import urllib.request
import urllib.error
import socket

try:
    response = urllib.request.urlopen('http://httpbin.org/get',timeout=0.1)
#若没有在0.1s内得到相应就会抛出异常
except urllib.error.URLError as e:
        if isinstance(e.reason,socket.timeout):
#URLError中有很多类型的异常,而 socket.timeout 只是其中一种
#所以用 isinstance(e.reason, socket.timeout)来对这种类型进行判断
#如果是超时错误,则打印TIME OUT
                print('TIME OUT')

 

三、响应(response)

1.获取响应类型:type()

import urllib.request

response = urllib.request.urlopen('https://www.python.org')
print(type(response))#type()方法输出响应类型

运行结果: 

它是一个HTTPResponse类型的对象,主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等属性。

 2.获取状态码与响应头

import urllib.request

response = urllib.request.urlopen('https://www.python.org')
print(response.status) #获取状态码
print(response.getheaders()) #获取响应头
print(response.getheader('Server')) #获取响应头中特定的内容如:Server(服务器类型)

运行结果: 

 

四、request模块中的request方法

利用urlopen()方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求。若我们要在请求中加入别的信息,用上面的urlopen函数是无法满足的。倘若我们要在请求中加入Headers参数,但在urlopen中是没有提供这个参数的,因此我们可以创建一个request对象——使用request来实现

1.request方法介绍:

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

第一个参数url用于请求URL,这是必传参数,其他都是可选参数。

第二个参数data如果要传,必须传bytes(字节流)类型的。如果它是字典,可以先用urllib.parse模块里的urlencode()编码。

第三个参数headers是一个字典,它就是请求头,我们可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加。

       添加请求头最常用的用法就是通过修改User-Agent来伪装浏览器,默认的User-Agent是Python-urllib,我们可以通过修改它来伪装浏览器。比如要伪装火狐浏览器,可以把它设置为:

       Mozilla/5.0 (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等。

 

实例:利用request构造Post请求,并加入headers

from urllib import request,parse

url = 'http://httpbin.org/post'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)',
    'Host':'httpbin.org'
}#请求头信息
dict = {
    'name':'Germey' #构造一个字节流表单
}
data = bytes(parse.urlencode(dict),encoding='utf-8') 
req = request.Request(url=url,data=data,headers=headers,method='POST') #构造一个request结构
response = request.urlopen(req)
print(response.read().decode('utf-8'))

运行结果: 

可以看到,我们构造的Request包含了之前所提到的信息,请求的时候我们是把Request当成一个整体传递给了urlopen,就可以实现这样的请求了。好处是整个Request的结构是非常清晰的。
此外还有另外一种实现方式,就是用add_header()方法,也可以实现相同的效果:

from urllib import request,parse

url = 'http://httpbin.org/post'
dict = {
    'name':'Germey'
}
data = bytes(parse.urlencode(dict),encoding='utf8')
req = request.Request(url=url,data=data,method='POST')
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64)')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

 

五、Headler

Headler可以理解为各种处理器,有专门用来处理登录验证的,有处理Cookies的,有处理代理设置的。利用它们,我们几乎可以做到HTTP请求中的所有事情。

首先先介绍一下urllib.request模块里的BaseHandler类,它是所有其他Handler的父类,它提供了最基本的方法,如:default_open()、protocal_request等.

接下来就由各种Handler子类继承这个BaseHandler类,举例如下.

HTTPDefaultErrorHandler:用来处理HTTP响应错误,错误都会抛出HTTPError类型的异常.

HTTPRedirectHandler:用来处理重定向.

HTTPCookieProcessor:用来处理Cookies.

ProxyHandler:用于设置代理,默认代理为空。

HTTPPasswordMgr:用来管理密码,它维护了用户名和密码的表.

HTTPBasicAuthHandler:用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题.

另一个比较重要的类就是OpenerDirector,我们可以称之为Opener.我们之前用过urlopen()这个方法,实际上它就是urllib为我们提供的一个Opener.之前使用的Request和urlopen()相当于类库为你封装好了极其常用的请求方法,利用它们可以完成基本的请求,但是现在不一样了,我们需要用到更高级的功能,因此需要深入一层进行配置,使用更底层的实例来完成操作,所以这里就用到了Opener.Opener可以使用open()方法,返回的类型和urlopen()如出一辙.那么,它和Handler有什么关系呢?简而言之就是利用Handler来构建Opener. 

1.代理

代理是用来对ip地址进行伪装成不同地域的,防止ip在爬虫运行时被封掉。
示例:

import urllib.request

proxy_handler = urllib.request.ProxyHandler(
{
        'http':'http://127.0.0.1:9743',
        'https':'https://127.0.0.1:9743'
    }
)#构建proxyHandler,传入代理的地址
opener = urllib.request.build_opener(proxy_handler)#再构建一个带有handler的opener
response = opener.open('http://httpbin.org/get')
print(response.read())

 

2.Cookie

Cookie是在客户端保存的用来记录用户身份的文本文件。在爬虫时,主要是用来维护登录状态,这样就可以爬取一些需要登录认证的网页了。

 实例:

from urllib import request
from http import cookiejar

cookie =cookiejar.CookieJar()#将cookie声明为一个CookieJar对象
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response  =opener.open('http://www.baidu.com')#通过opener传入,并打开网页
for item in cookie:#通过遍历把已经赋值的cookie打印出来
    print(item.name+'='+item.value)#通过item拿到每一个cookie并打印

运行结果: 

Cookie的保存: 我们还可以把cookie保存成文本文件,若cookie没有失效,我们可以从文本文件中再次读取cookie,在请求时把cookie附加进去,这样就可以继续保持登录状态了。

from urllib import request
from http import cookiejar

filename="cookie.txt"
cookie=cookiejar.MozillaCookieJar(filename)
#把cookie声明为cookiejar的一个子类对象————MozillaCookieJar,它带有一个save方法,可以把cookie保存为文本文件
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)#调用save方法

查看桌面有:

另一种保存cookie的方法:

from urllib import request
from http import cookiejar

filename="cookie1.txt"
cookie=cookiejar.LWPCookieJar(filename)
#把cookie声明为cookiejar的一个子类对象————LWPCookieJar(),它带有一个save方法,可以把cookie保存为文本文件
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)#调用save方法

查看桌面有:

Cookie的读取:我们可以选择相对应的格式来完成读取。以上面的LWP格式为例

from urllib import request
from http import cookiejar


cookie=cookiejar.LWPCookieJar() #z注意选择相应的格式,这里是LWP
cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True)#load方法是读取的关键
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

 

3.处理验证 

有些网站在打开时会弹出提示框,直接提示你输入用户名和密码,验证成功才能查看页面,如果要请求这样的页面,就需要借助HTTPBasicAuthHandler就可以完成

实例:

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError

username = 'username'
password = 'password'
url = 'http://localhost:5000'

p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)
auth_handler = HTTPBasicAuthHandler(p)
Opener = build_opener(auth_handler)
#首先实例化HTTPBasicAuthHandler对象,其参数是HTTPPasswordMgrWithDefaultRealm对象
#它利用add_password()添加进去用户名和密码,这样就建立了一个处理验证的Handler
#接下来利用这个Handler并使用build_opener()方法构建一个Opener,这个Opener在发送请求时就相当于已经验证成功了
#接下来利用Opener的open()方法打开链接,就可以完成验证了
try:
	result = Opener.open(url)
	html = result.read().decode('utf-8')
	print(html)
except URLError as e:
	print(e.reason)

 

六、异常处理:

 

from urllib import request,error

#我们试着访问一个不存在的网址
try:
    response = request.urlopen('http://www.cuiqingcai.com/index.html')
except error.URLError as e:
    print(e.reason, e.code, e.headers)#通过审查可以查到我们捕捉的异常是否与之相符

运行结果: 

 

可以看到这里捕获了HTTPError异常,输出了reason、code和headers属性。这样的异常处理可以保证爬虫在工作时不会轻易中断。那么,urllib可以捕捉哪些异常呢?其实一般碰到有两个:HTTP和URL。我们一般只需要捕获这两个异常就可以了。

HTTPError是URLError的子类,专门用来处理HTTP请求错误,比如认证请求失败等.它有如下三个属性.

code:返回HTTP状态码,比如404表示网页不存在,500表示服务器内部错误.

reason:同父类一样,用于返回错误的原因.

headers:返回请求头.

from urllib import request,error

#我们试着访问一个不存在的网址
try:
    response = request.urlopen('http://www.cuiqingcai.com/index.html')
except error.HTTPError as e:#最好先捕捉HTTP异常,因为这个异常是URL异常的子类
	print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:
    print(e.reason)
else:
	print('Request Successfully')

运行结果: 

因为URLError是HTTPError的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误.这样就可以做到先捕获HTTPError,先获取它的错误状态码、原因、headers等信息.如果不是HTTPError异常,输出错误原因,最后用else来处理正常的逻辑.


有时候reason属性的返回不一定是字符串,也可能是一个对象.

from urllib import request,error
import socket

try:
    response = request.urlopen('http://www.baidu.com',timeout = 0.01)#超时异常
except error.URLError as e:
    print(type(e.reason))
    if isinstance(e.reason,socket.timeout):#判断error类型
        print('TIME OUT')

可以发现,reason的属性的结果是socket.timeout类.所以,这里我们可以用isinstance()方法来判断它的类型,做出更详细的异常判断.

 

七、Urlparse模块

1.urlparse

urlparse这个方法将url进行分割

urllib.parse.urlparse(urlstring,scheme='',allow_fragments = True)
#分割成(url,协议类型,和#后面的东西)

urlstring:这是必填项,即待解析的URL.

scheme:它是默认的协议(比如Http或者Https等)假如这个链接没有带协议信息,会将这个作为默认的协议 

实例1:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result),result)

运行结果: 

可以发现,urlparse()方法将其拆分成了6个部分.大体观察可以发现,解析时有特定的分隔符.比如://前面的就是scheme代表协议;第一个/符号便是netloc代表域名;后面是path代表访问路径;分号;前面是params代表参数;问号?后面是查询条件query,一般用作Get类型的URL;井号#后面是锚点,用于直接定位页面内部的下拉位置.所以可以得到一个标准的链接格式:scheme://netloc/path;params?query#fragment

 

实例2:

from urllib.parse import urlparse

result = urlparse('www.baidu.com/index.html;user?id=5#comment',scheme='https')#无协议类型指定,自行添加的情况
print(result)

运行结果:我们提供的URL没有包含最前面的scheme信息,但是通过指定默认的scheme参数,返回的结果是https。

 

实例3:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment',scheme='https')
#有指定协议类型,默认添加的情况
print(result)

运行结果:scheme参数只有在URL不含有scheme信息时才能生效.若URL中有scheme信息,就会返回解析出的scheme。

 

实例4:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;userid=5#comment',allow_fragments=False)
##allow_fragments参数使用
print(result)

运行结果:allow_fragments即是否忽略fragment。如果它被设置为False,fragment部分就会被忽略,它会被解析为path、parameters或者query的一部分,而fragment部分为空.

 

实例5:假设URL中不包含params和query

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html#comment',allow_fragments=False)
print(result)
#allow_fragments=False表示#后面的东西不能填,原本在fragment位置的参数就会往上一个位置拼接,可以对比上述实例的区别

运行结果:当URL中不包含params和query时,fragment就会被解析为path的一部分.

 

2.urlunparse(urlparse的反函数)

urlunparse:这个函数用来拼接url。它接受的参数是一个可迭代对象,但是它的长度必须是6,否则会抛出参数数量不足或者过多的问题.

实例:

from urllib.parse import urlunparse#注意即使是空符号也要写进去,不然会出错

data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))

运行结果: 

 

3.urlsplit() 

urlsplit()这个方法和urlparse()方法非常相似,只不过它不再单独解析params这一部分,只返回5个结果.上面例子中的params会合并到path中.

实例:

from urllib.parse import urlsplit

result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result)

运行结果:

 

 

4.urlunsplit() 

urlunsplit()方法与urlunparse()类似,它也是将链接各个部分组合成完整链接的方法,传入的参数也是一个可迭代对象,同样传入的长度必须为5.

实例:

from urllib.parse import urlunsplit

data = ['http','www.baidu.com','index.html','a=6','comment']
print(urlunsplit(data))

运行结果:

 

 

5.urljoin

urljion:这个函数用来拼合url。有了urlunparse()和urlunsplit()方法,我们可以完成链接的合并,不过前提必须要有特定长度的对象,链接的每一部分还需要清晰分开。此外,生成链接还有另一种方法,那就是urljoin()方法.我们可以提供一个base_url作为第一个参数,将新的链接作为第二个参数,这个方法会分析base_url的scheme、netloc和path这三个内容并对新链接缺失的部分进行补充,最后返回结果。通过例子感受以下:以后面的参数为基准,会覆盖掉前面的字段。如果后面的url,存在空字段而前面的url有这个字段,就会用前面的作为补充。

实例:

from urllib.parse import urljoin

print(urljoin('http://www.baidu.com','FAQ.html'))
print(urljoin('httpL//www.baidu,com','http://cuiqingcai.com/FAQ.html'))
print(urljoin('httpL//www.baidu,com/adout.html','http://cuiqingcai.com/FAQ.html?question=2'))
print(urljoin('httpL//www.baidu,com?wd=abc','http://cuiqingcai.com/index.php'))
print(urljoin('httpL//www.baidu,com','?category=2#comment'))
print(urljoin('httpL//www.baidu,com#comment','?category=2'))

运行结果: 

6.urlencode

urlencode()这个函数用来将字典对象转化为get请求参数。

实例:

from urllib.parse import urlencode
 
params = {
'name':'czx',
'age':'23'
}
#这里首先声明了一个字典来将参数表示出来
base_url = 'http://www.baidu.com?'
url = base_url+urlencode(params)
#调用urlencode()方法将其序列化为GET请求参数
print(url)

运行结果: 

 

7.parse_qs() 

有了序列化,必然就有反序列化.如果我们有一串Get请求参数,利用parse_qs()方法,就可以将其转回字典。

实例:

from urllib.parse import parse_qs

query = 'name=czx&age=22'
print(parse_qs(query))

运行结果:

 

 

8.parse_qsl()

另外,还有一个parse_sql()方法,它用于将参数转化为元组组成的列表.

实例:

from urllib.parse import parse_qsl

query = 'name=czx&age=22'
print(parse_qsl(query))

运行结果:

 

 

9.quote() 

该方法可以将内容转化为URL编码的格式.URL带有中文参数时,有时候会导致乱码的问题,此时用这个方法可以将中文字符转化为URL编码

实例:

from urllib.parse import quote

keyword = '猪心'
url = 'http://www.baidu.com/s?wd=' + quote(keyword)
print(url)

运行结果:

 

 

10.unquote() 

有了quote()方法自然还有unquote()方法,它可以进行URL解码

实例:

from urllib.parse import unquote

url = 'http://www.baidu.com/s?wd=%E7%8C%AA%E5%BF%83'
print(unquote(url))

运行结果:

 

 

八、robotparser

1.Robots协议

Robots协议即爬虫协议,用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可抓取.它通常是一个叫做robots.txt的文本文件,一般放在网页的根目录上与网页入口文件放在一起.当爬虫访问一个站点时,它首先会检查这个站点根目录上是否存在rpbots.txt文件,如果存在,爬虫会根据其中定义的爬取范围来爬取.如果没有找到这个文件,爬虫便会访问所有可直接访问的页面.

样例:

User-agent:*    #对任何爬虫有效
Disallow:/     #不允许抓取的目录
Allow:/public/  #允许抓取的目录

 

2.robotparser

可以利用robotparser模块来解析robots.txt。该模块提供一个类RobotFileParser,它可以根据某网站的robots.txt文件来判断一个爬虫是否有权限来爬取这个网页。只需要在构造方法里传入robots.txt的链接即可.

urllib.robotparser.RobotfileParser(url='')
#也可以在申明时不传入,默认为空,最后再使用set_url()方法设置一下即可

这个类的常用方法如下:

set_url():用来设置robots.txt文件的链接.如果在创建RobotFileParser对象时传入了链接,就不需要使用这个方法了。

read():读取robots.txt文件并进行分析.这个方法执行一个读取和分析操作,如果不调用这个方法,接下来的判断都会为False,所以一定记得调用这个方法.这个方法不会返回任何内容,但是执行了读取操作.

parse():用来解析robots.txt文件,传入的参数是robots.txt某些行的内容,它会按照robots.txt的语法规则来分析这些内容

can_fetch():该方法传入两个参数,第一个是User_agent,第二个是要抓取的URL.返回的内容是该搜索引擎是否可以抓取这个URL.返回结果是True或False.

mtime():返回的是上次抓取和分析robots.txt的时间,这对于长时间分析和抓取的搜索爬虫是很有必要的,你可能需要定期检查来抓取最新的robots.txt

modified():它同样对长时间分析和抓取的爬虫很有帮助,将当前时间设置为上次抓取和分析robots.txt的时间

 

实例:

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
#创建RobotFileParser对象,然后通过set_url方法设置了robots.txt的链接
#也可以在申明时用如下方法设置: rp = RobotFileParser('http://www.jianshu.com/robots.txt')
rp.set_url('http://www.jianshu.com/robots.txt')
rp.read()
print(rp.can_fetch('*','http://www.jianshu.com/p/b67554025d7d'))
print(rp.can_fetch('*',"http://www.jianshu,com/search?q=python&page=1&type=collections"))
#利用can_fetch()方法判断网页是否可以被抓取

运行结果:

 

同样可以使用parse()方法执行读取和分析

实例:

from urllib.robotparser import RobotFileParser
from urllib.request import urlopen

rp = RobotFileParser()
rp.parse(urlopen('http://www.jianshu.com/robots.txt').read().decode('utf-8').split('\n'))
print(rp.can_fetch('*', 'http://www.jianshu.com/p/b67554025d7d'))
print(rp.can_fetch('*', "http://www.jianshu.com/search?q=python&page=1&type=collections"))

运行结果:

 

3. 爬虫名称

大家可能会疑惑,爬虫名是哪儿来的?为什么就叫这个名?其实它是有固定名字的了,比如百度的就叫做 BaiduSpider,下面的表格列出了一些常见的搜索爬虫的名称及对应的网站:

爬虫名称名称网站
BaiduSpider百度www.baidu.com
Googlebot谷歌www.google.com
360Spider360搜索www.so.com
YodaoBot有道www.youdao.com
ia_archiverAlexawww.alexa.cn
Scooteraltavistawww.altavista.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值