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

news2024/12/23 12:42:36

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

一、基本思路

明确数据来源。基于前述目标,确定数据源为文化和旅游部管理部门官网,比如各省厅网站、各副省级城市网站,文化和旅游管理部门直属单位网站,中国文化报电子版,中国旅游报电子版等,目前大约有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:
                continue
            elif 'javascript' not in href:
                f.write(title + "\t" + href + "\n" )
            elif href:
                if 'javascript' in href:
                    continue
                else:
                    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.coloradmin.cn/o/1883580.html

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

相关文章

万界星空科技公司推出AI低代码MES,引领制造业智能化新潮流

随着科技的不断进步和制造业的快速发展&#xff0c;传统生产管理模式正面临前所未有的挑战。在这个背景下&#xff0c;万界星空科技公司凭借其前瞻性的技术洞察力和强大的研发实力&#xff0c;推出了AI低代码MES&#xff08;制造执行系统&#xff09;&#xff0c;该系统凭借其独…

【深度学习】调整加/减模型用于体育运动评估

摘要 一种基于因果关系的创新模型&#xff0c;名为调整加/减模型&#xff0c;用于精准量化个人在团队运动中的贡献。该模型基于明确的因果逻辑&#xff0c;将个体运动员的价值定义为&#xff1a;在假设情景下&#xff0c;用一名价值为零的球员替换该球员后&#xff0c;预期比赛…

2024免费的股票数据接口API

沧海数据 # Restful API https://tsanghi.com/api/fin/stock/{exchange_code}/realtime?token5dbb47113a4a43a6be1755673ce854db&ticker{ticker} 数据来源&#xff1a;沧海数据 请求方式&#xff1a;Get 数据格式&#xff1a;标准Json格式[{},...{}]

一篇文章学会【node.js安装以及Vue-Cli脚手架搭建】

一.为什么搭建Vue-Cli (1).传统的前端项目结构&#xff1a; 一个项目中有许多html文件&#xff0c;每一个html文件都是相互独立的&#xff0c; 如果需要在页面中导入一些外部依赖的组件&#xff0c;就需要在每一个html文件中都需要导入&#xff0c;非常麻烦 (2).现在的前端…

【Python函数编程实战】:从基础到进阶,打造代码复用利器

文章目录 &#x1f68b;前言&#x1f680;一、认识函数&#x1f308;二、函数定义❤️三、函数调用⭐四、实参与形参&#x1f4a5;1. 形式参数&#x1f6b2;2. 实际参数&#x1f525;1. 位置参数☔2. 关键字参数&#x1f3ac;3. 默认参数&#x1f525;4. 可变数量参数(不定长参…

SpringBoot实现图片添加水印

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

MD5算法详解

哈希函数 是一种将任意输入长度转变为固定输出长度的函数。 一些常见哈希函数有&#xff1a;MD5、SHA1、SHA256。 MD5算法 MD5算法是一种消息摘要算法&#xff0c;用于消息认证。 数据存储方式&#xff1a;小段存储。 数据填充 首先对我们明文数据进行处理&#xff0c;使其…

ARCGIS python 裁剪栅格函数 arcpy.management.Clip

ARCGIS python 裁剪栅格函数 arcpy.management.Clip 1 功能 裁剪掉栅格数据集、镶嵌数据集或图像服务图层的一部分。 2 使用情况 基于模板范围提取部分栅格数据集&#xff0c;输出与模板范围相交的所有像素使用以 x 和 y 坐标的最小值和最大值确定的包络矩形或使用输出范围文…

全国产化飞腾模块BIOS下修复系统启动文件

1、背景介绍 全国产飞腾模块采用麒麟信安操作系统&#xff0c;当系统下面的grub.cfg文件被用户误操作导致无法启动时&#xff0c;可以在BIOS下通过U盘中备份的grub.cfg替换硬盘上原来的grub.cfg文件&#xff0c;从而实现启动。 2、操作步骤 首先进入BIOS命令行模式&#xff…

使用 Rustup 管理 Rust 版本

文章目录 安装 Rustup配置镜像源安装 Rustup 安装 RustVS Code插件创建项目代码示例 Rust 官网&#xff1a;https://www.rust-lang.org/zh-CN/Crates 包管理&#xff1a;https://crates.io/Rust 程序设计语言&#xff1a;https://kaisery.github.io/trpl-zh-cn/通过例子学 Rust…

七人互助拼团模式的深度剖析与互助精神的价值

在当下电商的浪潮中&#xff0c;七人互助拼团模式以其独特的运作方式和互助精神&#xff0c;赢得了广大消费者和商家的青睐。这一模式不仅为用户提供了优惠的购物体验&#xff0c;更在无形中培养了用户间的互助与协作精神。 一、激励机制的细致解读 七人互助拼团模式中&#x…

GPT-4o文科成绩超一本线,理科为何表现不佳?

目录 01 评测榜单 02 实际效果 什么&#xff1f;许多大模型的文科成绩竟然超过了一本线&#xff0c;还是在竞争激烈的河南省&#xff1f; 没错&#xff0c;最近有一项大模型“高考大摸底”评测引起了广泛关注。 河南高考文科今年的一本线是521分&#xff0c;根据这项评测&…

notepad++安装并打开json文件

1、notepad安装 1、首先下载Notepad.exe 2、选择简体中文安装 点击下一步 点击“我接受” 选择安装目录&#xff0c;进行下一步安装 默认下一步 选择安装 等待安装完成 点击完成 2、保存json文件 复制返回结果 先把返回结果复制出来。保存到text里面 把文件另存为json格式 3、…

代码随想录-Day44

322. 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数…

Qt:8.QWidget属性介绍(focuspolicy属性-控件焦点、stylesheet属性-为控件设置样式)

目录 一、focuspolicy属性-控件焦点&#xff1a; 1.1focuspolicy属性介绍&#xff1a; 1.2设置焦点策略——setFocusPolicy()&#xff1a; 1.3获取控件的焦点策略——focusPolicy()&#xff1a; 二、stylesheet属性——为控件设置样式&#xff1a; 2.1 stylesheet属性介绍…

虚拟机网络配置(静态网络)

解决问题&#xff1a;VMware中创建centOS虚拟机后使用ifconfig没有ip地址&#xff0c;但我想在主机&#xff08;Windows&#xff09;系统下使用shell连接虚拟机从而方便后续交互。 VMware中编辑->虚拟网络编辑器 &#xff08;注意需要管理员身份不然会无法修改&#xff09;…

Python容器 之 列表--定义

1.什么是列表呢&#xff1f; 列表(list)是 Python 中使用最频繁的数据类型, 在其他语言中通常叫做数组, 专门用来存储一组数据 列表,list, 使用 [ ] 列表可以存放任意多个数据 列表中可以存放任意类型的数据 列表中数据之间 使用 逗号隔开 2.列表如何定义&#xff1f; &#…

Android Compose 十二:常用组件列表 上拉加载

列表 上拉加载 当前思路 判断 列表最后一个显示的条目 为 数据集合的长度-1 用来记录刷新状态 var refreshing by remember {mutableStateOf(false)}数据集合 val list remember{List(10){"条目》》${it}"}.toMutableStateList()}用来记录列表当前状态及状态变化…

切片的基础知识

文章目录 ● Slice 的底层实现原理&#xff1f;● array 和 Slice 的区别&#xff1f;● 拷贝大切片一定比小切片代价大吗&#xff1f;● Slice 深拷贝和浅拷贝&#xff1f;● 零切片、空切片、nil切片&#xff1f;● Slice 的扩容机制&#xff1f;● Slice 为什么不是线程安全…

HarmonyOS Next开发学习手册——Native XComponent

场景介绍 Native XComponent是XComponent组件提供在Native层的实例&#xff0c;可作为JS层和Native层XComponent绑定的桥梁。XComponent所提供的NDK接口都依赖于该实例。接口能力包括获取Native Window实例、获取XComponent的布局/事件信息、注册XComponent的生命周期回调、注…