feapder/docs/source_code/UserPool.md

225 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 用户池使用说明
用户池分为三种,使用场景如下
1. `GuestUserPool`游客用户池用于从不需要登录的页面获取cookie
2. `NormalUserPool`普通用户池管理大量账号的信息从需要登录的页面获取cookie
3. `GoldUserPool`:昂贵的用户池,用于账号单价较高,需要限制使用频率、使用时间的场景
## GuestUserPool使用方式
> 环境redis
### 导包
```
from typing import Optional
from feapder.network.user_pool import GuestUser
from feapder.network.user_pool import GuestUserPool
```
### 默认的用户池
使用webdriver访问page_url生产cookie
```
user_pool = GuestUserPool(
"test:user_pool", page_url="https://www.baidu.com"
)
```
### 自定义登录方法
```
class CustomGuestUserPool(GuestUserPool):
def login(self) -> Optional[GuestUser]:
# 此处为假数据正常需通过网站获取cookie
user = GuestUser(
user_agent="xxx",
proxies="yyy",
cookies={"some_key": "some_value{}".format(time.time())},
)
return user
user_pool = CustomGuestUserPool(
"test:user_pool", min_users=10, keep_alive=True
)
```
### 获取用户
无用户时会先登录生产用户
```
user = user_pool.get_user(block=True)
print("取到user", user)
print("cookie", user.cookies)
print("user_agent", user.user_agent)
print("proxies", user.proxies)
```
### 删除用户
```
user_pool.del_user(user.user_id)
```
### 维护一定数量的用户
run方法需单独起一个进程调用此进程会常驻当用户数不足时会及时补充
```
user_pool.run()
```
## NormalUserPool使用方式
> 环境redis、mysql
### 导包
```
from feapder.network.user_pool import NormalUser
from feapder.network.user_pool import NormalUserPool
```
### 自定义登录的方法
```
class CustomNormalUserPool(NormalUserPool):
def login(self, user: NormalUser) -> NormalUser:
# 此处为假数据正常需通过登录网站获取cookie
username = user.username
password = user.password
# 登录获取cookie
cookie = "xxx"
user.cookies = cookie
return user
user_pool = CustomNormalUserPool(
"test:user_pool",
table_userbase="test_userbase",
login_retry_times=0,
keep_alive=True,
)
```
- table_userbase 为mysql里存储用户信息的表此表会自动创建需手动录入用户账密
例如:
![](http://markdown-media.oss-cn-beijing.aliyuncs.com/2021/12/22/16401504359853.jpg)
### 获取用户
无用户时会先登录生产用户
```
user = user_pool.get_user()
print("取到user", user)
print("cookie", user.cookies)
print("user_agent", user.user_agent)
print("proxies", user.proxies)
```
### 删除用户
```
user_pool.del_user(user.user_id)
```
### 维护一定数量的用户
run方法需单独起一个进程调用此进程会常驻当用户数不足时会及时补充
```
user_pool.run()
```
### 标记账号被封
以后不再使用
```
user_pool.tag_user_locked(user.user_id)
```
## GoldUserPool使用方式
> 环境redis
### 导包
```
from feapder.network.user_pool import GoldUser
from feapder.network.user_pool import GoldUserPool
```
### 定义用户信息
```
users = [
GoldUser(
username="zhangsan",
password="1234",
max_use_times=10,
use_interval=5,
),
GoldUser(
username="lisi",
password="1234",
max_use_times=10,
use_interval=5,
login_interval=50,
),
]
```
### 自定义登录的方法
```
class CustomGoldUserPool(GoldUserPool):
def login(self, user: GoldUser) -> GoldUser:
# 此处为假数据正常需通过登录网站获取cookie
username = user.username
password = user.password
# 登录获取cookie
cookie = "zzzz"
user.cookies = cookie
return user
user_pool = CustomGoldUserPool(
"test:user_pool",
users=users,
keep_alive=True,
)
```
### 获取用户
无用户时会先登录生产用户
```
user = user_pool.get_user()
print("取到user", user)
print("cookie", user.cookies)
print("user_agent", user.user_agent)
print("proxies", user.proxies)
```
### 获取指定用户
无用户时会先登录生产用户
```
user = user_pool.get_user(username="用户名")
print("取到user", user)
print("cookie", user.cookies)
print("user_agent", user.user_agent)
print("proxies", user.proxies)
```
### 删除用户
```
user_pool.del_user(user.user_id)
```
### 维护一定数量的用户
run方法需单独起一个进程调用此进程会常驻当用户数不足时会及时补充
```
user_pool.run()
```
### 用户延时使用
```
user_pool.delay_use(user.user_id, delay_seconds)
```
### 用户独占使用
某个用户被指定的爬虫独占使用,独占时间内其他爬虫不可使用
```
user = user_pool.get_user(
username="用户名",
used_for_spider_name="爬虫名"
)
```