二次封装 requests,构造通用的请求函数

本章将告诉你该如何去对 request 模块进行二次封装,暂时并不会告诉你 HTTP 协议及原理、URL 等相关。当然你会使用然后在来阅读此文章一定会另有所获。我已经迫不及待要告诉你这个小秘密,以及想与你交流了。没时间解释了,快来一起和我一起探讨相关的内容吧

官方文档对 requests 的定义为:Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。

使用 Python 写做爬虫的小伙伴一定使用过 requests 这个模块,初入爬虫的小伙伴也一定写过 N 个重复的 requests,这是你的疑问。当然也一直伴随着我,最近在想对 requests 如何进行封装一下,让他支持支持通用的函数。若需要使用,直接调用即可。

那么问题来了,如果要写个供自己使用通用的请求函数将会有几个问题

  • requests 的请求方式 (GET\POST\INPUT 等等)
  • 智能识别网站的编码,避免出现乱码
  • 支持文本、二进制 (图片、视频等为二进制内容)
  • 以及还需要傻瓜一点,那就是网站的 Ua (Ua:User-Agent,基本上网站都会验证接受到请求的 Ua。来初步判断是爬虫还是用户)

那么咱们就针对以上问题开干吧
# from powerspider.Download import downloader

# if name == ‘main’:

#     # print(downloader(“https://www.baidu.com/”, “GET”))

#     downloader(“https://www.baidu.com/”, “GET”)

import requests

import cchardet

# print(“response.status_code:”, response.status_code)

# print(“response.headers:”, response.headers)

# print(“response.request.headers:”, response.request.headers)

# print(“response.content:”, response.content)

# print(“response.text”, response.text)

urls = ‘http://httpbin.org/get

from powerspider.tools.Ua import ua

def downloader(url, method=None, header=None, binary=False):

    _headers = header if header else {‘User-Agent’: ua()}

    _method = “GET” if not method else method

    response = requests.request(url, method=_method, headers=_headers)

    encoding = cchardet.detect(response.content)[‘encoding’]

    return response.content if binary else response.content.decode(encoding)

print(downloader(urls, method=“POST”))