一爬虫基本库
Python提供了一个全功能的类库,以帮助完成网络请求。 最基本的HTTP库包括urllib、httplib2、requests和treq。
urllib库只需要关心到请求的链接是什么、要传递的参数是什么以及可选的请求标头设置,而不需要深入了解它是如何传输和通信的。 有了它,你可以用两行代码完成一个请求和响应的处理过程,得到网页的内容。
二urllib介绍
在Python 2中,为了实现请求的发送,有urllib和urllib2两个库。 另一方面,在Python 3中,名为urllib2的库已经不存在,而是统一为urllib,其官方文档链接为https://docs.python.org/3/library/ur lib.html
urllib库: Python内置的HTTP请求库。 也就是说,无需额外安装即可使用。
它包含以下四个模块:
request :这是最基本的HTTP请求模块,可用于模拟请求的发送。 您可以通过向库方法传递URL和其他参数来模拟此过程,就像在浏览器中输入网址并返回一样。 错误:异常处理模块。 如果发生请求错误,可以捕获这些异常,然后重试或执行其他操作,以防止程序意外退出。 parse :一个工具模块,提供许多URL处理方法,如拆分、分析和合并。 robotparser :一个主要用于标识站点的robots.txt文件,用于确定哪些站点可以爬,哪些站点不能爬。 实际上很少使用。三urllib库的urlopen介绍
1urlopen () )
1.1一心一意
urllib.request模块提供了一种创建最基本的HTTP请求的方法,用于模拟浏览器的请求启动过程。 它还处理许可证验证、重定向和浏览器Cookies等内容。
1.2代码
import urllib.request response=urllib.request.urlopen (' https://www.python.org ' ) print(response.read ).decood
2结果类型分析
2.1一心一意
urlopen返回HTTPResposne类型的对象。
这主要包括读取()、读取输入()、获取头()、名称()、获取头()、文件() )等方法,以及msg、版本、状态、读取、删除
得到此对象后,可以将其赋值给response变量,然后调用这些方法和属性以获得返回结果的一组信息。
例如,200指示请求成功,404指示未找到网页,等等,read ) )方法调用返回的网页内容,而调用status属性则返回结果的状态代码
2.2代码
import urllib.request response=urllib.request.urlopen (' https://www.python.org ' ) print(type ) (response ) ) 2.
e :web spidervenvscriptspython.exee :/web spider/3 _1_1. py
class 'http.client.HTTPResponse '
3HTTPResposne的属性和方法。
3.1代码
import urllib.request response=urllib.request.urlopen (https://www.python.org ) #前两个输出分别输出响应的状态代码和响应的标题信息,并最后一个输出是通过调用getheader输出的print(response.status ) print(response.getheaders ) ) print(response.getheaders ) response.get header (' ser
e :web spidervenvscriptspython.exee :/web spider/3 _1_1. py
200
[ ('服务器'、' nginx、' Content-Type '、' text/html; charset=utf-8 ()、(X-Frame-Options )、() SAMEORIGIN )、(x-xss-protection )、) 1; 模式=block ' () X-Clacks-Overhead ()、GNU Terry Pratchett ()、Via ()、1.1 varnish ()、Content-Length (内容长度) ) )。
es', 'bytes'), ('Date', 'Sun, 06 Jan 2019 07:07:47 GMT'), ('Via', '1.1 varnish'), ('Age', '2563'), ('Connection', 'close'), ('X-Served-By', 'cache-iad2151-IAD, cache-hnd18733-HND'), ('X-Cache', 'HIT, HIT'), ('X-Cache-Hits', '1, 1970'), ('X-Timer', 'S1546758468.685275,VS0,VE0'), ('Vary', 'Cookie'), ('Strict-Transport-Security', 'max-age=63072000; includeSubDomains')]nginx
4 urlopen函数data参数分析
4.1 函数原型
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)4.2 data参数
data参数是可选的。如果要添加该参数,并且如果它是字节流编码格式的内容,即bytes类型,则需要通过bytes()方法转化。另外,如果传递了这个参数,则它的请求方式就不再是GET方式,而是POST方式。
4.3 代码
import urllib.parseimport urllib.request# 这里我们传递了一个参数word,值是hello。它需要被转码成bytes(字节流)类型。# 其中转字节流采用了bytes()方法,该方法的第一个参数需要是str(字符串)类型,# 需要用urllib.parse模块里的urlencode()方法来将参数字典转化为字符串;# 第二个参数指定编码格式,这里指定为utf8data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')# 这里请求的站点是httpbin.org,它可以提供HTTP请求测试。# 本次我们请求的URL为http://httpbin.org/post,这个链接可以用来测试POST请求,# 它可以输出请求的一些信息,其中包含我们传递的data参数。response = urllib.request.urlopen('http://httpbin.org/post', data=data)print(response.read())4.4 结果
{ "args": {}, "data": "", "files": {}, "form": { "word": "hello" }, "headers": { "Accept-Encoding": "identity", "Content-Length": "10", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.5" }, "json": null, "origin": "123.124.23.253", "url": "http://httpbin.org/post"}4.5 说明
我们传递的参数出现在了form字段中,这表明是模拟了表单提交的方式,以POST方式传输数据。
5 urlopen函数timeout参数分析
5.1 点睛
timeout参数用于设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间,还没有得到响应,就会抛出异常。如果不指定该参数,就会使用全局默认时间。它支持HTTP、HTTPS、FTP请求。
5.2 实例
import urllib.request# 这里我们设置超时时间是0.1秒response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)print(response.read())5.3 结果
During handling of the above exception, another exception occurred:
Traceback (most recent call last): File "/var/py/python/urllibtest.py", line 4, in <module> response = urllib.request.urlopen('http://httpbin.org/get', timeout=1)
...
urllib.error.URLError: <urlopen error timed out>
5.4 结果说明
这里我们设置超时时间是0.1秒。程序0.1秒过后,服务器依然没有响应,于是抛出了URLError异常。该异常属于urllib.error模块,错误原因是超时。
5.5 捕获异常实战
import socketimport urllib.requestimport urllib.error# 这里我们请求了http://httpbin.org/get测试链接,# 设置超时时间是0.1秒,然后捕获了URLError异常,# 接着判断异常是socket.timeout类型(意思就是超时异常),# 从而得出它确实是因为超时而报错,打印输出了TIME OUTtry: response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)except urllib.error.URLError as e: if isinstance(e.reason, socket.timeout): print('TIME OUT')5.6 结果
E:WebSpidervenvScriptspython.exe E:/WebSpider/3_1_1.py
TIME OUT
6 其他参数
除了data参数和timeout参数外,还有context参数,它必须是ssl.SSLContext类型,用来指定SSL设置。
此外,cafile和capath这两个参数分别指定CA证书和它的路径,这个在请求HTTPS链接时会有用。
cadefault参数现在已经弃用了,其默认值为False。
urlopen()可以完成简单的请求和网页抓取。
若需更加详细的信息,可以参见官方文档:https://docs.python.org/3/library/urllib.request.html。