首页 > 其他分享 >一个优雅的异步爬虫基类

一个优雅的异步爬虫基类

时间:2022-10-14 16:47:18浏览次数:45  
标签:异步 url self 爬虫 start 基类 async def

这是我编写的一个异爬虫基类,有以下几点优点

使用接口继承的思想

继承Crawler类后,必须实现parsehandle方法,否则程序报错,虽然Python没有接口的特性,但是使用raise方法抛出了未实现接口的异常。

类型注释
每一个方法的形式参数都加入注释,使得IDE能够识别类型。

开发哲学

  1. 简单优雅于复杂
  2. 标准库优雅于三方库。
  3. 标准函数优雅于自己写函数。
  4. 专业的函数处理专业的事情。
  5. 代码规范很重要。
  6. 代码注释很重要
from typing import List
from urllib.parse import urlparse
import asyncio
import aiohttp


def save(content: any, filename: str, mode='a', encoding='utf-8', end='\n'):
    with open(filename, mode=mode, encoding=encoding) as file:
        if type(content) == str:
            file.write(content + end)
        else:
            file.write(content)
    print(f'The file is saved "{filename}" successfully!')


class Crawler(object):
    """
    爬虫基类,所有爬虫都应该继承此类
    """

    def __init__(self, start_url: List[str]) -> None:
        """
        初始化
        :param start_url: 爬虫起始列表
        :param start_url: 爬虫起始列表
        :param domain: 域名
        """
        self.items = None
        self.name = 'myspider'
        self.start_url = start_url
        self.domain = '{uri.scheme}://{uri.netloc}'.format(uri=urlparse(self.start_url[0]))

    async def parse(self, response):
        """
        从response中解析出所有目录的URL链接
        """
        raise NotImplementedError

    async def request(self, url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as resp:
                response = await self.parse(await resp.text())
                url_object = urlparse(url)
                return dict(response=response, url=url)  # 有返回值

    async def run(self):
        tasks = [asyncio.ensure_future(self.request(i)) for i in self.start_url]
        await asyncio.wait(tasks)
        results = await asyncio.gather(*tasks)  # 获取返回值
        # self.items = results
        self.handle(results)
        print("任务完成...")

    def handle(self, items):
        for item in items:
            save(item.text(), "test.txt")
        raise NotImplementedError


标签:异步,url,self,爬虫,start,基类,async,def
From: https://www.cnblogs.com/huanghongzhe/p/16792037.html

相关文章

  • 利用for循环同步执行异步方法
    //定义一个异步函数constfoo1=(i)=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{console.log(I)resolve(i)},3000......
  • Python爬虫之requests模块了解
    requests模块知识点:掌握headers参数的使用掌握发送带参数的请求掌握headers中携带cookie掌握cookies参数的使用掌握cookieJar的转换方法掌握超时参数timeout的使用掌......
  • Python爬虫之mongodb介绍和安装
    Mongodb的介绍和安装学习目标了解非关系型数据库的优势了解mongodb的安装1.mongodb的介绍1.1什么是mongodbmongodb是一个功能最丰富的NoSQL非关系数据库。由C++语言......
  • Python爬虫之scrapy_splash组件的使用
    scrapy_splash组件的使用学习目标了解scrapy_splash组件的作用了解scrapy_splash组件的使用1.什么是scrapy_splash?scrapy_splash是scrapy的一个组件scrapy-splash加载js......
  • Python爬虫之http协议复习
    http协议复习知识点掌握http以及https的概念和默认端口掌握爬虫关注的请求头和响应头了解常见的响应状态码理解浏览器和爬虫爬取的区别一提起http协议,大家都会想起它是......
  • Python爬虫之数据提取概述
    数据提取概述知识点了解响应内容的分类了解xml和html的区别1.响应内容的分类在发送请求获取响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的......
  • Python爬虫之数据提取-selenium定位获取标签对象并提取数据
    selenium提取数据知识点:了解driver对象的常用属性和方法掌握driver对象定位标签元素获取标签对象的方法掌握标签对象提取文本和属性值的方法1.driver对象的常用属性和方......
  • Python爬虫之scrapy的日志信息与配置
    scrapy的日志信息与配置学习目标:了解scrapy的日志信息掌握scrapy的常用配置掌握scrapy_redis配置了解scrapy_splash配置了解scrapy_redis和scrapy_splash配合使用的配置1......
  • Python爬虫之数据提取-selenium的其它使用方法
    selenium的其它使用方法知识点:掌握selenium控制标签页的切换掌握selenium控制iframe的切换掌握利用selenium获取cookie的方法掌握手动实现页面等待掌握selenium控制浏......
  • Python爬虫之mongodb的聚合操作
    mongodb的聚合操作学习目标了解mongodb的聚合原理掌握mongdb的管道命令掌握mongdb的表达式1mongodb的聚合是什么聚合(aggregate)是基于数据处理的聚合管道,每个文档通过......