我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么用TypeScript开发爬虫程序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么用TypeScript开发爬虫程序

这篇文章主要介绍“怎么用TypeScript开发爬虫程序”,在日常操作中,相信很多人在怎么用TypeScript开发爬虫程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用TypeScript开发爬虫程序”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

全局安装typescript:

npm install -g typescript

目前版本2.0.3,这个版本不再需要使用typings命令了。但是vscode捆绑的版本是1.8的,需要一些配置工作,看本文的处理办法。

测试tsc命令:

tsc

创建要写的程序项目文件夹:

mkdir test-typescript-spider

进入该文件夹:

cd test-typescript-spider

初始化项目:

npm init

安装superagent和cheerio模块:

npm i --save superagent cheerio

安装对应的类型声明模块:

npm i -s @types/superagent --save  npm i -s @types/cheerio --save

安装项目内的typescript(必须走这一步):

npm i --save typescript

用vscode打开项目文件夹。在该文件夹下创建tsconfig.json文件,并复制以下配置代码进去:

{     "compilerOptions": {         "target": "ES6",         "module": "commonjs",         "noEmitOnError": true,         "noImplicitAny": true,         "experimentalDecorators": true,         "sourceMap": false,      // "sourceRoot": "./",         "outDir": "./out"     },     "exclude": [         "node_modules"     ] }

在vscode打开“文件”-“***项”-“工作区设置”在settings.json中加入(如果不做这个配置,vscode会在打开项目的时候提示选择哪个版本的typescript):

{    "typescript.tsdk": "node_modules/typescript/lib" }

创建api.ts文件,复制以下代码进去:

import superagent = require('superagent'); import cheerio = require('cheerio');  export const remote_get = function(url: string) {      const promise = new Promise<superagent.Response>(function (resolve, reject) {         superagent.get(url)             .end(function (err, res) {                 if (!err) {                     resolve(res);                 } else {                     console.log(err)                     reject(err);                 }             });     });     return promise; }

创建app.ts文件,书写测试代码:

import api = require('./api'); const go = async () => {     let res = await api.remote_get('http://www.baidu.com/');     console.log(res.text); } go();

执行命令:

tsc

然后:

node out/app

观察输出是否正确。

现在尝试抓取http://cnodejs.org/的***页文章链接。

修改app.ts文件,代码如下:

import api = require('./api'); import cheerio = require('cheerio');  const go = async () => {     const res = await api.remote_get('http://cnodejs.org/');     const $ = cheerio.load(res.text);     let urls: string[] = [];     let titles: string[] = [];     $('.topic_title_wrapper').each((index, element) => {         titles.push($(element).find('.topic_title').first().text().trim());         urls.push('http://cnodejs.org/' + $(element).find('.topic_title').first().attr('href'));     })     console.log(titles, urls); } go();

观察输出,文章的标题和链接都已获取到了。

现在尝试深入抓取文章内容

import api = require('./api'); import cheerio = require('cheerio');  const go = async () => {     const res = await api.remote_get('http://cnodejs.org/');     const $ = cheerio.load(res.text);     $('.topic_title_wrapper').each(async (index, element) => {         let url = ('http://cnodejs.org' + $(element).find('.topic_title').first().attr('href'));         const res_content = await api.remote_get(url);         const $_content = cheerio.load(res_content.text);         console.log($_content('.topic_content').first().text());     })  } go();

可以发现因为访问服务器太迅猛,导致出现很多次503错误。

解决:

添加helper.ts文件:

export const wait_seconds = function (senconds: number) {     return new Promise(resolve => setTimeout(resolve, senconds * 1000)); }

修改api.ts文件为:

import superagent = require('superagent'); import cheerio = require('cheerio');  export const get_index_urls = function () {     const res = await remote_get('http://cnodejs.org/');     const $ = cheerio.load(res.text);     let urls: string[] = [];     $('.topic_title_wrapper').each(async (index, element) => {         urls.push('http://cnodejs.org' + $(element).find('.topic_title').first().attr('href'));     });     return urls; } export const get_content = async function (url: string) {     const res = await remote_get(url);     const $ = cheerio.load(res.text);     return $('.topic_content').first().text(); }  export const remote_get = function (url: string) {      const promise = new Promise<superagent.Response>(function (resolve, reject) {          superagent.get(url)             .end(function (err, res) {                 if (!err) {                     resolve(res);                 } else {                     console.log(err)                     reject(err);                 }             });     });     return promise; }

修改app.ts文件为:

import api = require('./api'); import helper = require('./helper'); import cheerio = require('cheerio');  const go = async () => {     let urls = await api.get_index_urls();     for (let i = 0; i < urls.length; i++) {         await helper.wait_seconds(1);         let text = await api.get_content(urls[i]);         console.log(text);     } } go();

观察输出可以看到,程序实现了隔一秒再请求下一个内容页。

现在尝试把抓取到的东西存到数据库中。安装mongoose模块:

npm i mongoose --save npm i -s @types/mongoose --save

然后建立Scheme。先创建models文件夹:

mkdir models

在models文件夹下创建index.ts:

import * as mongoose from 'mongoose';  mongoose.connect('mongodb://127.0.0.1/cnodejs_data', {     server: { poolSize: 20 } }, function (err) {     if (err) {         process.exit(1);     } });  // models export const Article = require('./article');

在models文件夹下创建IArticle.ts:

interface IArticle {     title: String;     url: String;     text: String; } export = IArticle;

在models文件夹下创建Article.ts:

import mongoose = require('mongoose'); import IArticle = require('./IArticle'); interface IArticleModel extends IArticle, mongoose.Document { }  const ArticleSchema = new mongoose.Schema({     title: { type: String },     url: { type: String },     text: { type: String }, });  const Article = mongoose.model<IArticleModel>("Article", ArticleSchema); export = Article;

修改api.ts为:

import superagent = require('superagent'); import cheerio = require('cheerio'); import models = require('./models'); const Article = models.Article;  export const get_index_urls = async function () {     const res = await remote_get('http://cnodejs.org/');      const $ = cheerio.load(res.text);     let urls: string[] = [];     $('.topic_title_wrapper').each((index, element) => {         urls.push('http://cnodejs.org' + $(element).find('.topic_title').first().attr('href'));     });     return urls;  } export const fetch_content = async function (url: string) {     const res = await remote_get(url);      const $ = cheerio.load(res.text);     let article = new Article();     article.text = $('.topic_content').first().text();     article.title = $('.topic_full_title').first().text().replace('置顶', '').replace('精华', '').trim();     article.url = url;     console.log('获取成功:' + article.title);     article.save();  } export const remote_get = function (url: string) {      return new Promise<superagent.Response>((resolve, reject) => {         superagent.get(url)             .end(function (err, res) {                 if (!err) {                     resolve(res);                 } else {                     reject(err);                 }             });     }); }

修改app.ts为:

import api = require('./api'); import helper = require('./helper'); import cheerio = require('cheerio');  (async () => {      try {         let urls = await api.get_index_urls();         for (let i = 0; i < urls.length; i++) {             await helper.wait_seconds(1);             await api.fetch_content(urls[i]);         }     } catch (err) {         console.log(err);     }      console.log('完毕!');  })();

执行

tsc node out/app

观察输出,并去数据库检查一下可以发现入库成功了!

补充:remote_get方法的改进版,实现错误重试和加入代理服务器.放弃了superagent库,用的request库,仅供参考:

//config.retries = 3; let current_retry = config.retries || 0; export const remote_get = async function (url: string, proxy?: string) {     //每次请求都先稍等一下     await wait_seconds(2);     if (!proxy) {         proxy = '';     }     const promise = new Promise<string>(function (resolve, reject) {         console.log('get: ' + url + ',  using proxy: ' + proxy);         let options: request.CoreOptions = {             headers: {                 'Cookie': '',                 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',                 'Referer': 'https://www.baidu.com/'             },             encoding: 'utf-8',             method: 'GET',             proxy: proxy,             timeout: 3000,         }         request(url, options, async function (err, response, body) {             console.log('got:' + url);             if (!err) {                 body = body.toString();                 current_retry = config.retries || 0;                 console.log('bytes:' + body.length);                 resolve(body);             } else {                 console.log(err);                 if (current_retry <= 0) {                     current_retry = config.retries || 0;                     reject(err);                 } else {                     console.log('retry...(' + current_retry + ')')                     current_retry--;                     try {                         let body = await remote_get(url, proxy);                         resolve(body);                     } catch (e) {                         reject(e);                     }                 }             }         });     });     return promise; }

另外,IArticle.ts和Article.ts合并为一个文件,可能更好,可以参考我另一个model的写法:

import mongoose = require('mongoose');  interface IProxyModel {     uri: string;     ip: string;     port:string;     info:string; } export interface IProxy extends IProxyModel, mongoose.Document { }  const ProxySchema = new mongoose.Schema({     uri: { type: String },//     ip: { type: String },//     port: { type: String },//     info: { type: String },// }); export const Proxy = mongoose.model<IProxy>("Proxy", ProxySchema);

导入的时候这么写就行了:

import { IProxy, Proxy } from './models';

其中Proxy可以用来做new、find、where之类的操作:

let x = new Proxy(); let xx = await Proxy.find({}); let xxx = await Proxy.where('aaa',123).exec();

而IProxy用于实体对象的传递,例如

function xxx(p:IProxy){ }

到此,关于“怎么用TypeScript开发爬虫程序”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么用TypeScript开发爬虫程序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

小程序开发(一):使用scrapy爬虫

过完年回来,业余时间一直在独立开发一个小程序。主要数据是8000+个视频和10000+篇文章,并且数据会每天自动更新。我会整理下整个开发过程中遇到的问题和一些细节问题,因为内容会比较多,我会分成三到四篇文章来进行,本文是该系列的第一篇文章,
2023-01-31

c#怎么实现爬虫程序

这篇文章主要介绍了c#怎么实现爬虫程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c#怎么实现爬虫程序文章都会有所收获,下面我们一起来看看吧。图1如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻
2023-06-29

go语言怎么进行爬虫开发

go语言进行爬虫开发步骤如下:1、选择合适的库,如GoQuery、Colly、PuerkitoBio和Gocolly等;2、选择合适的库,并获取到返回的响应数据;3、解析HTML,从网页中提取所需的信息;4、并发处理,极大地提高爬取效率;5
go语言怎么进行爬虫开发
2023-12-13

Python中怎么对爬虫程序进行配置

这篇文章主要介绍Python中怎么对爬虫程序进行配置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和floa
2023-06-14

Web应用开发TypeScript怎么使用

这篇文章主要介绍“Web应用开发TypeScript怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Web应用开发TypeScript怎么使用”文章能帮助大家解决问题。一、什么是 TypeSc
2023-06-30

python怎么开发应用程序

这篇文章给大家分享的是有关python怎么开发应用程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用
2023-06-14

怎么使用Python3多线程处理爬虫

本文小编为大家详细介绍“怎么使用Python3多线程处理爬虫”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python3多线程处理爬虫”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。多线程到底什么是多线程
2023-07-05

React应用程序怎么配置TypeScript

本篇内容主要讲解“React应用程序怎么配置TypeScript”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React应用程序怎么配置TypeScript”吧!React 是一个用于构建用户界
2023-06-16

怎么使用uniapp开发小程序

要使用uniapp开发小程序,你可以按照以下步骤进行操作:首先,安装uni-app开发工具,官方提供了uni-app的开发工具,你可以去uni-app官网下载并安装。创建一个新的uni-app项目,可以选择使用Vue.js或者原生小程序组件
怎么使用uniapp开发小程序
2024-04-09

怎么用Taro+Vue3开发小程序

这篇文章主要介绍了怎么用Taro+Vue3开发小程序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。微信小程序是以微信为运行环境的一种应用,其实质是 Hybrid 技术的应用,
2023-06-26

小程序开发的selectorQuery怎么用

今天小编给大家分享一下小程序开发的selectorQuery怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。select
2023-06-26

golang中怎么利用chromedp爬虫打开新标签页

本篇文章给大家分享的是有关golang中怎么利用chromedp爬虫打开新标签页,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用chromedp爬虫时,如果点击属性为targ
2023-06-19

在Python爬虫过程中怎么使用代理IP

这篇文章主要介绍了在Python爬虫过程中怎么使用代理IP,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python是什么意思Python是一种跨平台的、具有解释性、编译性、
2023-06-14

小程序开发中animation怎么使用

这篇文章主要介绍“小程序开发中animation怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“小程序开发中animation怎么使用”文章能帮助大家解决问题。动画实例可以调用以下方法来描述动
2023-06-26

编程热搜

目录