疫情爆发的第20天,在家办公,比较闲。
曾经作为一名爬虫工程师,已经一年多没写过爬虫了,这几天翻了翻资料和崔老师的《网络爬虫开发》,对爬虫做一次复习,顺便写下这篇学习笔记,慢慢更新,欢迎大家交流学习~~
这篇写的是爬虫基础库urllib的一下基础知识。他包含下面四个主类。
===========================================================================
1.request:它是最基本的 HTTP 请求模块,可以用来模拟发送请求。 就像在浏览器里输入网挝 然后回车一样,只需要给库方法传入 URL 以及额外的参数,就可以模拟实现这个过程了。
2.error: 异常处理模块,如果出现请求错误, 我们可以捕获这些异常,然后进行重试或其他操 作以保证程序不会意外终止。
3.parse: 一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、 合并等。
4.robotparser:主要是用来识别网站的robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬,它其实用得比较少。
===========================================================================
接下来开始介绍request
1.1.1 发送请求 urlopen()
import urllib.request
response = urllib.request.urlopen('https://python.org')
print(response.read().decode('utf-8'))
他用于网页源码的抓取,打印结果为‘https://python.org'网页源码,这里太多了就不做展示了。
当我们打印response 的类型(print(type(response)))时。得到如下结果
<class 'http.client.HTTPResponse'>
所以,它是一个 HTTPResposne 类型的对象,主要包含 read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及 msg、version、status、 reason 、 debuglevel、 closed 等属性。
print(response.status)
print(response.getheaders()) # 相应头信息
print(response.getheader('Server'))
可自行查看运行结果,以上三个分别是请求状态,请求头和服务器。
参数介绍
1.1.1.1 data参数
data 参数是可选的。 如果要添加该参数,并且如果它是字节流编码格式的内容,即 bytes 类型, 则需要通过 bytes()方法转化。 另外,如果传递了这个参数,则它的请求方式就不再是 GET方式,而 是 POST 方式。
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding = 'utf8')
response = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(response.read())
b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "word": "hello"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n "Content-Length": "10", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.6"\n }, \n "json": null, \n "origin": "112.49.156.179, 112.49.156.179", \n "url": "https://httpbin.org/post"\n}\n'
结果如上。
这里我们传递了一个参数word,值是 hello。它需要被转码成bytes(字节流)类型。 其中转字节流采用了bytes()方法,该方法的第一个参数需要是 str (字符串)类型,需要用urllib.parse模 块里的urlencode()方法来将参数字典转化为字符串;第二个参数指定编码格式,这里指定为 utf8。
1.1.1.2 timeout参数
timeout参数用于设置超市时间,单位为秒,意思是如果请求超出了设置的这个时间,还没有得到响应就会抛出异常。如果不指定该参数,就会使用全局默认时间。
import urllib.request
response = urllib.request.urlopen('http://httpbin.org/get',timeout=1)
print(response.read())
b'{\n "args": {}, \n "headers": {\n "Accept-Encoding": "identity", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.6"\n }, \n "origin": "112.49.156.179, 112.49.156.179", \n "url": "https://httpbin.org/get"\n}\n'
这里我们设置超时时间是 l 秒。 程序 l 秒过后,服务器依然没有响应,于是抛出了 URLError 异常。 民异常属于 urllib. error 模块,错误原因是超时。 因此,可以通过设置这个超时时间来控制一个网页如果长时间未响应,就跳过它的抓取。
import socket
import urllib.request
import urllib.error
try:
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' )
这里我们请求了测试链接,设置超时时间是0.1秒,然后捕获了URLError异常,接着判断异常是socket.timeout 类型(意思就是超时异常),从而得出它确实是因为超时而报错,打印输出了TIME OUT。 0.1秒内基本不可能得到服务器响应,因此输出了 TIME OUT 的提示。通过设置timeout这个参数来实现超时处理,有时还是很有用的。
1.1.3 其他参数
除了 data 参数和 timeout 参数外,还有 context 参数,它必须是 ssl.SSLContext 类型,用来指定 SSL设置。 此外, cafile 和 capath 这两个参数分别指定 CA证书和它的路径,这个在请求 HTTPS 链接时会 有用。 cadefault 参数现在已经弃用了,其默认值为 False。 前面讲解了 urlopen()方法的用法,通过这个最基本的方法,我们可以完成简单的请求和网页抓 取。 若需更加详细的信息,可以参见官方文档 : https://docs.python.org/library/urllib.requwat.html。
这里请求的站点是 httpbin.org,它可以提供 HTTP请求测试。本次我们请求的URL为 http://httpbin.org/post, 这个链接可以用来测试 POST请求,它可以输出请求的一些信息,其中包含我们传递的 data 参数。
==============================================================
参考资料:《python3 网络爬虫开发实践》-崔庆才
来源:CSDN
作者:Watson_Ashin
链接:https://blog.csdn.net/Watson_Ashin/article/details/104260999