用户池使用说明

用户池分为三种,使用场景如下

  1. GuestUserPool:游客用户池,用于从不需要登录的页面获取cookie
  2. NormalUserPool:普通用户池,管理大量账号的信息,从需要登录的页面获取cookie
  3. GoldUserPool:昂贵的用户池,用于账号单价较高,需要限制使用频率、使用时间的场景

GuestUserPool使用方式

环境:redis

导包

  1. from typing import Optional
  2. from feapder.network.user_pool import GuestUser
  3. from feapder.network.user_pool import GuestUserPool

默认的用户池

使用webdriver访问page_url生产cookie

  1. user_pool = GuestUserPool(
  2. "test:user_pool", page_url="https://www.baidu.com"
  3. )

自定义登录方法

  1. class CustomGuestUserPool(GuestUserPool):
  2. def login(self) -> Optional[GuestUser]:
  3. # 此处为假数据,正常需通过网站获取cookie
  4. user = GuestUser(
  5. user_agent="xxx",
  6. proxies="yyy",
  7. cookies={"some_key": "some_value{}".format(time.time())},
  8. )
  9. return user
  10. user_pool = CustomGuestUserPool(
  11. "test:user_pool", min_users=10, keep_alive=True
  12. )

获取用户

无用户时会先登录生产用户

  1. user = user_pool.get_user(block=True)
  2. print("取到user:", user)
  3. print("cookie:", user.cookies)
  4. print("user_agent:", user.user_agent)
  5. print("proxies:", user.proxies)

删除用户

  1. user_pool.del_user(user.user_id)

维护一定数量的用户

run方法需单独起一个进程调用,此进程会常驻,当用户数不足时会及时补充

  1. user_pool.run()

NormalUserPool使用方式

环境:redis、mysql

导包

  1. from feapder.network.user_pool import NormalUser
  2. from feapder.network.user_pool import NormalUserPool

自定义登录的方法

  1. class CustomNormalUserPool(NormalUserPool):
  2. def login(self, user: NormalUser) -> NormalUser:
  3. # 此处为假数据,正常需通过登录网站获取cookie
  4. username = user.username
  5. password = user.password
  6. # 登录获取cookie
  7. cookie = "xxx"
  8. user.cookies = cookie
  9. return user
  10. user_pool = CustomNormalUserPool(
  11. "test:user_pool",
  12. table_userbase="test_userbase",
  13. login_retry_times=0,
  14. keep_alive=True,
  15. )
  • table_userbase 为mysql里存储用户信息的表,此表会自动创建,需手动录入用户账密

    例如:

    用户池使用说明 - 图1

获取用户

无用户时会先登录生产用户

  1. user = user_pool.get_user()
  2. print("取到user:", user)
  3. print("cookie:", user.cookies)
  4. print("user_agent:", user.user_agent)
  5. print("proxies:", user.proxies)

删除用户

  1. user_pool.del_user(user.user_id)

维护一定数量的用户

run方法需单独起一个进程调用,此进程会常驻,当用户数不足时会及时补充

  1. user_pool.run()

标记账号被封

以后不再使用

  1. user_pool.tag_user_locked(user.user_id)

GoldUserPool使用方式

环境:redis

导包

  1. from feapder.network.user_pool import GoldUser
  2. from feapder.network.user_pool import GoldUserPool

定义用户信息

  1. users = [
  2. GoldUser(
  3. username="zhangsan",
  4. password="1234",
  5. max_use_times=10,
  6. use_interval=5,
  7. ),
  8. GoldUser(
  9. username="lisi",
  10. password="1234",
  11. max_use_times=10,
  12. use_interval=5,
  13. login_interval=50,
  14. ),
  15. ]

自定义登录的方法

  1. class CustomGoldUserPool(GoldUserPool):
  2. def login(self, user: GoldUser) -> GoldUser:
  3. # 此处为假数据,正常需通过登录网站获取cookie
  4. username = user.username
  5. password = user.password
  6. # 登录获取cookie
  7. cookie = "zzzz"
  8. user.cookies = cookie
  9. return user
  10. user_pool = CustomGoldUserPool(
  11. "test:user_pool",
  12. users=users,
  13. keep_alive=True,
  14. )

获取用户

无用户时会先登录生产用户

  1. user = user_pool.get_user()
  2. print("取到user:", user)
  3. print("cookie:", user.cookies)
  4. print("user_agent:", user.user_agent)
  5. print("proxies:", user.proxies)

获取指定用户

无用户时会先登录生产用户

  1. user = user_pool.get_user(username="用户名")
  2. print("取到user:", user)
  3. print("cookie:", user.cookies)
  4. print("user_agent:", user.user_agent)
  5. print("proxies:", user.proxies)

删除用户

  1. user_pool.del_user(user.user_id)

维护一定数量的用户

run方法需单独起一个进程调用,此进程会常驻,当用户数不足时会及时补充

  1. user_pool.run()

用户延时使用

  1. user_pool.delay_use(user.user_id, delay_seconds)

用户独占使用

某个用户被指定的爬虫独占使用,独占时间内其他爬虫不可使用

  1. user = user_pool.get_user(
  2. username="用户名",
  3. used_for_spider_name="爬虫名"
  4. )