semvec/pypi-packages huggingface dataset:
ReSpider 1.0.4
ReSpider是一款基于 aiohttp 请求库的python爬虫程序
Requires Python: >=3.7
Keywords: respider

# ReSpider

## 开始一个爬虫
> 爬虫继承自 <ReSpider.Spider> 类
```
import ReSpider


class TestSpider(ReSpider.Spider):
    # 自定义配置
    __custom_setting__ = {}
    start_urls = []

    def start_requests(self):
        pass

    def parse(self, response):
        pass


if __name__ == '__main__':
    TestSpider().start()    
```

## 通过命令创建
```
respider create -p project_name  # 创建项目
respider create -s spider_name  # 创建爬虫程序, 需要符合命名规范
```

## 自定义设置
```
__custom_setting__ = {
    'TASK_LIMIT': 1,  # 设置并发数, 默认为1
    'SCHEDULER': 'ReSpider.extend.redis.scheduler.RedisScheduler',  # 设置任务队列, 默认为内存
    'DOWNLOAD_DELAY': 1,  # 下载延迟, 默认为0
    'RETRY_ENABLED': True,  # 重试, 设置为True开启重试, 默认关闭
    'SSL_FINGERPRINT': False  # ssl指纹, 默认关闭, 在创建ssl上下文时会阻塞, 开启后并发会降为1 
}
```

## 中间件设置
```
# 管道
ITEM_PIPELINES = {
    'ReSpider.pipelines.files.CSVPipeline': 4,
    'ReSpider.pipelines.redis.RedisPipeline': 5,
    'ReSpider.pipelines.files.FilesPipeline': 6,
    'ReSpider.pipelines.mongodb.MongoDBPipeline': 8
}

# 下载中间件
DOWNLOADER_MIDDLEWARES = {
    'ReSpider.middlewares.useragent.UserAgentMiddleware': 2,
    # 'ReSpider.extend.puppeteer.downloadmiddleware.PuppeteerMiddleware': 5,
    'ReSpider.middlewares.retry.RetryMiddleware': 8
}
```

## 信号 (待开发)
### 添加信号参数
- 解决任务完成时偶先程序无法正常停止的问题(浏览器渲染下浏览器无法关闭)
- 中间件和管道增加关闭标志(is_closed)
- 根据传递的信号参数对是否关闭标志进行赋值，根据标志来开关中间件或管道
 
## 保存数据
### Item
一般的数据实体
```
from ReSpider import item
data = DataItem({'name': 'ReSpider'}, **kwargs)
```
### xxListItem
数据实体列表, 可以传入一个list来构造
```
from ReSpider import item
data_list_item = DataListItem([1, 2, 3], **kwargs)
```
### 保存数据
```
# 二进制数据
io_item = item.IoItem(b'hello world', filename='hello world', filetype='bin')

# 文件类型, filetype 为文件类型
file_item = item.FileItem('hello world', filename='hello world', filetype='text')

# 表格数据
csv_item = item.CSVItem({'name': '张三', 'age': 14}, filename='hello world')

# 多行使用list
csv_list = item.CSVListItem([{'name': '张三', 'age': 14}, {'name': '李四', 'age': 19}], filename='法外狂徒')

# 使用yield来保存数据
data = item.DataItem()
yield data
```

## Log
### 日志设置
```
__custom_setting__ = {
    'LOG_PATH': None,  # log文件写入位置
    'LOG_TO_CONSOLE': True,  # 输出日志到控制台, 默认开启
    'LOG_LEVEL_CONSOLE': 'DEBUG',  # 输出日志到控制台级别, 默认DEBUG
    'LOG_TO_FILE': False,  # 输出日志到文件, 默认关闭, 设置为True开启
    'LOG_LEVEL_FILE': 'WARNING'  # 输出日志到文件级别, 默认WARNING
}
```


## JS渲染
### 无头模式下cookie问题