码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • #笔记# 写给自己用的小爬虫


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

    一、基本思路

    明确数据来源。基于前述目标,确定数据源为文化和旅游部管理部门官网,比如各省厅网站、各副省级城市网站,文化和旅游管理部门直属单位网站,中国文化报电子版,中国旅游报电子版等,目前大约有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 模拟浏览器打开相应网站,获取链接后,全部保存为本地文件;然后进一步梳理存入数据库。

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

    1. def grasp_all_a(url, driver):
    2. assert(driver)
    3. driver.get(url)
    4. print("\033[1;31;40m looking {}... \033[0m".format(url))
    5.     try:
    6. # 等待网页打开15秒,直至可以定位到标签。
    7. WebDriverWait(driver, 15).until(EC.visibility_of_element_located((By.TAG_NAME,'a')))
    8. except:
    9. print("timeout")
    10.     # 获取网页上所有的标签。
    11. a_tags = driver.find_elements(By.TAG_NAME, "a")
    12.     #逐个分析标签,并分别处理。
    13. filename = get_filename(url).rstrip('/')
    14. with open("./province_level_cities/" + filename+".txt", 'w', encoding='utf-8') as f:
    15. for tag in a_tags:
    16. title = tag.get_attribute('title').replace('\n','').strip(' ')
    17. href = tag.get_attribute('href')
    18.             if title and href:
    19. if filename not in href:
    20.                 continue
    21. elif 'javascript' not in href:
    22. f.write(title + "\t" + href + "\n" )
    23. elif href:
    24. if 'javascript' in href:
    25.                     continue
    26. else:
    27. f.write(tag.text.replace('\n','').strip(" ") + "\t" + href + "\n" )
    28. driver.quit()

    实现逻辑分三步:

    1. 准备工作。

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

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

    (二)网页避坑设置

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

    1. def ready_to_grasp():
    2.     path = r"d:\\webdriver\\msedgedriver.exe"
    3.     if os.path.exists(path):
    4.         sys.path.append(path)
    5.     else:
    6.         print("Please install webdriver first.\n")
    7.         exit(-1)
    8. options = Options()
    9.     options.add_argument('headless')
    10.     options.add_argument('disable-gpu')
    11.     options.add_argument('no-sandbox')
    12.     options.add_argument('incognito')
    13. options.add_argument("disable-blink-features=AutomationControlled")
    14.     options.binary_location = r"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe"
    15.     driver = webdriver.Edge(options=options)
    16.     driver.execute_cdp_cmd('Network.setUserAgentOverride', \
    17.             {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
    18.             AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 \
    19.                 Safari/537.36 Edg/119.0.0.0'
    20. })
    21.     return driver

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

    (三)网页展示

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

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

    图片

    (最终网页效果)

    五、结语

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

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

  • 相关阅读:
    unittest自动化测试框架讲解以及实战
    vue目录树的封装
    基于Spring Boot框架的员工管理系统(实现增删改查功能——项目整体流程超详细)
    任正非:天空足够大,世界会越来越兴盛
    安科瑞无线计量模块AEW100指导性技术要求-Susie 周
    MyBatis
    近似串匹配问题(动态规划)
    【数据结构】排序合集(万字详解)
    ES 11 新特性
    Spring事务的概念(四大特性)
  • 原文地址:https://blog.csdn.net/u011617563/article/details/140111937
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号