java爬虫抓取网页数据(分布式网络新闻抓取系统的设计与实现(一)-上海怡健医学)
优采云 发布时间: 2022-04-01 14:26java爬虫抓取网页数据(分布式网络新闻抓取系统的设计与实现(一)-上海怡健医学)
1 项目介绍
本项目的主要内容是分布式网络新闻抓取系统的设计与实现。主要有以下几个部分要介绍:
(1)深入分析网络新闻爬虫特点,设计分布式网络新闻爬虫系统爬取策略、爬取领域、动态网络爬取方式、分布式结构、系统监控和数据存储六大关键功能。
(2)结合程序代码分解讲解分布式网络新闻爬虫系统的实现过程。包括爬虫编写、爬虫规避、动态网页数据爬取、分布式爬虫部署、系统监控,共六个内容,结合腾讯新闻数据的实际针对性抓取,通过测试来测试系统性能。
(3)规划设计了一个数据处理模块,包括数据清洗、代码转换、数据分类、对象添加等功能。
2. 分布式网络新闻抓取系统设计
2.1 整体系统架构设计
系统采用分布式主从结构,一台Master服务器和多台Slave服务器。Master 管理 Redis 数据库并分发下载任务。Slave 部署 Scrapy 抓取网页,解析提取项目数据。服务器的基本环境是Ubuntu操作系统,Master服务器安装Redis数据库服务器和Graphite,
Slave 安装 Scrapy 和 Redis 客户端。系统按功能可分为两大模块,一是数据采集模块,二是数据处理模块。数据抓取模块包括浏览器调用、网页下载、字段提取、爬虫规避、数据存储和系统监控六大功能;数据处理模块包括数据清洗、对象添加、编码转换和数据分类四个功能。
2.2 爬取策略设计
本项目的网络爬虫采用深度优先的爬取策略,根据设置下载网页数据。网页链接处理流程如下:
1.手动设置初始下载地址,一般是网站导航地址。
2.爬虫开始运行,从初始地址抓取第一个网页链接。
3、爬虫根据正则表达式识别新链接中的目录页地址和新闻内容页地址,将识别出的新地址加入待下载队列,等待被爬取,无法识别的网页地址为定义为无用的链接并丢弃。
4.爬虫依次取出要下载的网页链接,从待下载队列中提取数据。
5、下载队列为空,爬虫停止爬取。
新闻网站的导航页数是有限的,这个规则决定了新闻导航页的url在一定的人工参与下很容易获得,并作为爬虫系统的初始url。
2.3 爬取字段的设计
本项目的目的是捕捉网络新闻数据,因此内容必须能够客观、准确地反映网络新闻的特点。
以腾讯在线新闻数据的爬取为例,通过分析网页结构,确定了两步爬取步骤。第一步,抓取新闻内容页,获取新闻标题、新闻来源、新闻内容、发表时间、评论数、评论地址、相关搜索、用户仍喜欢的新闻、点赞数等9项内容;第二步,在获取评论地址后,抓取评论页面,获取评论者ID、评论者昵称、评论者性别、评论者所在地区、评论时间、评论内容、单条评论支持人数、回复数一条评论。
2.4 动态网页抓取方法设计
腾讯新闻网页使用Java生成动态网页内容。一些 JS 事件触发页面内容在打开时会发生变化,而一些网页在没有 JS 支持的情况下根本无法工作。普通爬虫根本无法从这些页面获取数据。解决Java动态网页爬取问题的方法有四种:
1、编写代码模拟相关的JS逻辑。
2. 调用带有界面的浏览器,类似于那些广泛用于测试的浏览器,例如 Selenium。
3、使用无界面浏览器,各种基于Webkit的,如Casperjs、Phantomjs等。
4.结合JS执行引擎,实现轻量级浏览器。
由于本项目是基于Python作为主要语言编写的,所以使用Selenium来处理JS
动态新闻页面。它的优点是简单和易于实施。使用Python代码模拟用户对浏览器的操作,首先将网页加载到浏览器中打开,然后从浏览器缓存中获取网页数据,传递给spider进行解析提取,最后将目标数据传递给项目频道。
2.5 爬虫分布式设计
使用Redis数据库实现分布式爬取。基本思路是Scrapy爬虫获取到的urls(request)
都放在一个 Redis Queue 中,所有爬虫也从指定的 Redis Queue 中获取请求(url)。
Scrapy-Redis 默认使用 Spider Priority Queue 来确定 url 的顺序,由 sorted set 决定
实现了非 FIFO 和 LIFO 方法。
Redis 存储了 Scrapy 项目的 request 和 stats 信息,根据这些信息可以掌握任务
情况和爬虫状态,在分配任务时很容易平衡系统负载,有助于克服爬虫的性能瓶颈。同时
利用 Redis 的高性能和易扩展性,可以轻松实现高效下载。当 Redis 存储或
当访问速度遇到问题时,可以通过增加 Redis 集群和爬虫集群的数量来提高。Scrapy-Redis
分布式解决方案解决了间歇性爬取和重复数据删除的问题。爬虫重启后会和Redis进行比较。
抓取队列中的url,已经抓取的url会被自动过滤掉。
2.6 基于Graphite系统的监控组件设计
使用Graphite监控系统运行状态,实现了一个分布式系统的statscollector,
系统的统计信息以图表的形式实时动态显示,即实时监控。Graphite监控的信息包括:系统下载信息、日志信息、文件数、调度信息、爬虫运行信息、爬虫异常信息、文件数、获取的项目数、最大请求深度、收到的响应数。
2.7 数据存储模块设计
Scrapy 支持 json、csv 和 xml 等文本格式的数据存储。用户可以在运行爬虫时设置,例如:scrapy crawlspider –o items.json –t json,或者在Scrapy项目文件的Item Pipeline中
在文件中定义。除此之外,Scrapy 还提供了多种数据库 API 来支持数据库存储。比如 MongoDB,
雷迪斯等人。数据存储分为两部分,一是网页链接的存储,二是项目数据的存储。网络链接存储
存储在Redis数据库中,用于实现分布式爬虫的下载管理;项目数据包括新闻数据和评论数据,以JSON格式保存为文本文件,方便处理。评论数据以评论url中收录的评论ID命名存储,这是一种将新闻数据与评论数据相关联的方式。
3 项目总结