#笔记# 写给自己用的小爬虫

最近完成了一个文旅行业信息聚合的小应用,实现仅从一个入口了解全行业的信息动态,不用一个一个翻看各网站,节省了不少检索时间。

一、基本思路

明确数据来源。基于前述目标,确定数据源为文化和旅游部管理部门官网,比如各省厅网站、各副省级城市网站,文化和旅游管理部门直属单位网站,中国文化报电子版,中国旅游报电子版等,目前大约有60多个网站。

写采集程序。日常使用 Win 系统+ Edge 浏览器,故采集程序使用 Python,配合 Selenium 4 来实现。获取到的数据(标题、链接),存储到 Sqlite3 数据库。

写展示网页。将抓取到的数据进行展示,打开页后,点击某个标题,即可跳转信息源网站,查看对应信息。

二、代码框架

整个项目代码框架如下

├─anhui_msg.py                    // 爬虫1├─get_bozhou.py                   // 爬虫2├─provinces_msg.py                // 爬虫3├─province_level_cities.py        // 爬虫4├─luyoubao_news.py                // 爬虫5├─wenhuabao_news.py               // 爬虫6├─newsspider.py                   // 爬虫共用代码├─txt2db.py                       // 抓取信息转存数据库├─auto_run.bat                    // 自动抓取、转存、更新脚本├─ahwlmsg.db                      // 保存所有数据的数据库文├─<DIR> html                      // 展示网页代码├─<DIR> provinces                 // 保存各省文化和旅游厅网站信息├─<DIR> province_level_cities     // 保存副省级城市文化旅部网站信息├─<DIR> txt                       // 保存安徽省市文化和旅部网站信息

html 目录下的文件如下:

├─<DIR>static                    // 内含 CSS、JS、图标├─<DIR>templates                 // 网页前端模板├─run.bat                        // 本地自动运行网站脚本├─ahwlmsg.db                     // 保存所有数据的数据库文件├─generate_html.py               // 网页后端

三、技术栈

采集程序: Python + Selenium4 + SQL

网页前端: Html + CSS + JQuery

网页后端 Python + Flask + SQL

四、代码实现

(一)网页信息获取

信息采集代码总体思路大体一致。均使用 Selenium 模拟浏览器打开相应网站,获取链接后,全部保存为本地文件;然后进一步梳理存入数据库。

以获取副省级城市文化旅游网站信息为例。基本代码如下:


def grasp_all_a(url, driver):assert(driver)driver.get(url)print("\033[1;31;40m looking {}... \033[0m".format(url))try:# 等待网页打开15秒,直至可以定位到<a>标签。WebDriverWait(driver, 15).until(EC.visibility_of_element_located((By.TAG_NAME,'a')))except:print("timeout")# 获取网页上所有的<a>标签。a_tags = driver.find_elements(By.TAG_NAME, "a")#逐个分析<a>标签,并分别处理。filename = get_filename(url).rstrip('/')with open("./province_level_cities/" + filename+".txt", 'w', encoding='utf-8') as f:for tag in a_tags:title = tag.get_attribute('title').replace('\n','').strip(' ')href = tag.get_attribute('href')if title and href:if filename not in href:continueelif 'javascript' not in href:f.write(title + "\t" + href + "\n" )elif href:if 'javascript' in href:continueelse:f.write(tag.text.replace('\n','').strip(" ") + "\t" + href + "\n" )driver.quit()

实现逻辑分三步:

1. 准备工作。

2. 打开网页后,获取该网页上所\<A>标签。

3. 对每一个\<A>标签的title和href属性进行分析:没有title和href则跳出;同时存在时,一看href是不是指向本网站,二看href中是不是包括JavaScript,如果链接指向本网站且链接中不包括JavaScript,就把A标签的title、href属性保存到文件里;只有href属性且链接中不包括JavaScript时,做一点清理后,将href保存到文件中。

(二)网页避坑设置

由于各种原因,并非所有网页数据都能成功获取,所以在打开网页前需要做一些设置。通过反复调试,以下代码可满足多数情况下的需要。

def ready_to_grasp():path = r"d:\\webdriver\\msedgedriver.exe"if os.path.exists(path):sys.path.append(path)else:print("Please install webdriver first.\n")exit(-1)options = Options()options.add_argument('headless')options.add_argument('disable-gpu')options.add_argument('no-sandbox')options.add_argument('incognito')options.add_argument("disable-blink-features=AutomationControlled")options.binary_location = r"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"driver = webdriver.Edge(options=options)driver.execute_cdp_cmd('Network.setUserAgentOverride', \{"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 \Safari/537.36 Edg/119.0.0.0'})return driver

以上代码为三部分:一是准备工作;二是设置选项;三是调用执行。代码本身可以说明。

(三)网页展示

找个看着比较顺眼的网站,保存到本地,去掉不需要的功能,确定前端样式,形成网页模板。

后端主要是响应网页上的操作,查询数据库,并将查询结果从后端向前端传送等。

图片

(最终网页效果)

五、结语

这个周末项目式的“小雪球”,断断续续重写了三遍。目前,程序每天在跑,每天在用,可浏览最近一周之内各省、副省级城市和安徽省各市文旅网站发布的信息资讯。

期间,也尝试接入目前流行的大模型。比如,在鼠标移到网页上某个标题时,自动连接大模型,在不跳转页面的情况下,对其内容进行摘要。

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

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

相关文章

【办公类-21-18】20240701 养老护理员初级选择题488,制作PyQt5图形界面GUI

背景需求&#xff1a; 6月16日育婴师高级考完了。运气好&#xff0c;抽到的是”护理患腹泻的幼儿”&#xff0c;“晨检与家长沟通”&#xff0c;“4个月婴儿喂蛋黄”&#xff0c;“21个月食谱”&#xff0c;都是我背过的题目&#xff08;没有抽到感统&#xff09; 于是一放假&…

【C语言】解决C语言报错:Invalid Pointer

文章目录 简介什么是Invalid PointerInvalid Pointer的常见原因如何检测和调试Invalid Pointer解决Invalid Pointer的最佳实践详细实例解析示例1&#xff1a;未初始化的指针示例2&#xff1a;已释放的指针示例3&#xff1a;返回局部变量的指针示例4&#xff1a;野指针 进一步阅…

《化学工程与装备》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《化学工程与装备》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《化学工程与装备》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;福建石油化工集团有限责任公司 …

昇思25天学习打卡营第6天|网络构建

网络构建 概念模型模型参数 概念 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&…

技术革新:如何用数据中台实现数字化转型

作为程序员&#xff0c;我们总是对技术如何改变企业运作充满好奇。今天&#xff0c;我们将深入探讨森马集团如何利用数据中台技术&#xff0c;实现从传统数据分析到数字化转型的华丽转身。 1. 技术背景&#xff1a;森马集团的数字化挑战 森马集团&#xff0c;一个在服饰行业占…

天津惠灵顿:从心,致逐梦康桥|在这所天津国际学校从容不迫中走近梦想

在刚刚落下帷幕的申请季中&#xff0c;来自惠灵顿天津校区的Herman&#xff0c;陆续收到了剑桥大学、帝国理工学院、纽约大学、瓦萨学院等10余封录取通知书。面对纷至沓来的名校肯定&#xff0c;经历了短暂的尘埃落定的喜悦&#xff0c;Herman很快恢复了往日里的泰然自若。在他…

chunkers/maxent_ne_chunker/english_ace_multiclass.pickle 找不到

首先在这个nltk_data &#xff1a; NLTK Data官方下的数据集&#xff0c;找不到english_ace_multiclass.pic 说明缺少这个文件 : 那么在 nlp/resources/chunkers/maxent_ne_chunker/english_ace_multiclass.pickle at master teropa/nlp (github.com) 下载那两个文件 : 然…

基于SpringBoot的CSGO赛事管理系统

您好&#xff01;我是专注于计算机技术研究的码农小野。如果您对CSGO赛事管理系统感兴趣或有相关开发需求&#xff0c;欢迎随时联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架&#xff0c;Java技术 工具&#xff1a;Eclipse&a…

迈阿密色主题学科 HTML5静态导航源码

源码介绍 迈阿密色主题学科 HTML5静态导航源码&#xff0c;源码直接上传可用&#xff0c;有技术的可以拿去写个后端搜索调用百度接口&#xff0c;也可用于做引导页下面加你网址添加一个A标签就行了&#xff0c;很简单&#xff0c;需要的朋友就拿去吧 界面预览 源码下载 迈阿…

专题五:Spring源码之初始化容器上下文

上一篇我们通过如下一段基础代码作为切入点&#xff0c;最终找到核心的处理是refresh方法&#xff0c;从今天开始正式进入refresh方法的解读。 public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(…

鸿蒙本地签名不匹配问题

连接鸿蒙手机运行项目报如下错误 这是由于本地签名和鸿蒙设备签名不匹配导致的&#xff0c;需要注释掉如下代码&#xff0c;选择file project 自动签名 勾选auto选项&#xff0c;会在build-profile.json5中生成一个签名&#xff0c;然后运行就ok了~

创建一个Django用户认证系统

目录 1、Django2、Django用户认证系统User 模型&#xff1a;Authentication 视图&#xff1a;认证后端 (Authentication Backends)&#xff1a;Form 类&#xff1a;中间件 (Middleware)&#xff1a;权限和组 (Permissions and Groups)&#xff1a; 3、创建一个django用户认证系…

MNIST手写字体识别(算法基础)

快教程 10分钟入门神经网络 PyTorch 手写数字识别 慢教程 【深度学习Pytorch入门】 简单回归问题-1 梯度下降算法 梯度下降算法 l o s s x 2 ∗ s i n ( x ) loss x^2 * sin(x) lossx2∗sin(x) 求导得&#xff1a; f ‘ ( x ) 2 x s i n x x 2 c o s x f^(x)2xsinx x^…

Cesium大屏-vue3注册全局组件

1.需求 说明&#xff1a;产品经理要求开发人员在地图大屏上面随意放置组件&#xff0c;并且需要通过数据库更改其组件大小&#xff0c;位置等&#xff1b;适用于大屏组件中场站视角、任意位置标题等。 2.实现 2.1GlobalComponents.vue 说明&#xff1a;containerList可以通…

python基础语法 004-2流程控制- for遍历

1 遍历 1.1 什么是遍历&#xff1f; 可以遍历的元素&#xff1a;字符串、列表、元组、字典、集合字符串是可以进行for 循环。&#xff08;容器对象&#xff0c;序列&#xff09;可迭代对象iterable 例子&#xff1a; 1 &#xff09;、for遍历字符串&#xff1a; name xiao…

RK3568驱动指南|第十五篇 I2C-第167章 I2C上拉电阻

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

SpringBoot实现图片添加水印

提示&#xff1a;今日完成图片添加水印功能 后续可能还会继续完善这个功能 文章目录 目录 文章目录 前端部分 后端 Xml Controller层 Sercive层 Service实现层 Config配置层 application.properties 文件后缀名获取 常量定义 前端部分 <!DOCTYPE html> <htm…

WIN11,如何同时连接有线网络与WLAN无线网络

之前写了两篇文章&#xff0c;一篇是双网卡多网卡时win11如何设置网卡优先级_多网卡设置网卡优先级-CSDN博客 另一篇是win11 以太网和WLAN冲突 连接网线时导致WiFi掉线 解决_win11 以太网和wifi不能同时生效-CSDN博客 这篇是对上面两篇的补充&#xff1a;主要解决电脑重启后&…

语音芯片TD5580,USB小音响芯片—拓达半导体

有时候电脑的声卡会出现损坏的问题&#xff0c;给我们的生活带来了很多麻烦。这时候&#xff0c;我们就需要一款方便易用的产品来解决声卡问题。USB声卡小音响就是为了解决这个问题而设计的一款便捷的产品。它不仅可以作为一个小音响&#xff0c;让您在工作和娱乐的时候享受高品…

docker-compose搭建minio对象存储服务器

docker-compose搭建minio对象存储服务器 最近想使用oss对象存储进行用户图片上传的管理&#xff0c;了解了一下例如aliyun或者腾讯云的oss对象存储服务&#xff0c;但是呢涉及到对象存储以及经费有限的缘故&#xff0c;决定自己手动搭建一个oss对象存储服务器&#xff1b; 首先…