抓取网页新闻(网上接到一个一个开发新闻抓取接口的项目介绍及应用)

优采云 发布时间: 2021-12-17 02:09

  抓取网页新闻(网上接到一个一个开发新闻抓取接口的项目介绍及应用)

  半个月前,我接到了一个来自互联网的开发新闻爬取界面的项目。

  客户需求是让用户可以在任何他能看到的手机app中采集文章,获取文章地址,将文章地址提交给客户平台,文章@ > 标题、摘要、正文和图片保存到对方的数据库中。有一款叫手趣的app,可以让用户将自己感兴趣的文章复制粘贴到app中。文章 自动捕获并以常规格式显示在客户端。客户端正在计划开发类似的功能,希望该应用能够兼容主流媒体的新闻抓取,包括新浪新闻、今日头条、微信公众号等。

  申请过程并不复杂。用户从前端提交要抓取的URL到服务器。服务器根据URL域名匹配对应的爬虫,解析下载的HTML,并以固定格式存入数据库。服务端最终将爬取结果以JSON格式返回给客户端。

  一个完整的爬虫包括四个模块:页面请求、任务调度、页面分析和数据存储。另外,如果需要考虑爬虫爬行效率、反爬行能力等因素,还需要添加一些高级模块,比如多线程和协程实现高并发,添加代理池防止爬行网站 阻止 IP 。如果运气不好,需要爬取的内容需要用户登录才能获取,则必须模拟用户登录。另外,由于大部分网站使用js来渲染页面,所以需要考虑使用分析数据接口或者模拟浏览器来获取这些动态内容。

  分析了这个项目需要抓取的新闻网站,发现除了腾讯新闻外,都是用js来渲染html页面的。因此,不能像请求静态页面那样直接请求 URL 来获取 HTML。为方便起见,我使用了 casperjs。Casperjs是一个基于phantomjs的工具,比phantomjs有更方便的API。为了统一编程语言,我使用nodejs开发爬虫。

  在项目中添加casperjsRequest.js文件,相当于项目中的下载模块,可以通过nodejs中的child_process.spawn调用。

  var casper = require('casper').create({

pageSettings: {

loadImages: false, // The WebPage instance used by Casper will

loadPlugins: false // use these settings

}

});

var config = require('../config');

var url = casper.cli.args[0];

console.log(casper.cli.args);

casper.userAgent(config.REQUEST_USER_AGENT);

casper.options.waitTimeout = config.CASPERJS_WAIT_TIMEOUT;

casper.options.timeout = config.CASPERJS_TIMEOUT;

casper.start(url, function () {

this.echo(this.getPageContent());

});

casper.run();

  将需要的URL作为命令行参数传递给casperjsRequest.js,可以在stdout中获取收录动态内容的页面的HTML,在bash中执行如下命令

  casperjs ./bin/casperjsRequest.js

  除了百度文库需要分页才能获取完整的文章外,其他新闻网站的字段内容都遵循一定的规则。因此,以配置文件的形式编辑不同网站的内容选择器,以方便扩展。每个配置文件代表一个网站的爬虫,所以如果有新的网站需要爬取,生成一个类似的配置文件即可。比如今日头条的配置如下

  其中,配置文件定义了爬虫域名和内容选择器。此外,它还定义了页面下载的方式。1代表用casperjs请求动态内容,2(默认)代表直接请求静态html,3代表编码请求。

  每个URL对应一个域名,即不同的新闻网站,单个新闻网站也分为PC端和移动端,它们的域名不同。当使用 PC URL 请求时,服务器将重定向到移动 URL。而且,今日头条有多个域名。因此,为了保证请求的PC端和手机端的URL一致,我使用了正则表达式来做域爬虫映射。配置文件如下

  module.exports = {

// 百度百家号

"baijiahao.baidu.com": "baidu",

// 百度文库

"wk.baidu.com": "baiduwenku",

// 网易新闻

"(?:3g|news).163.com": "netease",

// 腾讯新闻

"(?:xw|news).qq.com": "tencent",

// 今日头条

".*toutiao(?:\d+)?.com|m.pstatp.com": "toutiao",

// 微信公众号文章

"mp.weixin.qq.com": "weixin",

// 新浪新闻

"sina.(?:cn|com)": "sina",

// 通用爬虫

".*": "generic"

};

  下一步就是编写爬虫分析逻辑和数据存储。

  (待续,待续)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线