您打算使用JavaScript抓取网站吗?借助Node.js平台及其关联的库,您可以使用JavaScript开发Web抓取工具,以从您喜欢的任何网站抓取数据。
在这个时代,企业主要依赖数据,而互联网是巨大的数据源,而文本数据是最重要的。社会和商业研究人员对从网站上收集感兴趣的数据感兴趣。不幸的是,大多数网站都无法使数据科学家轻松地收集所需的数据。因此,研究人员必须使用自动化手段自行收集这些数据。这种自动采集有关使用网页公开访问的数据的装置的网络抓取工具被称为网络刮削。
阅读更多内容,什么是Web Scraping 合法吗?
可以使用图灵完整的任何编程语言来开发Web刮板。Java,PHP,Python,JavaScript,C / C ++和C#等已用于编写Web爬虫。尽管如此,就开发网络抓取工具而言,某些语言比其他语言更受欢迎。JavaScript不是一个流行的选择。近年来,由于Web抓取库的可用性,它作为开发Web抓取工具的语言的受欢迎程度正在上升。在本文中,我将向您展示如何使用JavaScript开发网络抓取工具。
目录
Node.js –改变游戏规则
JavaScript最初是为前端Web开发而开发的,目的是向网页添加交互性和响应性。在浏览器外部,JavaScript无法运行。因此,您不能将其用于后端开发,因为您可以使用Python,Java和C ++之类的东西。然后,这意味着您将需要精通两种语言才能进行前端和后端开发。但是,开发人员认为JavaScript是一种完整的编程语言,因此,不应将其仅限于浏览器环境。
这导致Ryan Dahl开发Node.js。Node.js是基于Chrome V8 JavaScript Engine构建的JavaScript运行时环境。使用Node.js,您可以编写代码并使它们在PC和服务器上运行,就像PHP,Java和Python。现在,这使许多开发人员将JavaScript作为一种认真对待的完整语言-并且为此开发了许多库和框架,以使使用JavaScript的编程后端变得容易。使用Node.js,您现在可以使用一种语言为前端和后端编写代码。
作为JavaScript开发人员,您可以使用JavaScript开发完整的Web抓取工具,并使用Node.js运行它。我将向您展示如何使用JavaScript和一些Node.js库对Web爬虫进行编码。
安装与设置
与每个现代浏览器中都安装的JavaScript运行时不同,您需要安装Node.js才能将其用于开发。您可以从Node.js官方网站安装Node.js – Windows用户的文件大小小于20MB。安装Node.js之后,您可以在命令行中输入以下代码,以查看是否已成功安装。
节点
如果未返回错误消息,则表明节点已成功安装。您也可以通过在已安装程序列表中查找Node.js应用程序来进行确认。安装后,下一步是安装必要的库/模块以进行Web抓取。对于本教程,我建议您在桌面上创建一个新文件夹,并将其命名为Web scraping。然后启动命令提示符(MS-DOS /命令行),并使用以下命令导航到该文件夹。
cd desktop/web scraper
现在,让我们开始安装用于web scraper的Node.js程序包–请勿关闭命令提示符。
- Axios
Axios模块是最重要的Web抓取库之一。它是一个HTTP客户端,就像浏览器一样,它可以发送Web请求并为您获取响应。您将使用它来下载要从中抓取数据的页面。要安装Axios,请使用下面的代码。
npm install axios
- Cheerio
Cheerio是一个轻量级的库,您可以用来收集使用Axios下载的HTML页面的DOM,以收集所需的数据。它的语法类似于jQuery,因此,如果您已经知道如何使用jQuery,那么使用它就不会有问题。使用以下命令进行安装。
npm install request
- Puppeteer
如果您要从静态页面抓取,则上述库将完成工作。但是,当您打算从页面中抓取其内容是动态生成的并且依赖于JavaScript均匀加载时,则Axios不会有用,因为它仅在服务器初始化请求时下载服务器发送给它的内容。对于依赖JavaScript事件加载内容的动态网站,您将需要一个浏览器自动化工具来帮助您控制浏览器,以便加载所有内容,然后可以对其进行抓取。
npm install puppeteer
相关:
- 使用Chrome和专用代理抓取任何网站
- 使用Puppeteer来抓取防止被拦截!
从静态网站抓取
当我们不考虑防爬网系统时,从静态网页进行爬网是最容易的。这是因为,对于静态网页,您只需要使用HTTP客户端(Axios)来请求页面内容,网站的服务器就会以HTML格式发送回响应。然后,您可以使用Cheerio遍历DOM并爬取所需的数据。在下面的示例中,我使用JavaScript从https://example.com/ 爬取h1标签内的文本。在下面的代码中,我使用Axios下载整个页面,然后使用Cheerio收集遍历DOM并在h1标签内抓取文本。
constaxios = require("axios") const cheerio = require("cheerio") async function fetchHTML(url) { const{ data } = await axios.get(url) return cheerio.load(data) } const $ = await fetchHTML("https://example.com") // Print the full HTML console.log(`Site HTML: ${$.html()}\n\n`) // Print some specific page content console.log(`First h1 tag: ${$('h1').text()}`)
搜寻动态网站
动态网站对网页抓取工具提出了严峻的挑战。互联网上的网站最初是作为静态网站开发的,几乎没有互动形式。对于这些网站,当您发送页面请求时,该页面的所有内容都被加载到该页面上,这是Web爬虫最容易抓取的模型。但是,随着动态网站的出现,Internet上的许多页面都无法将其内容加载到那些页面上。一些内容取决于JavaScript事件。如果您冒用这种方式抓取网站,则需要使用Puppeteer。
Puppeteer的作用是控制Chrome浏览器访问网站,触发将加载内容的JavaScript事件,然后在加载内容时,便可以将所需的数据抓取出去。使用Puppeteer您可以做很多事情。在下面的示例中,代码从IMDb抓取了“快速五部”电影的标题和摘要。使用Puppeteer您可以做更多的事情;在此处阅读Puppeteer文档,以了解有关其API和用法的更多信息。
const puppeteer = require("puppeteer"); async function collectData() { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto ("https://www.imdb.com/title/tt1013752/"); const data = await page.evaluate(() => { const title = document.querySelector( "#title-overview-widget >div.vital> div.title_block> div >div.titleBar> div.title_wrapper> h1" ).innerText; const summary = document.querySelector( "#title-overview-widget > div.plot_summary_wrapper>div.plot_summary> div.summary_text" ).innerText; // This object will be stored in the data variable return { title, summary, }; }); await browser.close(); } collectData();
防爬取技术的注意事项
看上面的代码,我没有采用绕过反机器人系统的技术。这是因为该教程是简约的并且是概念证明。实际上,如果您开发自己的Web爬虫程序并且不考虑使用防爬虫系统,则在经过数百次请求后,您的机器人将被阻止。这是因为网站不希望被废弃,因为它不会给网站带来任何价值,而是会增加其运行成本。因此,他们安装了防爬取系统以阻止爬取和其他形式的自动访问。
网站使用的最流行的防爬取技术包括IP跟踪和阻止以及Captcha系统。一些网站还使用Cookie,本地存储和浏览器指纹来防止漫游器流量。因此,我建议您阅读Axion文档,以了解如何使用代理,更改用户代理字符串和其他标头以及旋转它们。有关如何逃避块的更全面的文章,请阅读我们的文章。如何抓取网站,永不被阻止。
结论
随着Node.js的发展,现在所有看不起JavaScript的人都应该知道JavaScript与其他编程语言一样。与过去不同,您现在可以使用JavaScript开发不需要任何浏览器即可运行的Web scraper,它将在Node的帮助下在服务器或本地PC上运行。Node借助JavaScript,Node.js,代理和反Captcha系统,可以随意搜索您喜欢的任何网站。