[图片] 介绍 aiohttp 是 python 的一个异步网络模块,包含客户端和服务端模块。 相比 requests 模块,除了是异步写法外,大同小异,其速度比 requests 模块快。 python 的多线程有全局解释器锁(GIL),使用多线程实际上同一时刻仅有一个线程在执行,使用协程的相对比较快,可以再配合多进 ..

python aiohttp 客户端使用方法 加快爬虫速度

介绍

aiohttp 是 python 的一个异步网络模块,包含客户端和服务端模块。
相比 requests 模块,除了是异步写法外,大同小异,其速度比 requests 模块快。
python 的多线程有全局解释器锁(GIL),使用多线程实际上同一时刻仅有一个线程在执行,使用协程的相对比较快,可以再配合多进程使用。

基本用法

安装

使用 pip 命令安装即可。pip install aiohttp

发起请求

aiohttp模块需要配合 python 自带的asyncio模块使用,以下代码为发起客户端发起一个 get 请求。

# _*_ coding:utf8_*_
import asyncio
import aiohttp


async def fetch(session, url):
    """
    获取网页html代码
    :param session:
    :param url:
    :return:
    """
    async with session.get(url) as response:
        return await response.text()


async def main():
    """
    :return:
    """
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, "http://blog.fenlanli.com")
        print(html)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

其他 http 请求方法均有提供方便使用的函数:

    url = ""
    session.put(url, data='data')
    session.delete(url)
    session.head(url)
    session.patch(url, data='data')
    session.post(url, data='data')

还提供了一个 request 函数,可以动态的选择请求方式。

session.request('get', url, data={'key': 'val'})

参数传递

get 方法

跟 requests 模块中的 GET 请求传参数是一样的。

    params = {'key': 'value'}
    async with session.get(url, params=params) as response:
        return await response.text()

post 方法

提交文本数据:

async def post_data(session, url):
    """
    提交数据
    :param session:
    :param url:
    :return:
    """
    data = 'data'
    async with session.post(url, data=data) as response:
        return await response.text()

提交 JSON 数据:

async def fetch(session, url):
    """
    提交数据
    :param session:
    :param url:
    :return:
    """
    data = {'key': 'val'}
    async with session.post(url, json=data) as response:
        return await response.text()

获取返回值

一般常用的是获取文本内容或者 JSON 数据。
获取文本数据:

async with session.post(url, json=data) as response:
       return await response.json()

获取 JSON 数据:

async with session.post(url, json=data) as response:
       return await response.json()

自定义请求头

设置 session 的 cookies 参数即可:

async def fetch(session, url):
    """
    提交数据
    :param session:
    :param url:
    :return:
    """
    headers = {
        'User-Agent': 'User-Agent'
    }
    async with session.get(url, headers=headers) as response:
        return await response.text()

设置 cookies

设置 session 的参数 cookies 即可:

async def fetch(session, url):
    """
    提交数据
    :param session:
    :param url:
    :return:
    """
    cookies = {'cookies_are': 'working'}
    async with session.get(url, cookies=cookies) as response:
        return await response.text()

使用代理

设置 session 的参数 proxy 即可:

async def fetch(session, url):
    """
    提交数据
    :param session:
    :param url:
    :return:
    """
    proxy = "http://my.proxy.cn"
    async with aiohttp.ClientSession() as session:
        async with session.get(url, proxy=proxy) as resp:
            print(resp.status)

至此,对于普通网站的爬虫基本够用了。

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    336 引用 • 484 回帖 • 664 关注
  • 编程基础
    5 引用
回帖   
请输入回帖内容...