<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: iankalvin</title>
    <description>The latest articles on DEV Community by iankalvin (@iankalvin).</description>
    <link>https://dev.to/iankalvin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F472701%2F110a4d7b-8723-45a2-a6dc-b20140ae1fad.JPG</url>
      <title>DEV Community: iankalvin</title>
      <link>https://dev.to/iankalvin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iankalvin"/>
    <language>en</language>
    <item>
      <title>Scraping Facebook groups using Python? Avoid getting blocked with Crawlbase</title>
      <dc:creator>iankalvin</dc:creator>
      <pubDate>Fri, 13 Nov 2020 11:56:03 +0000</pubDate>
      <link>https://dev.to/iankalvin/scraping-facebook-groups-using-python-avoid-getting-blocked-with-proxycrawl-456a</link>
      <guid>https://dev.to/iankalvin/scraping-facebook-groups-using-python-avoid-getting-blocked-with-proxycrawl-456a</guid>
      <description>&lt;p&gt;&lt;strong&gt;Scraping Facebook&lt;/strong&gt; may sound easy at first, but I've tried several times crawling and scraping different Facebook groups and ended up getting errors and CAPTCHAs most of the time, or worst, banned. For a beginner like me, this is frustrating and could take a lot of time that could have been used for something more productive. &lt;/p&gt;

&lt;p&gt;There are ways to solve or avoid such hindrance when scraping, like solving CAPTCHAs manually or even setting a timer on your script to scrape slower. Another way to get around this is by switching your IP every couple of minutes which can be done via proxy servers or a VPN but it takes considerably more time and effort to do so. &lt;/p&gt;

&lt;p&gt;Luckily, I’ve found a perfect solution that can handle most issues we normally encounter when scraping. It can also be easily used and integrate into any of your scraping projects. &lt;a href="https://crawlbase.com/?s=csv4g83q" rel="noopener noreferrer"&gt;Crawlbase&lt;/a&gt; (formerly known as ProxyCrawl) offers an API that will allow you to easily scrape the web and it protects your web crawler against blocked requests, proxy failure, IP leak, browser crashes, and more. They are providing one of the best API that can be used by everyone, be it for small or big projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;In this article, I want to share with you how I used Crawlbase to easily crawl Facebook groups using their Crawling API and built-in scraper. We will also tackle some useful parameter features like automatic scrolling to extract more data per API request. &lt;/p&gt;

&lt;p&gt;I will be providing a very basic sample API call and code for Python 3 as well as discuss each part, which then can be used as a baseline for your existing or future projects. The scraper that I will be using can extract information like member count, usernames, member's posts, and much more in a public Facebook group.&lt;/p&gt;

&lt;p&gt;Before we start, let’s have a list of things that we will use for this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.python.org/downloads/" rel="noopener noreferrer"&gt;Python 3&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://pypi.org/project/proxycrawl/" rel="noopener noreferrer"&gt;Python library from Crawlbase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crawlbase.com/signup?s=csv4g83q" rel="noopener noreferrer"&gt;Crawlbase account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crawlbase.com/docs/crawling-api/" rel="noopener noreferrer"&gt;Crawling API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crawlbase.com/docs/crawling-api/scrapers" rel="noopener noreferrer"&gt;Facebook Data scraper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://crawlbase.com/docs/crawling-api/parameters" rel="noopener noreferrer"&gt;Parameters&lt;/a&gt; for the API: page_wait, ajax_wait, scroll, and scroll_interval&lt;/li&gt;
&lt;li&gt;Any public Facebook group URL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Simple API Call
&lt;/h2&gt;

&lt;p&gt;Now that you have an idea of what we will need to accomplish this task, we can get started. &lt;/p&gt;

&lt;p&gt;First, it is important to know that every request to Crawlbase’s API starts with the following base part:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

https://api.crawlbase.com


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You will also need an authentication token for every request. Crawlbase will provide two kinds of token upon signing up. The normal token for generic requests, and the Javascript token which acts like a real browser. &lt;/p&gt;

&lt;p&gt;In this case, we will be using the Javascript token since we will need the page rendered via javascript to properly scrape Facebook groups. A token can be inserted on our request as shown below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

https://api.crawlbase.com/?token=USER_TOKEN


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To make an API call, you just need to add the URL (encoded) that you wish to crawl like the given example below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

https://api.crawlbase.com/?token=JS_TOKEN&amp;amp;url=https%3A%2F%2Fwww.facebook.com%2FBreakingNews


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This simple line will instruct the API to fetch the full HTML source code of any website that you are trying to crawl. You can make this API request using cURL on your terminal or just open a browser and paste it into the address bar.&lt;/p&gt;

&lt;p&gt;Now that I have explained the very basics of making an API call, we can then try to use this knowledge to scrape Facebook groups. &lt;/p&gt;

&lt;p&gt;Depending on your project, getting the full HTML source code may not be efficient if you want to extract a particular data set. You can try to build your own scraper, however, if you are just starting or if you don’t want to spend your resources and time on building it yourself, Crawlbase has various readily available data scrapers that we can use to easily scrape data from supported websites like Facebook.&lt;/p&gt;

&lt;p&gt;Using their data scraper, we can easily retrieve the following information on most Facebook groups:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;title&lt;br&gt;
type&lt;br&gt;
membersCount&lt;br&gt;
url&lt;br&gt;
description&lt;br&gt;
feeds including username, text, link, likesCount, commentsCount&lt;br&gt;
comments including username and text&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To get all the information mentioned above, we just need to pass three parameters. The &amp;amp;scraper=facebook-group alongside the &amp;amp;page_wait and &amp;amp;ajax_wait parameters. Using these will return the result in JSON format. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

https://api.crawlbase.com/?token=JS_TOKEN&amp;amp;url=https%3A%2F%2Fwww.facebook.com%2Fgroups%2F198722650913932&amp;amp;scraper=facebook-group&amp;amp;page_wait=10000&amp;amp;ajax_wait=true


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqxamb2r8m5siini7t2wa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqxamb2r8m5siini7t2wa.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scraping with Python
&lt;/h2&gt;

&lt;p&gt;Crawlbase has compiled a collection of related pieces of code that we can use to write our simple API call in Python and anyone can freely use it. The below example is how we can utilize their Python library in this project.&lt;/p&gt;

&lt;p&gt;First, make sure to download and install the &lt;a href="https://pypi.org/project/proxycrawl/" rel="noopener noreferrer"&gt;Crawlbase API Python class&lt;/a&gt;. You can either download it from Github or use PyPi Python package manager. &lt;em&gt;pip install proxycrawl&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

from proxycrawl.proxycrawl_api import ProxyCrawlAPI

api = ProxyCrawlAPI({'token': 'YOUR_TOKEN'})

response = api.get('https://www.facebook.com/groups/381067052051677',
                   {'scraper': 'facebook-group', 'ajax_wait':'true','page_wait': 10000})

if response['status_code'] == 200:
    print(response['body'])



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Note at this instance we do not need to encode the URL since the library is encoding it already. &lt;/p&gt;

&lt;p&gt;From this point on, using other parameters would be as easy as adding another option to the GET request.&lt;/p&gt;

&lt;p&gt;Let us use the scroll and scroll_interval in this next example. This parameter will allow our scraper to scroll on a set time interval which in return will provide us more data as if we are scrolling down a page on a real browser. For example, if we set it to 20 then it will instruct the browser to scroll for 20 seconds after loading the page. We can set it for a maximum of 60 seconds, after which the API captures the data and brings it back to us.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

from proxycrawl.proxycrawl_api import ProxyCrawlAPI

api = ProxyCrawlAPI({'token': 'YOUR_TOKEN'})

response = api.get('https://www.facebook.com/groups/381067052051677',
                   {'scraper': 'facebook-group', 'scroll': 'true', 'scroll_interval': 20})

if response['status_code'] == 200:
    print(response['body'])


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As you may have noticed with the code, we will get a response or status code each time we send a request to Crawlbase. The request is a success if we get 200 for pc_status and original_status. In some cases, the request may fail, which will have a different status code like 503 for example. However, Crawlbase does not charge for such cases, so if the requests failed for some reason, you can simply retry the call.&lt;/p&gt;

&lt;p&gt;The example output below shows a successfully scraped public Facebook group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkbtp95wq7hz09x9bs5n4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkbtp95wq7hz09x9bs5n4.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;There you have it. Scraping Facebook content in just a few lines of code. As of the moment, Crawlbase only offers a scraper for groups, but you can use the Crawling API if you wish to crawl other pages. &lt;/p&gt;

&lt;p&gt;Remember, you can use any programming language that you are familiar with and this can be integrated into any of your existing systems. The Crawlbase API is stable and reliable enough that it can serve as a backbone to any of your app. They are also offering great support for all their products that is why I’m happy using their service.&lt;/p&gt;

&lt;p&gt;I hope you have learned something new in this article. Do not forget to sign up at &lt;a href="https://crawlbase.com/signup?s=csv4g83q" rel="noopener noreferrer"&gt;Crawlbase&lt;/a&gt; to get your token if you want to test this on your end. The first 2000 requests are free of charge, just make sure to use the links found on this guide. :)&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>facebook</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>Scraping in Node.js + Cheerio made easy with ProxyCrawl</title>
      <dc:creator>iankalvin</dc:creator>
      <pubDate>Wed, 07 Oct 2020 07:02:42 +0000</pubDate>
      <link>https://dev.to/iankalvin/scraping-on-node-js-cheerio-made-easy-with-proxycrawl-397</link>
      <guid>https://dev.to/iankalvin/scraping-on-node-js-cheerio-made-easy-with-proxycrawl-397</guid>
      <description>&lt;p&gt;If you are new to web scraping like me, chances are, you already experienced being blocked by a certain website or unable to bypass CAPTCHAs.&lt;/p&gt;

&lt;p&gt;As I search for an easy way to scrape web pages without worrying too much about being blocked, I came across &lt;a href="https://proxycrawl.com/?s=csv4g83q" rel="noopener noreferrer"&gt;ProxyCrawl&lt;/a&gt; which offers an easy to use Crawler API. The product allowed me to scrape Amazon pages smoothly with incredible reliability.&lt;/p&gt;

&lt;p&gt;In this article, I wanted to share with you the steps on how I build a scraper and then integrate the crawling API into my project. This simple code will scrape product reviews from a list of Amazon URLs easily and write that scraped data straight to a CSV file.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Preparation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;With this Node project, I have used ProxyCrawl's library and Cheerio which is like a JQuery tool for the server used in web scraping. So before starting with the actual coding, I will list all that is needed for this to work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We need a list of URLs so I have provided several examples &lt;a href="https://drive.google.com/file/d/13U15rzX4zDYmUvPiQ6_meD_Wj1iuob04/view?usp=sharing" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://proxycrawl.com/login?s=csv4g83q" rel="noopener noreferrer"&gt;ProxyCrawl account&lt;/a&gt;. They have a free trial that you can use to call their API free of charge for your first 1000 requests, so this is perfect for our project.&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://proxycrawl.com/dashboard/api/libraries?s=csv4g83q" rel="noopener noreferrer"&gt;Nodejs library&lt;/a&gt; from ProxyCrawl&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/cheeriojs/cheerio" rel="noopener noreferrer"&gt;Node Cheerio Library&lt;/a&gt; from GitHub&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Really, that’s it. So, without further ado, let’s start writing the code.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Coding with Node&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At this point, you may already have installed your favorite code editor, but if not, I recommend installing Visual Studio code.&lt;/p&gt;

&lt;p&gt;To set up our project structure, please do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a project folder name it as Amazon &lt;/li&gt;
&lt;li&gt;Inside the folder, create a file and name it Scraper.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once done, go to your terminal and install the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;npm i proxycrawl&lt;/li&gt;
&lt;li&gt;npm i cheerio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the package installation, go to your Amazon folder and paste the text file that contains the list of Amazon URLs which will be scraped by our code later.&lt;/p&gt;

&lt;p&gt;Our project structure should now look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzmezeysv8qqr6jtfw58x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzmezeysv8qqr6jtfw58x.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that everything is set, let us start writing our code in the Scraper.js file. The following lines will load the Amazon-product.txt file into an array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs');
const file = fs.readFileSync('Amazon-products.txt');
const urls = file.toString().split('\n');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we’ll utilize the ProxyCrawl node library so we can easily integrate the crawling API into our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { ProxyCrawlAPI } = require('proxycrawl');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code below will create a worker where we can place our token. Just make sure to replace the value with your normal token from your ProxyCrawl account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const api = new ProxyCrawlAPI({ token: '_YOUR_TOKEN_' });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, we can now write a code that will do 10 requests each second to the API. We will also use the setInterval function to crawl each of the URLs in your text file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const requestsPerSecond = 10;
var currentIndex = 0;
setInterval(() =&amp;gt; {
  for (let i = 0; i &amp;lt; requestsPerSecond; i++) {
    api.get(urls[currentIndex]);
    currentIndex++;
  }
}, 1000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, we’re just loading the URLs. To do the actual scraping, we will use the Node Cheerio library and extract the reviews from the full HTML code of the webpage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const cheerio = require('cheerio');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next part of our code is a function which will parse the returned HTML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function parseHtml(html) {
  // Load the html in cheerio
  const $ = cheerio.load(html);
  // Load the reviews
  const reviews = $('.review');
  reviews.each((i, review) =&amp;gt; {
  // Find the text children
  const textReview = $(review).find('.review-text').text().replace(/\s\s+/g, '')
;
    console.log(textReview);
  })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code is ready to use but will just log the results in the console.  Let’s go ahead and insert a few lines to write this into a CSV file instead.&lt;/p&gt;

&lt;p&gt;To do this, we will use the FS module that comes with node then create a variable called writeStream.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs');
const writeStream = fs.createWriteStream('Reviews.csv');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*Remember that the Reviews.csv is your CSV file and you can name it whatever you want.&lt;/p&gt;

&lt;p&gt;We’ll add a header as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;writeStream.write(`ProductReview \n \n`);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly, we’ll have to instruct our code to write the actual value to our CSV file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;writeStream.write(`${textReview} \n \n`);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that our scraper is complete, the full code should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs');
const { ProxyCrawlAPI } = require('proxycrawl');
const cheerio = require('cheerio');
const writeStream = fs.createWriteStream('Reviews.csv');

//headers
writeStream.write(`ProductReview \n \n`);

const file = fs.readFileSync('Amazon-products.txt');
const urls = file.toString().split('\n');
const api = new ProxyCrawlAPI({ token: '_YOUR_TOKEN_' });

function parseHtml(html) {
  // Load the html in cheerio
  const $ = cheerio.load(html);
  // Load the reviews
  const reviews = $('.review');
  reviews.each((i, review) =&amp;gt; {
    // Find the text children
    const textReview = $(review).find('.review-text').text().replace(/\s\s+/g, '');
    console.log(textReview);
    // write the reviews in the csv file
    writeStream.write(`${textReview} \n \n`);
  })
}

const requestsPerSecond = 10;
var currentIndex = 0;
setInterval(() =&amp;gt; {
  for (let i = 0; i &amp;lt; requestsPerSecond; i++) {
    api.get(urls[currentIndex]).then(response =&amp;gt; {
      // Make sure the response is success
      if (response.statusCode === 200 &amp;amp;&amp;amp; response.originalStatus === 200) {
        parseHtml(response.body);
      } else {
        console.log('Failed: ', response.statusCode, response.originalStatus);
      }
    });
    currentIndex++;
  }
}, 1000);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;RESULT&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To run your scraper, simply press F5 on Windows or go to your terminal and type node filename&lt;/p&gt;

&lt;p&gt;Example output: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy84ffaax723zwq3c38g6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fy84ffaax723zwq3c38g6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you’ve learned something from this guide. Just remember to sign up at &lt;a href="https://proxycrawl.com/signup?s=csv4g83q" rel="noopener noreferrer"&gt;ProxyCrawl&lt;/a&gt; to get your token and use the API to avoid blocks. &lt;/p&gt;

&lt;p&gt;Feel free to utilize this code however you like 😊&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>scraping</category>
      <category>node</category>
      <category>cheerio</category>
    </item>
  </channel>
</rss>
