Python需求:啥值得买登录、签到、搜索功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python需求:啥值得买登录、签到、搜索功能相关的知识,希望对你有一定的参考价值。

参考技术A 最近想买个行车记录仪,经常在在什么值得买上搜索信息,感觉浪费的时间比较多,就想用Python写个自动搜索的功能。另外,什么值得买已经很久没有签到了,刚开始玩的时候台天天签到,乐此不疲。现在已经很久没有签到了,既然我是码农,当然得实现自动化哈。

1.实现自动登录;
2.实现自动签到;
3.实现搜索功能;

requests库应该就能实现这些功能,但是需要解析页面,我这些需求简单,没有性能要求,因此采用简单的selenium库模拟浏览器操作实现这个需求。

selenium、BeautifulSoup

关于selenium的使用在 Python爬取煎蛋妹子图 里有介绍。

遇到的坑:
1.点击登录按钮后,弹出登录框,后续无法找到用户名、密码的element。
开始以为是点击登录后,马上就去获取这个element,此时登录框还没有弹出来,因此延迟了3秒(这个问题在模拟登录百度时碰到过)。依旧不能解决。问题原因就是没有获取到当前登录框的handle,因此获取所有的window_handle,然后切换到当前的,debug发现是始终只有一个handle。
其实什么值得买的登录框是一个frame,需要采用switch_to.frame方法定位到当前frame。

搜索只处理了搜索结果的第一页,如果需要更多的数据,处理分页即可。

以上三个方法即实现了三个功能需求,但是我想要每天自动实现登录、签到功能,同时搜索‘行车记录仪’处理结果能够发送到手机。实现搜索结果发送到手机,自然想到了 itchat 这个库。另外使用 apscheduler 实现了定时任务。

下面开始列遇到的坑:
1.签到时

写的时候没注意,捕获异常写了EOFrror,导致签到过后,后续不会发送微信消息。EOFrror是意味着它发现了一个不期望的文件尾时会抛出的异常,因此这里不会捕获到。

修改成:

商城签到功能的设计与实现

需求分析         

  1、用户当天登录商城,只要签到就直接奖励一定的积分或者根据用户本周或者本月内已经连续签到的天数进行积分奖励,后台可以设置具体的奖励规则,这里假设本周内连续登录三天奖励 1 积分,五天奖励 2 积分,七天奖励 3 积分,每周一签到次数归零(归零方法不一定是每周一签到次数自动设为零,详见下文)

  2、实现形式:在个人中心放置签到按钮或者登录成功之后进行弹窗提示

  3、个人中心,用户可以看到签到日志(如果设置日志记录的话)和积分流水

  4、商城后台可以对签到送积分的规则进行设置,也可以看到签到日子和积分流水,具体规则包括:1、奖励模式 2、相应模式配置 3、日志记录 4、是否开启等,具体详见签到配置表

签到配置列表

这些配置信息可以格式化以后放在商城的某一项配置中

type

签到模式(当天签到就有奖励(1)、连续签到一定天数会有不同奖励(2))

configs

type为1时,表示每天签到奖励积分数;type为2时,表示连续签到天数以及奖励阶梯(可以作为数组元素并存)

open_log

是否记录签到日志

save_days

签到日志保存天数

is_open

是否开启签到机制

 

 

数据库设计相关

  1、商城用户表添加下面两个字段

    last_signin_time 保存用户上一次签到时间

    cont_days 保存用户连续签到天数

  2、商城配置表添加一下字段

    signin_configs 保存商城签到功能配置信息(json格式化或者序列化都可以

  3、签到日志表

表名:pre_signin

功能:用于保存签到机制规则

字段

数据类型

属性

约束条件

说明

id

int(10)

无符号、非空、自增

主键

主键id

user_id

int(10)

无符号、非空、默认0

外键、普通索引(signin_user_id)

用户id

integral_num

int(5)

无符号、非空、默认0

 

签到奖励积分

add_time

int(11)

无符号、非空、默认0

 

签到时间

设计思路分析(用户签到操作时处理

  1、当天签到就送积分的简单模式(无需多言)

  2、根据用户连续签到天数进行积分奖励的复杂模式

    连续性判断:这个简单,判断昨天有没有签到就行

    连续签到次数判断:根据连续性判断结果,再判断当天是不是周一,确定或者重置本周当前连续签到次数

    奖励积分数实现:确定了连续签到次数,就可以根据商城签到配置信息确定当天签到后该奖励的积分数量并进行日志记录和积分流水记录操作

php 示例代码(ecshop实现)

/**
* 代码中以文章开头的假设为思路,具体根据商城配置做修改
*/
function
userSignin(){ if (!$_SESSION[‘user_id‘]) { return false; } $time = getdate(); $today_zero = mktime(0, 0, 0, $time[‘mon‘], $time[‘mday‘], $time[‘year‘]); $sql = "select last_signin_time from ".$GLOBALS[‘ecs‘]->table(‘users‘)." where user_id = ‘$_SESSION[user_id]‘"; $last_signin_time = $GLOBALS[‘db‘]->getOne($sql); if($today_zero < $last_signin_time && $last_signin_time < ($today_zero + 24*60*60)){ // 今日已经签到过了
    array(‘error‘=>true, ‘msg‘=>‘你今日已经签过到咯‘); }else{ // 签到处理 if($time[‘wday‘] == 1){ // 如果是周一,签到从零算起 $sql = "update ".$GLOBALS[‘ecs‘]->table(‘users‘)." set cont_days = 1, last_signin_time = ".time()." where user_id = ‘$_SESSION[user_id]‘"; $GLOBALS[‘db‘]->query($sql);
       return array(‘error‘=>false, ‘msg‘=>‘签到成功‘);
}else{ // 如果不是周一得判断有没有连续签到,具体方法是判断昨天有没有签到,如果签到了,连续签到次数加一,如果没有签到,连续次数归一 if(($today_zero - 24 * 60 *60) < $last_signin_time && $last_signin_time < $today_zero){ // 昨天已经签过到,连续签到天数加一 $sql = "update ".$GLOBALS[‘ecs‘]->table(‘users‘)." set cont_days = cont_days + 1, last_signin_time = ".time()." where user_id = ‘$_SESSION[user_id]‘"; $GLOBALS[‘db‘]->query($sql); $cont_days = $GLOBALS[‘db‘]->getOne("select cont_days from ".$GLOBALS[‘ecs‘]->table(‘users‘)." where user_id = ‘$_SESSION[user_id]‘");
          // 根据文章开头的假设确定奖励积分数量
switch ($cont_days) { case 3: $add_integrals = 1; break; case 5: $add_integrals = 2; break; case 7: $add_integrals = 3; break; default: break; }
          // code...  
// 签到日志记录操作和积分账户处理操作代码省略……
          if($add_integrals){
            return array(‘error‘=>false, ‘msg‘=>
‘你已经连续签到 ‘.$cont_days.‘ 天,获得奖励 ‘.$add_integrals.‘ 积分‘);
          }else{
            return array(‘error‘=>false, ‘msg‘=>‘签到成功‘);
          }

            }else{
                // 昨天没有签到,连续签到天数归一
                $sql = "update ".$GLOBALS[‘ecs‘]->table(‘users‘)." set cont_days = 1, last_signin_time = ".time()." where user_id = ‘$_SESSION[user_id]‘";
                $GLOBALS[‘db‘]->query($sql);
          return array(‘error‘=>false, ‘msg‘=>‘签到成功‘);
} } } }

$signinRes = userSignin();
var_dump($signinRes);  // 打印签到结果
 

以上是关于Python需求:啥值得买登录、签到、搜索功能的主要内容,如果未能解决你的问题,请参考以下文章

什么值得买自动签到自动评论定时任务

TL是啥?值得买吗?

关于荣耀x30 Max值不值得买 看完下文就明白

关于荣耀x30 Max值不值得买 看完下文就明白

值得网页开发人员收藏的16款HTML5工具

华为matebook16参数 怎么样?评测值得买吗?