python爬虫爬取中国国际招标有限公司

python爬虫爬取中国国际招标有限公司

python爬取数据存储到redis中

#  -*- coding: utf-8 -*-
# 中国国际招标有限公司
import re
from datetime import datetimeimport redis
import requests
from lxml import etree
from config import REDIS_IP, REDIS_PORT, REDIS_DB, REDIS_PASSWORD
from items.sql import MySQLclass Cntcitc:def __init__(self):self.redis = redis.Redis(host=REDIS_IP, port=REDIS_PORT, db=REDIS_DB, password=REDIS_PASSWORD,decode_responses=True, charset='UTF-8',encoding='UTF-8')self.db = MySQL()self.db.connect()self.name = '中国国际招标有限公司'self.url = 'https://www.cntcitc.com.cn/searchPage.html'self.api_url = 'https://www.cntcitc.com.cn/search.html'self.today = datetime.today().strftime('%Y-%m-%d')self.counter_key = f"cntcitc:counter:{self.today}"self.overall_cycle = Falseself.headers = {"referer": self.url,"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",}def get_data(self, key, page=1):payload = {'channelId': '-1','key': key,'startTime': "2024-06-18",'endTime': '','currentPage': page}con = requests.post(url=self.api_url, headers=self.headers, data=payload).content.decode('utf8')html = etree.HTML(con)content_text = ''.join(html.xpath('/html/body/div/div/form/div[2]/ul/text()'))content = content_text.strip()print(f"key:{key},爬取内容:{content}")if content == "未查询到相关内容":return Noneelse:return html# 获取总页数def get_page(self, key):html = self.get_data(key)if html is not None:pageText = ''.join(html.xpath('/html/body/div/div/form/div[2]/div/span[2]/text()'))# 使用正则表达式匹配“共x页”格式的文本match = re.search(r"共\d+页", pageText)# 如果匹配成功,去除中间空格并提取数字if match:# 去除中间空格cleaned_text = re.sub(r"\s", "", match.group())# 提取数字page = re.search(r"\d+", cleaned_text).group()else:page = Nonereturn pageelse:return Nonedef spider(self, key):pages = self.get_page(key)if pages is not None:self.overall_cycle = False# 爬取增量数据last_page_key = f"cntcitc:last_link:{key}"last_page_link = str(self.redis.get(last_page_key) or "")try:for page in range(1, int(pages) + 1):if self.overall_cycle:breakhtml = self.get_data(key, page)if html is not None:for i in range(1, 16):title = ''.join(html.xpath(f'/html/body/div/div/form/div[2]/ul/li[{i}]/a/text()')).strip()if title == "":breaksuffix_link = ''.join(html.xpath(f'/html/body/div/div/form/div[2]/ul/li[{i}]/a/@href'))link = f"https://www.cntcitc.com.cn/{suffix_link}"if last_page_link == link:self.overall_cycle = Truebreakpublish_time_text = ''.join(html.xpath(f'/html/body/div/div/form/div[2]/ul/li[{i}]/text()'))# 使用正则表达式匹配日期match = re.search(r'\d{4}-\d{2}-\d{2}', publish_time_text)publish_time = ""if match:date_str = match.group()publish_time = date_strself.store_to_redis(link, title, publish_time, key)if last_page_link == "":self.redis.set(last_page_key, link)last_page_link = linkexcept Exception as e:print(f"中国国际招标有限公司爬虫出现异常: {e}")self.redis.set(last_page_key, "")def store_to_redis(self, link, title, show_times, key):if self.redis.exists(link):existing_keys = self.redis.hget(link, 'keys').split(',')if key not in existing_keys:existing_keys.append(key)self.redis.hset(link, 'keys', ','.join(existing_keys))self.redis.hset(link, 'is_synced', 'false')else:self.redis.hset(link, mapping={'title': title,'show_times': show_times,'keys': key,'is_synced': 'false'})# 设置过期时间为28天(2419200秒)self.redis.expire(link, 2419200)self.redis.incr(self.counter_key)def get_today_crawl_count(self):return int(self.redis.get(self.counter_key) or 0)def process(self):key_list = ['动漫', '引流', '银行', '业务']for key in key_list:self.spider(key)print(f'中国国际招标有限公司的爬取数据数量为:{self.get_today_crawl_count()}')if __name__ == '__main__':bank_cntcitc = Cntcitc()bank_cntcitc.process()

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

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

相关文章

077、Python 关于魔术方法

概念: 魔术方法(Magic Methods),也叫魔法方法。是指有特殊用途和意义的方法。 定义: 方法在定义时,方法名使用双下划线开头和结尾。 一些常见的魔术方法: 初始化方法: __init__…

ChatGLM2-6B 运行代码解读(一)

目录 一、整体结构 二、终端运行 2.1 下载模型文件 2.2 修改代码 2.3 运行 本文主要对 ChatGLM2-6B 的运行代码进行解读。 一、整体结构 项目的整体结构如下所示。 node@node:~/ChatGLM2-6B$ tree -L 1 . ├── api.py ├── cli_demo.py #命令行运行 ├── e…

Nginx-http_limit_req_module模块

文章目录 前言一、ngx_http_limit_req_module模块二、指令1.limit_req_zone2.limit_req3.limit_req_log_level4.limit_req_status 实验burst取默认0的情况burst不取默认值 总结 前言 如何限制每个客户端每秒处理请求数 一、ngx_http_limit_req_module模块 生效阶段&#xff1…

间接平差——以水准网平差为例 (matlab详细过程版)

目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,间接平差——以水准网平差为例 (matlab详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、原理概述 间接平差的函数模型和随机模型…

深度学习 - 稠密张量与稀疏张量的区别

稠密张量与稀疏张量的区别 在机器学习和数据处理领域,张量是处理和存储多维数据的核心结构。张量主要分为两类:稠密张量(Dense Tensor)和稀疏张量(Sparse Tensor)。它们在数据存储和计算效率方面有显著的区…

加盖骑缝章软件、可以给PDF软件加盖自己的骑缝章

加盖骑缝章的软件多种多样,尤其是针对PDF文件,有多种软件可以实现给PDF文件加盖自己的骑缝章。以下是一些常用的软件及其特点: 1. Adobe Acrobat Pro DC 特点: 多功能PDF编辑:Adobe Acrobat Pro DC是一款功能强大的…

加入运动健康数据开放平台,共赢鸿蒙未来

HarmonyOS SDK运动健康服务(Health Service Kit)是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台。在获取用户授权后,开发者可以使用运动健康服务提供的开放能力获取运动健康数据,基于多种类型数据构建运动健…

【Qwen2部署实战】Ollama上的Qwen2-7B:一键部署大型语言模型指南

系列篇章💥 No.文章1【Qwen部署实战】探索Qwen-7B-Chat:阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用4【Q…

Python创建MySQL数据库

一、使用Docker部署本地MySQL数据库 docker run --restartalways -p 3307:3306 --name mysql -e MYSOL_ROOT_PASSWORDlms123456 -d mysql:8.0.25 参数解析: 用户名:root 密码:lms123456 端口:3307 二、在Pycharm开发工具中配置连接MySQL数据库 三、安装zdppy_mysql pip inst…

沉浸式三维园区场景漫游体验

利用图扑三维可视化技术展示园区在不同时间段的变化,提供全景漫游体验,帮助用户全方位感受和理解园区环境,实现智能化管理与优化。

Linux 进程间的信号

1.信号的初认识 信号是进程之间事件异步通知的一种方式,属于软中断。通俗来说信号就是让用户或进程给其他用户和进程发生异步信息的一种方式。对于信号我们可以根据实际生活,对他有以下几点认识:1.在没有产生信号时我们就知道产生信号要怎么处…

LLM - 卷积神经网络(CNN)

1. 卷积神经网络结构:分为输入层,卷积层,池化层,全连接层; (1)首先进入输入层,对数据数据进行处理,将输入数据向量化处理,最终形成输入矩阵。 (…

电脑录歌用什么软件好?分享电脑录音软件:6款

短视频普遍的今天,越来越多的人喜欢通过电脑进行音乐创作和录制。然而,面对市面上琳琅满目的电脑录音软件,很多人可能会感到困惑:电脑录歌用什么软件好呢?本文将为大家分享六款精选的录音软件,帮助大家找到…

校园电动车安全监控和调度系统-计算机毕业设计源码13028

摘要 校园电动车安全监控和调度系统是为了确保校园内电动车的安全和高效运行而设计的。该系统通过安装在电动车上的监控设备,实时监测电动车的运行状态,包括速度、位置、电池电量等,一旦发现异常情况,系统会立即发出警报并通知相关…

【matlab】分类回归——智能优化算法优化径向基神经网络

径向基(Radial Basis Function, RBF)神经网络 一、基本概念 径向基函数(RBF):是一个取值仅仅依赖于离原点(或某一中心点)距离的实值函数。在RBF神经网络中,最常用的径向基函数是高…

使用patch-package自动修改node_modules中的内容/打补丁

背景 在使用VuePress搭建个人博客的过程中,我需要使用到一个用来复制代码块的插件uepress-plugin-nuggets-style-copy。 问题:插件可以正常安装,但是启动会报错。通过查看错误信息,定位是插件中的copy.vue文件出现错误&#xff0c…

qt 配置文件中组怎么表示

在 Qt 的配置文件中,特别是当使用 INI 格式时,组是通过方括号 [] 来表示的。组名被放在方括号内,后面跟着的是属于该组的配置项和值。这种方式有助于将相关的配置项组织在一起,便于管理和查找。 例如,一个典型的 INI …

将循环转化为递归的三种方法,求1+2+3……+n等差数列

解法一&#xff1a;使用公共变量s&#xff0c;递归循环1~n加到s上 #include<bits/stdc.h> using namespace std; int n,s; void fun(int i){if(i<n){ssi;fun(i1);}}int main(){cin>>n;fun(1);cout<<s;return 0; } 解法二&#xff1a;通过层层累加&#x…

Python 动态添加实例属性,实例方法,类属性,类方法

创建一个 Student 测试类&#xff0c;初始化时添加 name 和 age 实例属性 class Student:def __init__(self,name,age):self.namenameself.ageage动态为 Student 类 xh 实例对象动态添加 实例属性 xh Student("小黄","20") # 实例化对象 xh.weight 20 …

C语言自定义类型——联合体、枚举

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、联合体&#xff08;一&#xff09;、联合体的声明&#xff08;二&#xff09;、联合体的特点&#xff08;三&#xff09;、联合体大小的计算&#xff01;&a…