Home >Web Front-end >JS Tutorial >Web Scraping in Node.js
Core points
cheerio
and request
. cheerio
module implements a subset of jQuery that can build and parse DOM from HTML strings, but it can be difficult to deal with poorly structured HTML. request
and cheerio
can create a complete web crawler to extract specific elements of a web page, but handling dynamic content, avoiding bans, and handling websites that require login or use CAPTCHA will be more complicated and may require Additional tools or strategies. The web crawler is software programmatically accessing web pages and extracting data from them. Due to issues such as duplication of content, web crawling is a somewhat controversial topic. Most website owners prefer to access their data through publicly available APIs. Unfortunately, many websites offer poor API quality and even no API at all. This forced many developers to turn to web crawling. This article will teach you how to implement your own web crawler in Node.js. The first step in web crawling is to download the source code from the remote server. In "Making HTTP Requests in Node.js", readers learned how to use the request
module download page. The following example quickly reviews how to make a GET request in Node.js.
<code class="language-javascript">var request = require("request"); request({ uri: "http://www.sitepoint.com", }, function(error, response, body) { console.log(body); });</code>
The second step in web crawling, which is also a more difficult step, is to extract data from the downloaded source code. On the client side, this task can be easily accomplished using libraries such as selector API or jQuery. Unfortunately, these solutions rely on assumptions that DOM can be queried. Unfortunately, Node.js does not provide DOM. Or is there any?
Cheerio module
While Node.js does not have a built-in DOM, there are some modules that can build DOM from HTML source code strings. Two popular DOM modules are cheerio
and jsdom
. This article focuses on cheerio
, which can be installed using the following command:
<code class="language-bash">npm install cheerio</code>The
cheerio
module implements a subset of jQuery, which means many developers can get started quickly. In fact, cheerio
is very similar to jQuery, and it's easy to find yourself trying to use the unimplemented jQuery function in cheerio
. The following example shows how to parse HTML strings using cheerio
. The first line will import cheerio
into the program. html
Variable saves the HTML fragment to be parsed. On line 3, parse HTML using cheerio
. The result is assigned to the $
variable. The dollar sign was chosen because it was traditionally used in jQuery. Line 4 uses the CSS style selector to select the <code><ul></ul>
element. Finally, use the html()
method to print the internal HTML of the list.
<code class="language-javascript">var request = require("request"); request({ uri: "http://www.sitepoint.com", }, function(error, response, body) { console.log(body); });</code>
cheerio
is under active development and is constantly improving. However, it still has some limitations. cheerio
The most frustrating aspect is the HTML parser. HTML parsing is a difficult problem, and there are many web pages that contain bad HTML. While cheerio
won't crash on these pages, you may find yourself unable to select elements. This makes it difficult to determine whether the error is your selector or the page itself.
Crawl JSPro
The following example combines request
and cheerio
to build a complete web crawler. This sample crawler extracts the title and URL of all articles on the JSPro homepage. The first two lines import the required module into the example. Download the source code of the JSPro homepage from lines 3 to 5. Then pass the source code to cheerio
for parsing.
<code class="language-bash">npm install cheerio</code>
If you look at the JSPro source code, you will notice that each post title is a link contained in the entry-title
element with class <a></a>
. The selector in line 7 selects all article links. Then use the each()
function to iterate through all articles. Finally, the article title and URL are obtained from the link's text and href
properties, respectively.
Conclusion
This article shows you how to create a simple web crawler in Node.js. Note that this is not the only way to crawl a web page. There are other technologies, such as using headless browsers, which are more powerful but may affect simplicity and/or speed. Please follow up on upcoming articles about PhantomJS headless browser.
Node.js Web Crawling FAQ (FAQ)
Handling dynamic content in Node.js can be a bit tricky because the content is loaded asynchronously. You can use a library like Puppeteer, which is a Node.js library that provides a high-level API to control Chrome or Chromium through the DevTools protocol. Puppeteer runs in headless mode by default, but can be configured to run full (non-headless) Chrome or Chromium. This allows you to crawl dynamic content by simulating user interactions.
If the website detects abnormal traffic, web crawling can sometimes cause your IP to be banned. To avoid this, you can use techniques such as rotating your IP address, using delays, and even using a crawling API that automatically handles these issues.
To crawl data from the website you need to log in, you can use Puppeteer. Puppeteer can simulate the login process by filling in the login form and submitting it. Once logged in, you can navigate to the page you want and crawl the data.
After crawling the data, you can use the database client of the database of your choice. For example, if you are using MongoDB, you can use the MongoDB Node.js client to connect to your database and save the data.
To crawl data from a website with paging, you can use a loop to browse the page. In each iteration, you can crawl data from the current page and click the Next Page button to navigate to the next page.
To crawl data from a website with infinite scrolling, you can use Puppeteer to simulate scrolling down. You can use a loop to scroll down continuously until new data is no longer loaded.
Error handling is crucial in web crawling. You can use the try-catch block to handle errors. In the catch block, you can log error messages, which will help you debug the problem.
To crawl data from a website that uses AJAX, you can use Puppeteer. Puppeteer can wait for the AJAX call to complete and then grab the data.
To speed up web crawling, you can use techniques such as parallel processing to open multiple pages in different tabs and grab data from them at the same time. However, be careful not to overload the website with too many requests as this may cause your IP to be banned.
Crawling data from websites using CAPTCHA can be challenging. You can use services like 2Captcha, which provide an API to resolve CAPTCHA. However, remember that in some cases, this can be illegal or immoral. Always respect the terms of service of the website.
The above is the detailed content of Web Scraping in Node.js. For more information, please follow other related articles on the PHP Chinese website!