爬虫实战--人民网

文章目录

  • 前言
  • 发现宝藏

前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。

http://jhsjk.people.cn/testnew/result

import os
import re
from datetime import datetime
import requests
import json
from bs4 import BeautifulSoup
from pymongo import MongoClient
from tqdm import tqdmclass ArticleCrawler:def __init__(self, catalogues_url, card_root_url, output_dir, db_name='ren-ming-wang'):self.catalogues_url = catalogues_urlself.card_root_url = card_root_urlself.output_dir = output_dirself.client = MongoClient('mongodb://localhost:27017/')self.db = self.client[db_name]self.catalogues = self.db['catalogues']self.cards = self.db['cards']self.headers = {'Referer': 'https://jhsjk.people.cn/result?','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/119.0.0.0 Safari/537.36','Cookie': '替换成你自己的',}# 发送带参数的get请求并获取页面内容def fetch_page(self, url, page):params = {'keywords': '','isFuzzy': '0','searchArea': '0','year': '0','form': '','type': '0','page': page,'origin': '全部','source': '2',}response = requests.get(url, params=params, headers=self.headers)soup = BeautifulSoup(response.text, 'html.parser')return soup# 解析请求版面def parse_catalogues(self, json_catalogues):card_list = json_catalogues['list']for list in card_list:a_tag = 'article/'+list['article_id']card_url = self.card_root_url + a_tagcard_title = list['title']updateTime = list['input_date']self.parse_cards(card_url, updateTime)date = datetime.now()catalogues_id = list['article_id']+'01'# 检查重复标题existing_docs = self.catalogues.find_one({'id': catalogues_id})if existing_docs is not None:print(f'版面id: {catalogues_id}【已经存在】')continuecard_data = {'id': catalogues_id,'title': card_title,'page': 1,'serial': 1,# 一个版面一个文章'dailyId': '','cardSize': 1,'subjectCode': '50','updateTime': updateTime,'institutionnCode': '10000','date': date,'snapshot': {}}self.catalogues.insert_one(card_data)print(f'版面id: {catalogues_id}【插入成功】')# 解析请求文章def parse_cards(self, url, updateTime):response = requests.get(url, headers=self.headers)soup = BeautifulSoup(response.text, "html.parser")try:title = soup.find("div", "d2txt clearfix").find('h1').textexcept:try:title = soup.find('h1').textexcept:print(f'【无法解析该文章标题】{url}')html_content = soup.find('div', 'd2txt_con clearfix')text = html_content.get_text()imgs = [img.get('src') or img.get('data-src') for img in html_content.find_all('img')]cleaned_content = self.clean_content(text)# 假设我们有一个正则表达式匹配对象matchmatch = re.search(r'\d+', url)# 获取匹配的字符串card_id = match.group()date = datetime.now()if len(imgs) != 0:# 下载图片self.download_images(imgs, card_id)# 创建文档document = {'id': card_id,'serial': 1,'page': 1,'url' : url,'type': 'ren-ming-wang','catalogueId': card_id + '01','subjectCode': '50','institutionCode': '10000','updateTime': updateTime,'flag': 'true','date': date,'title': title,'illustrations': imgs,'html_content': str(html_content),'content': cleaned_content}# 检查重复标题existing_docs = self.cards.find_one({'id': card_id})if existing_docs is None:# 插入文档self.cards.insert_one(document)print(f"文章id:{card_id}【插入成功】")else:print(f"文章id:{card_id}【已经存在】")# 文章数据清洗def clean_content(self, content):if content is not None:content = re.sub(r'\r', r'\n', content)content = re.sub(r'\n{2,}', '', content)# content = re.sub(r'\n', '', content)content = re.sub(r' {6,}', '', content)content = re.sub(r' {3,}\n', '', content)content = content.replace('<P>', '').replace('<\P>', '').replace('&nbsp;', ' ')return content# 下载图片def download_images(self, img_urls, card_id):# 根据card_id创建一个新的子目录images_dir = os.path.join(self.output_dir, card_id)if not os.path.exists(images_dir):os.makedirs(images_dir)downloaded_images = []for img_url in img_urls:try:response = requests.get(img_url, stream=True)if response.status_code == 200:# 从URL中提取图片文件名image_name = os.path.join(images_dir, img_url.split('/')[-1])# 确保文件名不重复if os.path.exists(image_name):continuewith open(image_name, 'wb') as f:f.write(response.content)downloaded_images.append(image_name)print(f"Image downloaded: {img_url}")except Exception as e:print(f"Failed to download image {img_url}. Error: {e}")return downloaded_images# 如果文件夹存在则跳过else:print(f'文章id为{card_id}的图片文件夹已经存在')# 查找共有多少页def find_page_all(self, soup):# 查找<em>标签em_tag = soup.find('em', onclick=True)# 从onclick属性中提取页码if em_tag and 'onclick' in em_tag.attrs:onclick_value = em_tag['onclick']page_number = int(onclick_value.split('(')[1].split(')')[0])return page_numberelse:print('找不到总共有多少页数据')# 关闭与MongoDB的连接def close_connection(self):self.client.close()# 执行爬虫,循环获取多页版面及文章并存储def run(self):soup_catalogue = self.fetch_page(self.catalogues_url, 1)page_all = self.find_page_all(soup_catalogue)if page_all:for index in tqdm(range(1, page_all), desc='Page'):# for index in tqdm(range(1, 50), desc='Page'):soup_catalogues = self.fetch_page(self.catalogues_url, index).text# 解析JSON数据soup_catalogues_json = json.loads(soup_catalogues)self.parse_catalogues(soup_catalogues_json)print(f'======================================Finished page {index}======================================')self.close_connection()if __name__ == "__main__":crawler = ArticleCrawler(catalogues_url='http://jhsjk.people.cn/testnew/result',card_root_url='http://jhsjk.people.cn/',output_dir='D:\\ren-ming-wang\\img')crawler.run()  # 运行爬虫,搜索所有内容crawler.close_connection()  # 关闭数据库连接

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Django学习记录02

1.请求与响应 1.1get与post的区别 get 一般是从url输入地址&#xff0c;会调用get请求 post 一般是内部数据传输# get请求 def something(request):# req是一个对象&#xff0c;封装了用户发送过来的所有请求相关数据# 1.获取请求方式 http://localhost:8000/something# pri…

前端文件下载的多种方式

前端文件下载的多种方式。 前言a标签下载a标签常用属性介绍- target&#xff0c;href&#xff0c;download。 window.location.href下载window.open下载iframe 下载动态生成a标签下载文件url下载文件流下载blob文件流转换常用类型 使用 streamSaver 看实时下载进度 前言 如果我…

互联网加竞赛 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

嵌入式软件bug分析基本要求

摘要&#xff1a;软件从来不是一次就能完美的&#xff0c;需要以包容的眼光看待它的残缺。那问题究竟为何产生&#xff0c;如何去除呢&#xff1f; 1、软件问题从哪来 软件缺陷问题千千万万&#xff0c;主要是需求、实现、和运行环境三方面。 1.1 需求描述偏差 客户角度的描…

GADM 4.1 全球国家行政区划下载

扫描文末二维码&#xff0c;关注微信公众号&#xff1a;ThsPool 后台回复g004&#xff0c;领取最新 GADM 4.1 全球国家行政区划 GADM概述 GADM&#xff0c;全称 Database of Global Administrative Areas&#xff0c;是一个开放获取的全球行政区划数据库&#xff0c;包含各国、…

教授LLM思考和行动:ReAct提示词工程

ReAct&#xff1a;论文主页 原文链接&#xff1a;Teaching LLMs to Think and Act: ReAct Prompt Engineering 在人类从事一项需要多个步骤的任务时&#xff0c;而步骤和步骤之间&#xff0c;或者说动作和动作之间&#xff0c;往往会有一个推理过程。让LLM把内心独白说出来&am…

React+echarts实现排名+自动滚动+X轴自定义titleTop

1、效果 2、环境准备 1、react18 2、antd 4 3、代码实现 原理&#xff1a;自动滚动通过创建定时器动态更新echar的dataZoom属性startValue、endValue&#xff0c;自定义tooltip通过监听echar的鼠标移入移出事件&#xff0c;判断tooltTip元素的显隐以及位置。 /*** 收集完成…

nacos注册服务之后调用找不到调用的service注册服务问题

我的项目只包含user用户模块、order订单模块&#xff0c;并且配置了这两个模块的服务 订单服务order模块的注册&#xff1a; 用户服务user模块的注册: 报错&#xff1a; 经过一番查询我知道了要在RestTemplate这个bean上加上LoadBalanced注解来开启负载均衡&#xff0c;上面我…

前端实现搜索框筛选

效果图 页面解析 是一个input输入框和一个button按钮组成输入框查询 内容是一个折叠面板 html代码 <div class"left-content-box"><div class"colum-search"><el-input v-model"columKey" clearable placeholder"请输入关…

【达梦数据库】使用DBeaver管理达梦数据库

使用DBeaver管理达梦数据库 Step1 安装相关程序 达梦8数据库DBeaver社区版 Step2 新建驱动 类型参数驱动名称DM8驱动类型Generic类名dm.jdbc.driver.DmDriverURL模板jdbc:dm://{host}:{port}默认端口5236默认数据库默认用户SYSDBA Step3 连接服务

标准库 STM32+EC11编码器+I2C ssd1306多级菜单例程

标准库 STM32EC11编码器I2C ssd1306多级菜单例程 &#x1f4cc;原创项目来源于&#xff1a;https://github.com/AdamLoong/Embedded_Menu_Simple&#x1f4cd;相关功能演示观看&#xff1a;https://space.bilibili.com/74495335 单片机多级菜单v1.2 &#x1f449;本次采用的是原…

docker-学习-5

docker-学习第五天 docker-学习第五天1. 昨天的练习回顾1.1. 练习11.2. 练习2 2. 命令2.1. 看镜像的详细信息 3. Dockerfile指令3.1. 常见的指令3.2. ENTRYPOINT和CMD的区别3.3. RUN中的set指令 4. 镜像的原理4.1. 为什么 Docker 镜像要采用这种分层结构呢&#xff1f;4.2. doc…