一、总述
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 |
360Spider | 360搜索 | www.so.com |
YodaoBot | 有道 | www.youdao.com |
ia_archiver | Alexa | www.alexa.cn |
Scooter | altavista | www.altavista.com |