前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Redis】孔夫子旧书网爬虫接入芝麻代理IP:代理IP利用效率最大化

【Redis】孔夫子旧书网爬虫接入芝麻代理IP:代理IP利用效率最大化

作者头像
德宏大魔王
发布2023-08-08 15:22:35
3100
发布2023-08-08 15:22:35
举报
文章被收录于专栏:cloud stdiocloud stdio

背景:

之前用过芝麻IP,写过这几篇文章

《【Python】芝麻HTTP代理系列保姆级全套攻略(对接教程+自动领取每日IP+IP最优算法)

《【Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》

《爬虫增加代理池:使用稳定第三方芝麻代理IP 教程(详细可用)》

后面的项目都用他家的代理是因为,每天都有免费额度,不知不觉薅羊毛275天了,而且上次使用还不能生成代码,提交了建议后没想到真的实现了

目录:

设计思路:

用户通过小程序访问孔夫子的图书详情接口,访问前通过检查redis判断是否有代理IP,没有则生成并记录去redis,有则直接使用,因为接口使用不会存在长时间连接的情况,基本都是一次性访问,所以,本次方案行得通。

通过购买代理次数包,每次提取一个代理供接口调用使用,因为用户使用时段不一样,做到能最大限度节约成本,一个IP在有效时间内供多人使用,可以看下他们的价目表,开发可以先使用体验套餐

这里由于没有额度了,我先开通套餐


获取代理接口

1、通过配置参数获取接口

2、通过curl获得php访问代码

代码语言:javascript
复制
 // 初始化 cURL
        $ch = curl_init();
        
        // 设置 cURL 参数
        curl_setopt($ch, CURLOPT_URL, "http://**********s=");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        
        // 发送请求并获取响应
        $response = curl_exec($ch);
        
        // 关闭 cURL
        curl_close($ch);

        $data = json_decode(trim($response),true);

3、通过访问观察下返回情况

有ip、端口、以及过期时间

代码语言:javascript
复制
{
	"code": 0,
	"data": [{
		"ip": "111.76.65.216",
		"port": 4278,
		"expire_time": "2023-06-16 16:46:05"
	}],
	"msg": "0",
	"success": true
}

封装IP检测模块

在控制器中,新建zhimahttp方法

如果redis没有该记录则重新获取IP,具体可以看流程图👇

过期时间换算

获取到过期时间后,通过计算现在与目标过期的时间,确定存储倒计时

代码语言:javascript
复制
 // 获取当前时间戳
    $now = time();
    
    // 将时间字符串转换为时间戳
    $target = strtotime($expireTime);
    
    // 计算时间差
    $diff = $target - $now;
    // 存入redis
    $redis->set($proxy_name,$proxyServer,$diff);

最后,完整封装代码如下:

代码语言:javascript
复制
 // 芝麻ip代理配置
       public function zhimahttp(){
      
        $proxy_name="proxy_ip";//定义存储名
        $redis = new Redis();
           //查询redis是否有记录
        $re= $redis->get("$proxy_name");
               if ($re) {
                   // 存在记录使用即可
                   return "$re";
                die();
               } else {
                   //不存在记录,从芝麻ip获取并存储
               // 初始化 cURL
        $ch = curl_init();
        
        // 设置 cURL 参数
        curl_setopt($ch, CURLOPT_URL, "htt**********ns=");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        
        // 发送请求并获取响应
        $response = curl_exec($ch);
        
        // 关闭 cURL
        curl_close($ch);

        $data = json_decode(trim($response),true);
        // 判断code的值
if ($data['code'] == 0) {
    // 解析ip、port、expire_time
    $ip = $data['data'][0]['ip'];
    $port = $data['data'][0]['port'];
    $expireTime = $data['data'][0]['expire_time'];
    
    // 输出解析结果
    // echo "IP: $ip\n";
    // echo "Port: $port\n";
    // echo "expireTime: $expireTime\n";
    $proxyServer = 'http://' . $ip.':'.$port;
    // echo "$proxyServer";
    // 获取当前时间戳
    $now = time();
    
    // 将时间字符串转换为时间戳
    $target = strtotime($expireTime);
    
    // 计算时间差
    $diff = $target - $now;
    // 存入redis
    $redis->set($proxy_name,$proxyServer,$diff);
    return $proxyServer;
} else {
      // exit('ip 不正确');
      die(
        json_encode(
            array(
            'code' => 100,
            'data'=>'',
            'msg' => 'ip 不正确'
        ),480)
);
}
            
        
               }
        
        
    }

调用检测模块:

上面的代码中,我们已经在控制器中封装了方法,如何使用呢?

在tp5中调用方法即可,调用方法:

代码语言:javascript
复制
  //代理ip   
 $proxyServer =$this->zhimahttp();
 //代理ip   

结合我的业务代码,在访问接口前进行调用检查即可,接下来是一个示例:

代码语言:javascript
复制
 //调用代理ip检查   
 $proxyServer =$this->zhimahttp(); 
    
 $ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://app.kongfz.com/invokeSearch/app/product/productSearchV2');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, $proxyServer);
$response = curl_exec($ch);

curl_close($ch);

注意:

curl_setopt(ch, CURLOPT_PROXY, proxyServer); 记得在上面加上,不然代理ip没用上

接口测试

访问一次目标接口,由于第一次redis中没有记录,所以会存入名为proxy_ip的数据

再次访问(记录没有过期),由于记录存在所以就直接返回代理ip了,测试了下小程序接口可以正常使用

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景:
  • 目录:
  • 设计思路:
  • 获取代理接口
  • 封装IP检测模块
    • 过期时间换算
    • 调用检测模块:
    • 接口测试
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档