• 爬虫(1)


    前段时间,结合日常需要,写了一个小的爬虫项目。这里稍作小结一下。

    关于数据来源

    信息在哪里?一个地区重要的文化工作,最终都会在该地区文化部门官方网站发布相关信息。

    对某个具体使用者来说,并不需要知道网站发布的所有信息。举个例子,自己只对公共文化服务相关信息有兴趣,网站中的其他信息,如文化市场、非物质文化遗产、旅游、文物保护等,对自己来说就不是关注对象。

    如何只看自己想看的信息?这可以从查找信息的过程中找出方法。假设,想了解16个市在公共文化服务方面的信息,会怎么做?首先,会打开省文化和旅游厅相关栏目看当前发布的信息;然后,逐个打开每个市网站相关栏目查看。可见,查找信息是一个重复的过程。

    一般情况下,涉及重复的过程,大多可以实现自动化。我们的爬虫就是将这个过程自动化。目前,已经初步实现的功能有:

    (1)从15个市级文化管理部门网站的指定栏目,自动抓取新闻消息的标题、链接、日期。【这里为什么是15个市?因为合肥市局网站信息比较难抓。百度搜索实现了针对该网站的信息抓取,必应搜索、搜狗搜索等未实现。】

    (2)将收集到的信息,保存成数据文件,并据此生成网页。

    (3)将生成的网页,利用微信发给指定朋友或自己,这里也可以使用linux下的mail程序,发送到指定邮箱。

    关于总体设计

    实际上,这个项目一开始时,自己并没有非常明确的总体设计,现在看到目录结构,是在基本功能完成以后逐渐整理得来的,编写时随意性较大,基本是想到什么功能就写到哪里,发现不对时,就对代码进行重构。

    ├── city_lv
    │   ├── __init__.py
    │   ├── luanweb.py
    │   ├── maanshanweb.py
    │   └── xuanchengweb.py
    ├── county_lv
    │   ├── changfengweb.py
    │   └── __init__.py
    ├── libraries
    │   ├── ahslibweb.py
    │   └── __init__.py
    ├── LICENSE
    ├── province_lv
    │   ├── anhuiweb.py
    │   └── __init__.py
    ├── README.md
    ├── templates
    │   ├── base.html
    ├── tests
    │   ├── index.html
    │   ├── msg.txt
    │   ├── send_msg.py
    │   ├── send.sh
    │   ├── test.py
    │   └── txt2html.py
    └── utils
        └── webmonkey.py
    

    虽然没有什么明确应该是什么样的,但对项目的核心功能相对清楚,就是从各个文化机构的网站抓取信息。

    具体实现时,每个数据源对应一个独立的爬虫程序,然后在一个总的调度程序中循环调用。

    关于爬虫框架

    这里没有使用现成的爬虫框架,如scrapy,只是针对需求,封装了一个非常简单的类。

    为了减少程序中的重复代码,在编写过程中,经过几次重构,自己封装了一个类webmonkey.py,用于处理抓取时一些共同操作,包括打开网站、返回一个包括网站源码的响应对象、显示抓取到的信息等。

    针对每个具体网站,编写了Web类,继承自通用类webmonkey。在其基础上,改动网站url和网页信息提取规则。

    关于数据保存

    程序中没有实现数据保存的功能,而是利用操作系统提供的管道(“|”)命令,将程序输出到本地文件进行保存。

    在数据量比较小的情况下,或用于演示时,用这种方法还可以。如果考虑长期运行,肯定需要使用数据库。但是,这个问题不是很大,自己在另外一个小项目中已经封装过一个sqlite3的类,需要时可以拿过来改改。

    关于数据展示

    为了展示抓取信息,写了一个网页生成的模块txt2html.py。基本的想法是,先写一个网页模板,然后在这个模板基础上,将抓取的信息写入网页文件。另外,还写了一个模块,可以将HTML文件通过微信发送给自己。

    未解决问题

    现在还有几个问题没有解决。第一,第一条信息问题。部分站点同一天会更新多条信息,目前只是抓取各网站相应栏目的第一条信息。第二,接着第一个问题而来的是数据量大了之后的数据存储问题。第三,网页设计问题。第四,通用性问题。

    使用方法

    git clone http://github.com/luckyele/socnews.git

    cd socnews/tests/

    1. python test.py > msg.txt

    2. python txt2html.py

  • 相关阅读:
    ASM instance正常启动,但是用sqlplus 连不上的问题
    Ubuntu环境下,项目出现:Call to undefined function curl_init() 提示
    linux安装curl扩展
    https请求排错过程
    php-fpm.conf文件的位置在哪里
    如何查找php-fpm监听的端口
    laravel AppKernel.php中的middleware、middlewareGroups、routeMiddleware
    laravel项目数据库交互逻辑
    Laravel中APP_KEY起什么作用
    php 出现Warning: A non-numeric value encountered问题的原因及解决方法
  • 原文地址:https://www.cnblogs.com/py520ziyi/p/10556044.html
Copyright © 2020-2023  润新知