利用redis数据库管理代理库爬取cosplay网站-cnblog

爬取cos猎人

数据库管理主要分为4个模块,代理获取模块,代理储存模块,代理测试模块,爬取模块

image-20240704075525606

cos猎人已经倒闭,所以放出爬虫源码

api.py 为爬虫评分提供接口支持

import requests
import concurrent.futures
import redis
import random
import flask  # 导入flask模块
from flask import request  # 获取url地址中查询参数
from flask import jsonify  # 可以把对象转换为字符串
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_DATABASE = 0
REDISOBJECT = 'proxysss'"""时间间隔配置"""
GETTER_PROXY = 60*5
VERIFY_PROXY = 60*3class RedisClient:def __init__(self, host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DATABASE):self.db = redis.Redis(host=host, port=port, db=db, decode_responses=True)def exists(self, proxy):"""判断传入代理有没有存输到数据库有TRUE,没有Falseis比not优先级高"""return not self.db.zscore(REDISOBJECT, proxy) is Nonedef add(self, proxy, score=10):"""添加代理到数据库,设置初始分数为10分决定是否加入新代理"""if not self.exists(proxy):return self.db.zadd(REDISOBJECT, {proxy: score})def random(self):"""随机选择一个代理尝试获取评分为100分的代理获取指定范围的代理如果数据库没有代理就提示数据库为空"""proxies = self.db.zrangebyscore(REDISOBJECT, 100, 100)if len(proxies):return random.choice(proxies)proxies = self.db.zrangebyscore(REDISOBJECT, 1, 99)if len(proxies):return random.choice(proxies)print("-----数据库为空----")def decrease(self, proxy):"""传入代理如果检测不过关,降低代理分数"""self.db.zincrby(REDISOBJECT, -10, proxy)score = self.db.zscore(REDISOBJECT, proxy)  # 查询分数if score <= 0:self.db.zrem(REDISOBJECT, proxy)  # 删除代理def max(self, proxy):"""检测代理可用,就将代理设置最大分数"""return self.db.zadd(REDISOBJECT, {proxy: 100})def count(self):"""获取数据库中代理的数量"""return self.db.zcard(REDISOBJECT)def all(self):"""获取所有代理,返回列表"""proxies = self.db.zrangebyscore(REDISOBJECT,1,100)if proxies:return proxieselse:print('-----数据库无代理----')def count_for_num(self,number):"""指定数量获取代理,返回一个列表"""all_proxies = self.all()proxies = random.sample(all_proxies,k=number)#随机取数据,不重样return proxiesdef get_proxy():return requests.get("http://127.0.0.1:5010/all").json()def delete_proxy(proxy):requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))# getHtml()
# def verify_thread_pool():
#     """线程池检测代理
#     1.从数据库中取到所有代理
#     2.用线程池检测代理"""
#     proxies_list = client.all()  # 列表
#     with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
#         for proxy in proxies_list:
#             executor.submit(verify_proxy, proxy)#
#
# TEST_URL = "https://www.baidu.com/"
# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'}
#
#
#
#
# def verify_proxy(proxy):
#     """检测代理是否可用"""
#     proxies = {
#         "http": "http://" + proxy,
#         "https": "https://" + proxy
#     }
#     try:
#         response = requests.get(url=TEST_URL, headers=headers, proxies=proxies, timeout=2)
#         if response.status_code in [200, 206, 302]:
#             """#判断请求返回的状态码是否成功
#             请求成功设为100分,调用max
#             请求不成功,将代理降分,调用decrease"""
#             client.max(proxy)
#             print("***代理可用***", proxy)
#         else:
#             client.decrease(proxy)
#             print("--状态码不合法--", proxy)
#     except:
#         """请求超时,表示代理不可用"""
#         client.decrease(proxy)
#         print("===请求超时===")
#
#     # 检测速度太慢,引入多任务,多线程
# def verify_thread_pool():
#         """线程池检测代理
#         1.从数据库中取到所有代理
#         2.用线程池检测代理"""
#         proxies_list = client.all()  # 列表
#         with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
#             for proxy in proxies_list:
#                 executor.submit(verify_proxy, proxy)
#
# if __name__ == '__main__':
#     # proxy = [
#     #     '45.234.63.220:999',
#     #     '60.168.255.69:8060',
#     #     '65.108.27.185:3128',
#     #     '62.162.91.205:3129',
#     #     '37.34.236.15:80'
#     # ]
#     # for pro in proxy:
#     #     verify_proxy(pro)
#     verify_thread_pool()

getter.py从数据库抽取一个代理

import requests
def get_one_proxy():return requests.get("http://127.0.0.1:5000/all")
print(get_one_proxy().text)

sever.py搭建本地服务器供调用

import flask  # 导入flask模块
from api import RedisClient
from flask import request  # 获取url地址中查询参数
from flask import jsonify  # 可以把对象转换为字符串app = flask.Flask(__name__)client = RedisClient()
@app.route('/')
# 将下面的函数挂载到路由
def index():"""视图函数:http://demo.spiderpy.cn/get/视图函数返回的数据,只能返回字符串类型的数据"""return '<h2>欢迎来到代理池</h2>'@app.route('/get')
def get_proxy():"""随机获取一个代理,调用数据库random模块"""one_proxy = client.random()return one_proxy@app.route('/getcount')
def get_any_proxy():"""获取指定数量一个代理,调用数据库的 count_for_num()拿到查询参数的值又可能用户没有传递查询参数,num返回为空"""num = request.args.get('num', '')if not num:"""没有获取到查询参数"""num = 1else:num = int(num)any_proxy = client.count_for_num(num)return jsonify(any_proxy)@app.route('/getnum')
def get_count_proxy():"""获取所有代理数量,调用数据库count方法"""count_proxy = client.count()return f"代理可用的数量为:{count_proxy}个"@app.route('/getall')
def get_all_proxy():"""获取所有代理,调用数据库的all()"""all_proxy = client.all()return jsonify(all_proxy)if __name__ == '__main__':"""运行实例化的app对象"""app.run()

test_self.py和tests.py对已经储存的代理质量进行检测

记不清哪个效果更好

import timeimport requests
from api import RedisClient
clients = RedisClient()
def get_proxy():return requests.get("http://127.0.0.1:5000/getall")a = get_proxy()
a = a.json()
# print(a)
# for b in a:
#     print(b)
# print(type(a))def getHtml():# retry_count = 1for proxy in a:# print(proxy)try:html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)},timeout=4)# print(html.text)if html.status_code in [200, 206, 302]:print(proxy,":可以使用")clients.add(proxy)# 使用代理访问except Exception:print("代理不可用", proxy)clients.decrease(proxy)# 删除代理池中代理# delete_proxy(proxy)
while True:getHtml()time.sleep(60*2)

进程池爬取cos猎人.py 主爬虫代码

from typing import List, Any
from concurrent.futures import ThreadPoolExecutor
import requests
import os
from lxml import etree
import re
if not os.path.exists('./img'):os.makedirs("img")
def get_one_proxy():return requests.get("http://127.0.0.1:5000/get")
proxies = get_one_proxy().text
# proxies = ''def down_img(img_url):for urls in img_url:response = requests.get(url=urls, headers=headers)name = urls.split("/")[-1]with open("./img/"+f'{name}', 'wb') as f:f.write(response.content)headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58","referer": "https://www.coshunter.pro/simo"
}a = 252#354
while a < 355:url = f"https://www.coshunter.pro/shop/buy/page/{a}"res = requests.get(url, headers=headers, proxies={"http": "http://{}".format(proxies)})res.encoding = "utf-8"html = re.findall(r'<a class="link-block" href="(.*?)"></a>',res.text)urls = html[:-1]# print(urls)for i in urls:res = requests.get(i, headers=headers, proxies={"http": "http://{}".format(proxies)})img_url = re.findall(r'<figure class="wp-block-image.*src="(.*?)"',res.text)print(img_url)with ThreadPoolExecutor(10) as t:t.submit(down_img,img_url)print(a)a += 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银河麒麟高级服务器操作系统(通用)安装和编译指定的python3版本

银河麒麟高级服务器操作系统&#xff08;通用&#xff09;安装和编译指定的python3版本 一 系统环境二 安装python3.12.42.1 安装编译需要的依赖包2.2 下载官网目前最新的python源码包2.3 解压Python-3.12.4.tar.xz2.4 配置python-3.12.42.5 编译安装2.6 配置环境变量使其生效2…

Artificial Intelligence Self-study

Artificial Intelligence Self-study Traditional AI (Symbolic AI) 基于&#xff1a;符号表示 数理逻辑 搜索 - 有明确规则&#xff0c;依靠算力。Appliance &#xff1a; 数学难题(Heuristic Algorithm)&#xff0c;棋牌对抗(围棋)&#xff0c;专家系统(输入病症&#xf…

linux安装jdk1.8(无废话版)

文章目录 1、下载安装包2、创建文件目录&#xff0c;并将安装包上传到该目录下3、解压安装包4、配置环境变量5、加载配置文件6、验证 前言&#xff1a;linux系统以ubuntu20.04.6版本为例&#xff0c;jdk版本jdk-8u411-linux-x64.tar.gz版本为例 1、下载安装包 jdk下载地址&am…

Python中列表推导式的概念以及示例

列表推导式&#xff08;List Comprehension&#xff09;是Python中一种简洁而强大的工具&#xff0c;用于从现有的可迭代对象&#xff08;如列表、元组、字符串等&#xff09;中快速生成新的列表。它提供了一种优雅的方式来表达循环和条件逻辑&#xff0c;以生成列表。列表推导…

2. 创建kvm虚拟机

创建kvm虚拟机 一、创建kvm虚拟机1、virt-manager 图形化工具2、virt-install 命令行工具3、查看虚拟机 一、创建kvm虚拟机 1、virt-manager 图形化工具 2、virt-install 命令行工具 [rootlocalhost ~]# virt-install --namevm02_centos79 \ > --graphics vnc,listen0.0.0…

linux下删除当前路径下的所有文件夹但保留文件

打开终端&#xff0c;输入&#xff0c; find . -mindepth 1 -maxdepth 1 -type d -exec rm -r {} 解释&#xff1a; find是查找文件和文件夹的命令。.表示当前路径。-mindepth 1表示最小搜索深度为1&#xff0c;这样不会包括当前目录。-maxdepth 1表示最大搜索深度为1&#x…

『Python学习笔记』Python运行设置PYTHONPATH环境变量!

Python运行设置PYTHONPATH环境变量&#xff01; 文章目录 一. Python运行设置PYTHONPATH环境变量&#xff01;1. 解释2. 为什么有用3. 示例4. vscode配置 一. Python运行设置PYTHONPATH环境变量&#xff01; export PYTHONPATH$(pwd) 是一个命令&#xff0c;用于将当前目录添…

举例C++程序在线程出错后重启线程

在C中&#xff0c;当一个线程出现错误时&#xff0c;可以通过捕获异常并重新启动线程来实现自动重启线程的功能。以下是一个简单的例子&#xff0c;展示了如何实现这一功能&#xff1a; #include <iostream> #include <thread> #include <exception> #inclu…

Java的数据类型(复习版)

思维导图 一.字面常量 什么是常量&#xff1f;在我的理解看来常量就是在一个程序运行期间&#xff0c;保持不变的量就是常量。 例如&#xff1a; System.out.println(100);System.out.println(a);System.out.println(3.114);这些都可以称为常量。 字面常量的分类&#xff1a;…

Swagger的原理及应用详解(七)

本系列文章简介&#xff1a; 在当今快速发展的软件开发领域&#xff0c;特别是随着微服务架构和前后端分离开发模式的普及&#xff0c;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;的设计与管理变得愈发重要。一个清晰、准确且易…

将 WSL(Windows Subsystem for Linux)移动到另一个盘上

方法一&#xff1a;通过 wsl --export 和 wsl --import 命令 导出当前的 WSL 分发版&#xff1a; 首先&#xff0c;您需要导出当前运行的 WSL 分发版。假设您的分发版名称为 Ubuntu-20.04&#xff0c;执行以下命令&#xff1a; wsl --export Ubuntu-20.04 D:\WSL\Ubuntu-20.04.…

护眼落地灯哪个牌子好?盘点五款必入不踩雷的护眼大路灯

护眼落地灯哪个牌子好&#xff1f;在这个快节奏的时代&#xff0c;护眼落地灯已经从一种高端选择转变为日常用眼生活中的必须品。不论是提升普通照明&#xff0c;还是针对孩子学习是改善光线质量环境&#xff0c;一款优秀的护眼落地灯都能成为我们生活中的照明神器。怎么选择一…

Java实现电子围栏的小例子

主要需求是实现一个电子围栏判断的小例子其中包括前端和后端的demo代码 引入对应的依赖库 <!--jts库通常用于几何计算和表示地理空间数据--> <dependency><groupId>org.locationtech.jts</groupId><artifactId>jts-core</artifactId><…

Python中定位一个序列中特点值出现的位置,比如 [0,0,0,1,1,0,0,]中1的位置

已知 Python中计算一个序列中特点值出现的数量&#xff0c;比如 [0,0,0,1,1,0,0,]中1的数量 如何定位位置呢 要找到列表 [0, 0, 0, 1, 1, 0, 0] 中 1 出现的位置&#xff08;索引&#xff09;&#xff0c;可以使用 Python 的列表推导式或者循环。以下是几种方法&#xff1a; …

在 VS Code 中自动化 Xcode 项目编译和调试

在 VS Code 中自动化 Xcode 项目编译和调试 在日常的开发工作中&#xff0c;Xcode 是 macOS、iOS、watchOS 和 tvOS 应用程序开发的主要工具。为了提高工作效率&#xff0c;许多开发者选择在 Visual Studio Code (VS Code) 中编辑代码&#xff0c;并希望能够直接从 VS Code 启…

无线传感器网络(物联网通信技术)期末考试2024年真题

目录 WSN期末复习资料 第一章&#xff1a;概述 第二章MAC协议 第三章路由协议 第四章时间同步技术 第五章定位技术 第六章安全技术 第七章拓扑控制 补充TPSN、HRTS公式推导 2024年期末考试考点 一、简述 二、考试真题回忆 WSN期末复习资料 第一章&#xff1a;概述 …

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——新建工程

一、介绍 ​ 蓝桥杯嵌入式使用的单片机是STM32G431RBT6&#xff0c;内核ARM Cortex - M4&#xff0c;MCUFPU&#xff0c;170MHz/213DMIPS&#xff0c;高达128KB Flash&#xff0c;32KB SRAM&#xff0c;其余的外设就不多介绍了&#xff0c;参照数据芯片数据手册 ​ CT117E-M4…

JavaScript——while类型

目录 任务描述 相关知识 while类型 编程要求 任务描述 质数的定义如下&#xff1a;大于1的自然数&#xff0c;且除了1和本身外没有别的因数。如2、3、5、7。 本关任务&#xff1a;利用循环结构求质数的和。 相关知识 在选择结构中&#xff0c;条件会被测试一次&#xff…

【matlab】信号分解/故障诊断——智能优化算法优化VMD

目录 引言 应用领域 VMD代码实现 智能优化算法优化VMD 引言 VMD&#xff08;变分模态分解&#xff09;是一种新的非线性自适应信号分解方法&#xff0c;它通过变分原理将复杂信号分解为若干个具有不同频率中心和带宽的本征模态函数&#xff08;Intrinsic Mode Functions, …

74HC165芯片验证

目录 0x01 74HC165芯片介绍0x02 编程实现 0x01 74HC165芯片介绍 74HC165的引脚定义如下&#xff0c;长这个样子 ABCDEFGH是它的八个输入引脚&#xff0c;例如你可以将它连接按键&#xff0c;让它来读取8个按键值。也可以将他级联其它的74165&#xff0c;无需增加单片机GPIO引…