一、urlopen()
urlopen()函数的API:
urllib.request.urlopen(url, data = None, [timeout,]*, cafile = None, capath = None, cadefault = False, context = None)
参数介绍:
data参数是可选的。如果要添加该参数,需要使用bytes()方法将参数转化为字节流编码格式的内容,即bytes类型。如果传递了这个参数,那么它的请求方式就不再是get方式,而是post方式。
timeout参数设置超时时间,单位是秒,如果请求超出了设置的这个时间,还没有得到响应,就会抛出异常。如果不指定该参数,就会使用全局默认时间。支持HTTP\HTTPS\FTP请求。
与try except结合,实现一个网页长时间未响应,就跳过对它的抓取。
1、urllib.request模块
提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起过程。
如下代码完成了对python官网的抓取,输出了网页的源代码。
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(response.read().decode('utf-8'))
输出结果:
2、用type()查看返回的结果
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(type(response))
返回的结果是一个HTTPResponse类型的对象,主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等属性
3、status属性、getheaders()方法、getheader(name)方法
import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(response.status)
print(response.getheaders())
print("&&&&&&”)
print(response.getheader('Server'))
输出结果
二、Request类
class urllib.request.Request(url, data = None, headers = {}, origin_req_host = None, unverifiable = False, method = None)
参数url是必传参数,其他都是可选参数。
1、Handler
urllib.request模块里的BaseHandler类是所有其他Handler的父类。以下是继承了BaseHandler类的子类。
- HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出HTTPError类型的异常。
- HTTPRedirectHandler:用于处理重定向。
- HTTPCookieProcessor:用于处理Cookies
- ProxyHandler:用于设置代理,默认代理为空。
- HTTPPasswordMgr:用于管理密码。它维护了用户名和密码的表。
- HTTPBasicAuthHandler:用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。
2、OpenerDirector
简称Opener。它可以使用open()方法,返回的类型和urlopen()一样。
它和Handler的关系是:利用Handler来构建Opener
三、链接解析
标准的链接格式
scheme://netloc/path;params?query#fragment
scheme:协议;netloc是域名;path是访问路径;params是参数;query是查询条件;fragment是锚点,用于直接定位页面内部的下拉位置。
四、Robot协议
也被称为爬虫协议、机器人协议。全名叫网络爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。
通常是一个robots.txt文件,放在网站的根目录下。
样例
User-agent:*
Disallow:/
Allow:/public/
当搜索爬虫访问一个站点时,它首先会检查这个站点根目录下是否存在robots.txt文件,如果存在,搜索爬虫会根据其中定义的爬取范围来爬取,如果不存在,搜索爬虫便会访问所有可直接访问的页面。
禁止所有爬虫访问任何目录的代码
User-agent:*
Disallow:/
允许所有爬虫访问任何目录的代码
User-agent:*
Disallow: