最近需要一些热点舆情的数据集,于是学习用爬虫简单的爬点数据…
研究了下《Python3WebSpider》
使用urllib.request发送请求
urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟
浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。
urllib.request.urlopen()返回一个HTTPResposne 类型的对象,它主要包含的方法
有 read() 、 readinto() 、 getheader(name) 、 getheaders() 、 fileno
() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。
e.g.
urllib.request.urlopen()详解
简单的调用urlopen(url),可以完成最基本的简单网页的 GET 请求抓取。
复杂点的urlopen()API:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
data参数是可选的,如果要添加data,它要是字节流编码格式的内容,即bytes类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个data参数,它的请求方法就不再是GET方式请求,而是POST。
e.g.
timeout 参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这
个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它
支持 HTTP 、 HTTPS 、 FTP 请求。
其他参数
还有 context 参数,它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。
cafile 和 capath 两个参数是指定CA证书和它的路径,这个在请求 HTTPS 链
接时会有用。
cadefault 参数现在已经弃用了,默认为 False 。
More info: 官方文档
urllib.request.Request的使用
Request()API:
class urllib.request.Request(url, data=None, headers={}, origin_
req_host=None, unverifiable=False, method=None)
url是请求链接,这个是必传参数,其他的都是可选参数。
data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先
用 urllib.parse.urlencode() 编码。
headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,
也可以通过调用 Request 对象的 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 等等。
e.g.
urllib.request高级特性
Handler
简而言之你可以把它理解为各种处理器,有专门处理登录验证的,有处理 Cookies 的,有处理代理设置的,利用它们我们几乎可以做到任何 HTTP 请求中所有的事情。
首先介绍下 urllib.request.BaseHandler ,它是所有其他 Handler 的父类,
它提供了最基本的 Handler 的方法,例如 default_open() 、 protocol_request() 等。
接下来就有各种 Handler 类继承这个 BaseHandler ,列举如下:
HTTPDefaultErrorHandler 用于处理HTTP响应错误,错误都会抛出 HTTPError 类型的异常。
HTTPRedirectHandler 用于处理重定向。
HTTPCookieProcessor 用于处理 Cookie 。
ProxyHandler 用于设置代理,默认代理为空。
HTTPPasswordMgr 用于管理密码,它维护了用户名密码的表。
HTTPBasicAuthHandler 用于管理认证,如果一个链接打开时需要认证,那
么可以用它来解决认证问题。
*另外还有其他的 Handler ,可以参考官方文档。
认证
|
|
代理
|
|
Cookie设置
怎样将网站的Cookie获取下来
将网站Cookie设置到headers里,可以实现登陆。
requests的基本使用
|
|
GET请求
HTTP中最常见的请求之一就是 GET 请求,我们首先来详细了解下利用requests来构建GET请求的方法以及相关属性方法操作。首先让我们来构建一个最简单的 GET 请求,
请求httpbin.org/get它会判断如果你是GET请求的话,会返回响应的请求信息。
运行结果如下:
可以发现我们成功发起了get请求,请求的链接和头信息都有相应的返回。
如果现在我想添加两个参数,名字name是germey,年龄age是22。那么可以利用params参数
e.g.
运行结果如下:
通过返回信息我们可以判断,请求的链接自动被构造成了http://httpbin.org/get?age=22&name=germey.
另外,网页的返回类型实际上是str类型,但是它很特殊,是Json的格式,所
以如果我们想直接把返回结果解析,得到一个字典dict格式的话,可以直接调
用json()方法,就可以将返回结果是Json格式的字符串转化为字典dict。但是注意
如果返回结果不是Json格式,便会出现解析错误,抛出抛json.decoder.JSONDecodeError 的异常。
抓取二进制数据
我们都知道,图片、音频、视频这些文件都是本质上由二进制码组成的,由于有特
定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以想
要抓取他们,那就需要拿到他们的二进制码。
e.g.GitHub的站点图标
运行代码可以发现r.text的代码出现乱码,而r.content的结果前面带有一个b,代表这是bytes类型的数据。由于图片是二进制数据,所以前者在打印时转化为 str 类型,也就是图片直接转化为字符串,理所当然会出现乱码。
两个属性有什么区别?前者返回的是字符串类型,如果返回结果是文本文件,那么
用这种方式直接获取其内容即可。如果返回结果是图片、音频、视频等文
件, requests 会为我们自动解码成 bytes 类型,即获取字节流数据。
运行结束之后,可以发现在文件夹中出现了名为favicon.ico的图标,同样的,音频、视频文件也可以用这种方法获取。
状态码
requests 还提供了一个内置的状态码查询对象 requests.codes 。
比如你可以通过 if r.status_code ==requests.codes.ok 来判断请求是否成功.
返回码和相应的查询条件:
未完待续…