<?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: Pierre </title>
    <description>The latest articles on DEV Community by Pierre  (@daolf).</description>
    <link>https://dev.to/daolf</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%2F128882%2F9f096743-b461-4de9-b6fa-660a294dc1c6.png</url>
      <title>DEV Community: Pierre </title>
      <link>https://dev.to/daolf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daolf"/>
    <language>en</language>
    <item>
      <title>The journey to a $1 million ARR SaaS without traditional VCs</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Wed, 13 Apr 2022 08:23:55 +0000</pubDate>
      <link>https://dev.to/daolf/the-journey-to-a-1-million-arr-saas-without-traditional-vcs-4g38</link>
      <guid>https://dev.to/daolf/the-journey-to-a-1-million-arr-saas-without-traditional-vcs-4g38</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cJmt83D---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71gg7c1l7e3i7a90rj7u.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cJmt83D---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71gg7c1l7e3i7a90rj7u.gif" alt="Image description" width="220" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How it took us almost five years and multiple failed projects to grow a sustainable and almost bootstrapped SaaS.&lt;/p&gt;

&lt;p&gt;TL;DR&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;didn't like our full-time job after school&lt;/li&gt;
&lt;li&gt;heavily inspired by indie hackers / bootstrappers&lt;/li&gt;
&lt;li&gt;tried to build a B2C shopping app: FAILED ❌&lt;/li&gt;
&lt;li&gt;tried to build a B2B SaaS, price monitoring for e-commerce: FAILED ❌&lt;/li&gt;
&lt;li&gt;got the idea to build a &lt;a href="https://www.scrapingbee.com/"&gt;web scraping API&lt;/a&gt; instead&lt;/li&gt;
&lt;li&gt;managed to get to $1m ARR, but it took us nearly 3 years to get there 😅&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  The early days
&lt;/h1&gt;

&lt;h3&gt;
  
  
  SEP 2006
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;14 years ago.&lt;/strong&gt; 📅&lt;/p&gt;

&lt;p&gt;We (Kevin and Pierre) met in high school in a small town located in the south of France.&lt;/p&gt;

&lt;h3&gt;
  
  
  JUN 2010
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;... school ends.&lt;/strong&gt; 👨‍🏫&lt;/p&gt;

&lt;p&gt;We go learn CS at university. During that time, we started to learn about &lt;a href="https://www.ycombinator.com"&gt;YC&lt;/a&gt;, &lt;a href="https://www.indiehackers.com"&gt;IndieHackers&lt;/a&gt;, Rob Walling's &lt;a href="https://startupbook.net"&gt;book&lt;/a&gt;, &lt;a href="https://www.thefamily.co"&gt;the family&lt;/a&gt;, and this whole startup/bootstrapping ecosystem.&lt;/p&gt;

&lt;p&gt;We learned that you didn't need to raise $100m to build a successful business!&lt;/p&gt;

&lt;h3&gt;
  
  
  MAY 2016
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Time to find a job.&lt;/strong&gt; 👨‍💻&lt;/p&gt;

&lt;p&gt;Kevin works for a small startup doing some invoice and banking data aggregation.&lt;/p&gt;

&lt;p&gt;Things are fun.&lt;/p&gt;

&lt;p&gt;Then the company was acquired by one of the top 4 big French banks.&lt;/p&gt;

&lt;p&gt;Things become less fun.&lt;/p&gt;

&lt;p&gt;He quits and starts to write a book about Java and web scraping&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b9XHXngi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/30qeq68s71cur48ln2a0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b9XHXngi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/30qeq68s71cur48ln2a0.gif" alt="Image description" width="498" height="330"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  First product
&lt;/h1&gt;

&lt;h3&gt;
  
  
  DEC 2017
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ShopToList&lt;/strong&gt; 🙂&lt;/p&gt;

&lt;p&gt;We build ShopToList, a price monitoring extension. You save the products you want to buy and get notified as soon as its price drops.&lt;/p&gt;

&lt;p&gt;We get a decent traction and have a quite successful &lt;a href="https://www.producthunt.com/posts/shoptolist"&gt;ProductHunt launch&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  MAY 2018
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;B2C is freaking hard.&lt;/strong&gt; ☹️&lt;/p&gt;

&lt;p&gt;But that is not enough. We can't find a way to monetize the product and haven't found a scalable way to acquire more users. We sell the product to a web agency and move on to other projects.&lt;/p&gt;




&lt;h1&gt;
  
  
  Going full-time and building our first SaaS
&lt;/h1&gt;

&lt;h3&gt;
  
  
  JUL 2018
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First SaaS idea.&lt;/strong&gt; 💡&lt;/p&gt;

&lt;p&gt;While building ShopToList we notice that many people use ShopToList to spy on their competitor's prices.&lt;/p&gt;

&lt;p&gt;In the meantime, Pierre had left his job as a data engineer for the french Zillow.&lt;/p&gt;

&lt;p&gt;So this time, we decided to build a price monitoring tool instead.&lt;/p&gt;

&lt;p&gt;This time, we will target businesses (B2B) in a validated niche. This makes us confident that this could work.&lt;/p&gt;

&lt;p&gt;We were wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  SEP 2018
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A successful launch.&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;p&gt;After two months in beta, countless user interviews, and many bug fixes, we finally released PricingBot.&lt;/p&gt;

&lt;h3&gt;
  
  
  JAN 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First customer.&lt;/strong&gt; 💵&lt;/p&gt;

&lt;p&gt;Soon after getting out of beta, we finally managed to get our first customer. We're ecstatic that real businesses give us real money for a product we make for the first time.&lt;/p&gt;

&lt;h3&gt;
  
  
  APR 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The failure to get traction.&lt;/strong&gt; 💩&lt;/p&gt;

&lt;p&gt;After months of endless marketing experimentation, feature development, and optimizations we have to face that people don't want to pay for our product.&lt;/p&gt;

&lt;p&gt;We also notice that we are building into a niche that we don't know well (e-commerce), which shows a lot when talking to potential customers.&lt;/p&gt;

&lt;p&gt;We're considering moving on to something else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VyX8DfNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gew1bclxl9latxvu783u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VyX8DfNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gew1bclxl9latxvu783u.png" alt="Image description" width="880" height="626"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Pivoting to a web scraping API
&lt;/h1&gt;

&lt;h3&gt;
  
  
  APRIL 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The web scraping API idea.&lt;/strong&gt; 💡&lt;/p&gt;

&lt;p&gt;While building PricingBot, we used a lot of web scraping tools. And we noticed that all of them shared common flaws: hard to use, slow, not reliable, and not transparent about who operates the business.&lt;/p&gt;

&lt;p&gt;Having a lot of experience in web scraping, we decide to scratch our own itch by developing a web scraping API.&lt;/p&gt;

&lt;h3&gt;
  
  
  MAY 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Building the MVP.&lt;/strong&gt; 🛠&lt;/p&gt;

&lt;p&gt;We spend the whole month of June working as much as we could on the MVP. We want to validate the product quickly, and to do that we need something that works.&lt;/p&gt;

&lt;p&gt;Leveraging some friends we made on web scraping forums and growth marketing communities, we get around ten free beta-testers to try our product.&lt;/p&gt;

&lt;p&gt;It allows us to iterate on what is essential to develop quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  JUN 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The small release.&lt;/strong&gt; ▫️&lt;/p&gt;

&lt;p&gt;Since we didn't want to make the same mistakes we've made with our product, we decide to ask for money as early as possible.&lt;/p&gt;

&lt;p&gt;In June, we close the free beta and ask people to take a paid subscription to continue using the product.&lt;/p&gt;

&lt;p&gt;To our biggest surprise, the first customer comes 50 minutes after sending the first email. We're delighted, but we know that now the &lt;strong&gt;hard part begins&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building a sustainable SaaS
&lt;/h1&gt;

&lt;h3&gt;
  
  
  JUL 2019 🎩
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The keys to building a good business.&lt;/strong&gt; 🗝&lt;/p&gt;

&lt;p&gt;We know that if we want ScrapingBee to work we need two essential things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; a product that sticks: recurring revenue&lt;/li&gt;
&lt;li&gt; a scalable acquisition channel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;About the first point, we make the bet that most of our customers have regular web scraping needs and that if we make a good product, they'll stay with us.&lt;/p&gt;

&lt;p&gt;For the second one, we bet on content. Kevin had been writing a lot about web-scraping in the past years, including a full &lt;a href="https://www.scrapingbee.com/java-webscraping-book/"&gt;book&lt;/a&gt;, and we think we can attract potential customers by writing good content.&lt;/p&gt;

&lt;h3&gt;
  
  
  AUG 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First content, first success.&lt;/strong&gt; ✍️&lt;/p&gt;

&lt;p&gt;We start trying to write the best possible content. And people love it. Our first big blog post was the "&lt;a href="https://www.scrapingbee.com/blog/web-scraping-without-getting-blocked/"&gt;Web scraping without getting blocked&lt;/a&gt;" guide. We shared it a bit all over the place, and it quickly got 20,000 visitors. Proof that people like good content, even if it is written on a company blog.&lt;/p&gt;

&lt;p&gt;PS: this article has now been read by more than 70,000 people 😎&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6KurFkwE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phudkrsryduilozlzzy0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6KurFkwE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phudkrsryduilozlzzy0.png" alt="Image description" width="400" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  OCT 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Avoiding distraction.&lt;/strong&gt; 🙇‍♂️&lt;/p&gt;

&lt;p&gt;Writing good content was working well, but it was very slow. Slow to produce, but also slow to rank on Google. So we start trying a lot of other acquisition channels to try to speed the business up. It was a mistake, making us lose focus and waste money. We go back to content and spend the time a lot of time writing other web scraping guides in several languages carefully:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Python&lt;/li&gt;
&lt;li&gt; Ruby&lt;/li&gt;
&lt;li&gt; PHP&lt;/li&gt;
&lt;li&gt; C#&lt;/li&gt;
&lt;li&gt; NodeJS&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  DEC 2019
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Talking to users a lot.&lt;/strong&gt; 🗣&lt;/p&gt;

&lt;p&gt;In the early days, we try to speak to as many people as possible to build the best web scraping tool out there.&lt;/p&gt;

&lt;p&gt;But talking to customers can be challenging. Their time is precious, and most of them don't like to speak to companies for fear of getting trapped in an endless upsell call.&lt;/p&gt;

&lt;p&gt;So Kevin had the idea to offer 10,000 API calls to anyone willing to discuss their web-scraping needs for 15 minutes over the phone.&lt;/p&gt;

&lt;p&gt;This move allowed us to talk to around 100 people in less than three months and learn invaluable insights.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d5Sw_wUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zjl3v43oblaiy9u3f4bk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d5Sw_wUO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zjl3v43oblaiy9u3f4bk.jpeg" alt="Image description" width="880" height="264"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  The road to $10k MRR
&lt;/h1&gt;

&lt;h3&gt;
  
  
  MAY 2020
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Joining Tinyseed.&lt;/strong&gt; 🌱&lt;/p&gt;

&lt;p&gt;The goal with ScrapingBee was always to find a sustainable business, where we would be in complete control of what happens in the company without having the pressure to grow at all costs. And this is precisely why we never decided to raise money. However, a few years ago, Rob Walling and his friends launched &lt;a href="https://tinyseed.com"&gt;TinySeed&lt;/a&gt;. An accelerator designed precisely to help people grow their business, but without any pressure to become a unicorn.&lt;/p&gt;

&lt;p&gt;We applied and got lucky enough to get accepted. The money and the support we got from the program helped us grow ScrapingBee into what it is now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uvmPZjc0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zd3k5rmwmiyoofdmfxem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uvmPZjc0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zd3k5rmwmiyoofdmfxem.png" alt="Image description" width="880" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  JUN 2020
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Improving the product.&lt;/strong&gt; 🛠&lt;/p&gt;

&lt;p&gt;2020 was a very "grind" year. And to be honest, all we did was the same thing over and over. Improving the product, releasing new content. In the spring we focused a lot on the customer experience, doing everything we could to make the API as easy as possible to use. We developed SDK in &lt;a href="https://pypi.org/project/scrapingbee/"&gt;Python&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/scrapingbee"&gt;JavaScript&lt;/a&gt;, a brand new documentation with snippets in 7 languages and a request builder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8nLmQo10--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cdibrxjxrwvrzol9b7ln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8nLmQo10--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cdibrxjxrwvrzol9b7ln.png" alt="Image description" width="880" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  OCT 2020
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Slowly reaching $10k MRR.&lt;/strong&gt; 🐌&lt;/p&gt;

&lt;p&gt;In November, we finally reach $10,000 Monthly Recurring Revenue. A very symbolic milestone for us, because for the first time, it allowed us to get paid (almost) the same as our previous job, and it also meant that we were profitable.&lt;/p&gt;

&lt;p&gt;But as you can see, this took a while. We started working on ScrapingBee almost 18 months before this moment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xTnqhOII--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/52y0c6rdc9nqkd1b3fl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xTnqhOII--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/52y0c6rdc9nqkd1b3fl5.png" alt="Image description" width="880" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  JAN 2021
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Growth finally kicks in.&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;p&gt;The last quarter of 2020 was a magical moment because, for the first time, we felt that growth was finally kicking in.&lt;/p&gt;

&lt;p&gt;And while it took us almost 18 months to get to $10k MRR, it took us only 3 months to double our revenue to $20k MRR.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--epEhHbmV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/46eckwydm5c6xtcwvwaz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--epEhHbmV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/46eckwydm5c6xtcwvwaz.png" alt="Image description" width="880" height="245"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Growing the business
&lt;/h1&gt;

&lt;h3&gt;
  
  
  FEB 2021
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Keep doing the things that work.&lt;/strong&gt; 🌱&lt;/p&gt;

&lt;p&gt;In 2021, we decided to focus on our strengths and write great content while trying to build the best web scraping API.&lt;/p&gt;

&lt;p&gt;It is also at that time that Kevin and Pierre decide to split the role in the company. Kevin is now in charge of our whole marketing, and Pierre handles the product and technical side of the business.&lt;/p&gt;

&lt;h3&gt;
  
  
  MAR 2021
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Content is king.&lt;/strong&gt; 👑&lt;/p&gt;

&lt;p&gt;We reach a significant milestone, 1,000,000 pageviews on our website, most of it being organic.&lt;/p&gt;

&lt;p&gt;It looks like betting on content was the right thing to do.&lt;/p&gt;

&lt;h3&gt;
  
  
  JUN 2021
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First hire.&lt;/strong&gt; 📝&lt;/p&gt;

&lt;p&gt;Etienne joins the team full-time to help us with our growing development needs.&lt;/p&gt;

&lt;p&gt;Etienne is a talented developer who worked in various industries before joining us.&lt;/p&gt;

&lt;p&gt;In a short amount of time, he's able to release two beloved functionality of the API, the &lt;a href="https://www.scrapingbee.com/features/data-extraction/"&gt;data extraction&lt;/a&gt; and the &lt;a href="https://www.scrapingbee.com/features/javascript-scenario/"&gt;JavaScript scenario&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  NOV 2021
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$1 million.&lt;/strong&gt; 💰&lt;/p&gt;

&lt;p&gt;In November, 6 years after our first product and 2,5 years after launching ScrapingBee, we finally reach the million in Annual Recurring Revenue.&lt;/p&gt;




&lt;h1&gt;
  
  
  The story is not over
&lt;/h1&gt;

&lt;h3&gt;
  
  
  JAN 2022
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Redesign.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After 6 months of development, we released a complete redesign of our website in January, with a brand new logo, visual identity, documentation, and blog.&lt;/p&gt;

&lt;p&gt;It hasn't been an easy road, and this wouldn't have been possible without all the support we got along the way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uIvxpyv6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zkq8xyu53h4u1pq89uap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uIvxpyv6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zkq8xyu53h4u1pq89uap.png" alt="Image description" width="880" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;THANK YOU!&lt;/p&gt;

&lt;p&gt;Thank you, friends, family, colleagues, former colleagues, LP, TinySeed tutors, mastermind Zoomers, customers, Twitter supporters, ProductHunt upvoters and blog readers.&lt;/p&gt;

&lt;p&gt;Happy to answer any questions you might have.&lt;/p&gt;

&lt;p&gt;Pierre de Wulf 🐝&lt;/p&gt;

</description>
      <category>startup</category>
      <category>saas</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The 25 most recommended JavaScript books of all-time</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Thu, 06 Aug 2020 10:34:39 +0000</pubDate>
      <link>https://dev.to/daolf/the-25-most-recommended-javascript-books-of-all-time-1ec9</link>
      <guid>https://dev.to/daolf/the-25-most-recommended-javascript-books-of-all-time-1ec9</guid>
      <description>&lt;p&gt;This article is a follow up of the one I did about the &lt;a href="https://dev.to/daolf/the-25-most-recommended-programming-books-of-all-time-5fel"&gt;the most recommended programming books of all-time&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've read this one recently. I guess you can jump straight to the results.&lt;/p&gt;

&lt;p&gt;There are countless lists on the internet claiming to be &lt;strong&gt;the&lt;/strong&gt; list of must-read JS books and it seemed that all those lists always recommended that same books minus two or three odd choices.&lt;/p&gt;

&lt;p&gt;Finding good resources for learning programming is always tricky. Every-one has its own opinion about what book is the best to learn, and as we say in french, "Color and tastes should not be argued about".&lt;/p&gt;

&lt;p&gt;However, I thought it would be interesting to trust the wisdom of the crown and to find the books that appeared the most in those "Best JavaScript Book" lists.&lt;/p&gt;

&lt;p&gt;If you want to jump right on the results go take a look below at the full results. If you want to learn about the methodology, bear with me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I spent countless hours on this article so I've decided to put Amazon affiliation links to see if those kinds of detailed articles could be a viable source of revenue, ... or not 🤷‍♂️.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology:
&lt;/h2&gt;

&lt;p&gt;I've simply asked Google for a few queries like "Best JS Books" and its variations of. I have then scrapped all those pages (using ScrapingBee, a web scraping API I'm working on).&lt;/p&gt;

&lt;p&gt;I've deduplicated the links and ended up with nearly 105 links. Using the title of the pages I was also able to quickly discards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list focused on one particular technology or platform&lt;/li&gt;
&lt;li&gt;list focused on one particular year&lt;/li&gt;
&lt;li&gt;list focused on free books&lt;/li&gt;
&lt;li&gt;Quora and Reddit threads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ended up with almost 75 HTML files. I went on opening all the files on my browser, open my chrome inspector, found and wrote the CSS selector matching book titles in the article. This took me around 1 hour, almost 30 seconds per page. &lt;/p&gt;

&lt;p&gt;This also allowed me to discard even more nonrelevant pages, and I discarded a lot. In the end, I compiled around 70 lists into this one.&lt;/p&gt;

&lt;p&gt;Book titles were then extracted with manual extraction and some web scraping. &lt;/p&gt;

&lt;p&gt;I ended up with a huge list of books, not usable without some post-processing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yQ6EWK8Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/links.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yQ6EWK8Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/links.png" alt="" width="796" height="248"&gt;&lt;/a&gt;&lt;/p&gt;
Screenshot made while making another list



&lt;p&gt;To find the most quoted JS books I needed to normalize my results. &lt;/p&gt;

&lt;p&gt;I had to play with  all the different variation like "{title} by {author}" or "{title} - {author}".&lt;/p&gt;

&lt;p&gt;Or "{title}:{subtitle}" and "{title}", or even all the one containing edition number. &lt;/p&gt;

&lt;p&gt;I ended up doing it using this simple custom Python function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'ascii'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'ignore'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'the'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'by'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;':'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'('&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and quite a bit of manual cleaning.&lt;/p&gt;

&lt;p&gt;My list now looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VO-aFmjF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/clean_links.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VO-aFmjF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/clean_links.png" alt="" width="822" height="271"&gt;&lt;/a&gt;&lt;/p&gt;
Screenshot made while making another list



&lt;p&gt;From there it was easy to compute the most recommended books. You can find all the data used to process this list on this &lt;a href="https://github.com/daolf/Most-recommended-programming-books"&gt;repo&lt;/a&gt;. Now let's take a look at the list:&lt;/p&gt;

&lt;h2&gt;
  
  
  25 most recommended JavaScript books of all-time
&lt;/h2&gt;

&lt;h4&gt;
  
  
  25. &lt;a href="https://amzn.to/3gwqRzR"&gt;JavaScript &amp;amp; jQuery: The Missing Manual&lt;/a&gt; by David Sawyer McFarland (9.4% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---hXxOpUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/25.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---hXxOpUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/25.jpg%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"JavaScript lets you supercharge your HTML with animation, interactivity, and visual effects—but many web designers find the language hard to learn. This easy-to-read guide not only covers JavaScript basics, but also shows you how to save time and effort with the jQuery and jQuery UI libraries of prewritten JavaScript code. You’ll build web pages that feel and act like desktop programs—with little or no programming." &lt;a href="https://amzn.to/3gwqRzR"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  24. &lt;a href="https://amzn.to/2PtRsS6"&gt;Learn JavaScript VISUALLY&lt;/a&gt; by Ivelin Demirov (9.4% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A-wWbPct--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/24.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A-wWbPct--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/24.jpg%23center" alt="" width="397" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"It's a beautifully illustrated full-color JavaScript book that teaches the basics through Metaphors, Analogies and Easy Interactive Exercises (Works on PC, Mac, iPad, other tablets)" &lt;a href="https://amzn.to/2PtRsS6"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  23. &lt;a href="https://amzn.to/30vZQHi"&gt;Learning JavaScript Design Patterns&lt;/a&gt; by Addy Osmani (11.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6nK3gTPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/23.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6nK3gTPE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/23.jpg%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"With Learning JavaScript Design Patterns, you’ll learn how to write beautiful, structured, and maintainable JavaScript by applying classical and modern design patterns to the language. If you want to keep your code efficient, more manageable, and up-to-date with the latest best practices, this book is for you.&lt;/p&gt;

&lt;p&gt;Explore many popular design patterns, including Modules, Observers, Facades, and Mediators. Learn how modern architectural patterns—such as MVC, MVP, and MVVM—are useful from the perspective of a modern web application developer. This book also walks experienced JavaScript developers through modern module formats, how to namespace code effectively, and other essential topics." &lt;a href="https://amzn.to/30vZQHi"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  22. &lt;a href="https://amzn.to/33wl6i2"&gt;Beginning JavaScript and CSS Development with jQuery&lt;/a&gt; by Richard York (11.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mtr9YZyL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/22.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mtr9YZyL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/22.jpg%23center" alt="" width="398" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This book covers the jQuery JavaScript framework and the jQuery UI JavaScript framework to get more results more quickly out of JavaScript programming. I cover each method exposed by jQuery’s API, which contains methods to make common, redundant tasks go much more quickly in less code. I also cover how jQuery eliminates certain cross-browser, cross-platform development headaches like the event model; not only does it eliminate these headaches, but it also makes it easier to work with events by reducing the amount of code that you need to write to attach events. It even gives you the ability to simulate events." &lt;a href="https://amzn.to/33wl6i2"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  21. &lt;a href="https://amzn.to/31oFw9R"&gt;Learning JavaScript&lt;/a&gt; by Ethan Brown (11.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9UsBWUUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/21.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9UsBWUUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/21.jpg%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This is an exciting time to learn JavaScript. Now that the latest JavaScript specification—ECMAScript 6.0 (ES6)—has been finalized, learning how to develop high-quality applications with this language is easier and more satisfying than ever. This practical book takes programmers (amateurs and pros alike) on a no-nonsense tour of ES6, along with some related tools and techniques.&lt;/p&gt;

&lt;p&gt;Author Ethan Brown (Web Development with Node and Express) not only guides you through simple and straightforward topics (variables, control flow, arrays), but also covers complex concepts such as functional and asynchronous programming. You’ll learn how to create powerful and responsive web applications on the client, or with Node.js on the server." &lt;a href="https://amzn.to/31oFw9R"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  20. &lt;a href="https://gumroad.com/l/humanjs"&gt;Human JavaScript&lt;/a&gt; by Henrik Joreteg (11.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XS-jQm-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/20.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XS-jQm-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/20.jpg%23center" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Practical patterns for simple but powerful javascript apps.&lt;/p&gt;

&lt;p&gt;No magic frameworks. No monolithic toolkits. You're going to work with proper, real-life javascript in a way you'll understand, and with explanations that help you learn how to make great choices as you build your apps.&lt;/p&gt;

&lt;p&gt;Here's what's included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Clear and straightforward explanations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code examples&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Project skeleton for javascript applications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A lifetime subscription of updates to the book" &lt;a href="https://gumroad.com/l/humanjs"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  19. &lt;a href="https://amzn.to/3fzNQIS"&gt;JavaScript Programmer's Reference&lt;/a&gt; by Alexei White (11.3% recommended)
&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FAuggHWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/19.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FAuggHWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/19.jpg%23center" alt="" width="398" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Learn everything about utilizing the JavaScript language with the next generation of Rich Internet Applications from the accessible information in JavaScript Programmer’s Reference, both a tutorial and a reference guide for web developers. Master methods for using Java with applications like Microsoft’s Silverlight, Ajax, Flex, Flash and AIR by practicing with hands-on examples with practical, usable code. Employ this complete JavaScript reference to help you understand JavaScript Data Types, Variables, Operators, Expressions and Statements, work with JavaScript Frameworks and data, and improve performance with Ajax." &lt;a href="https://amzn.to/3fzNQIS"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  18. &lt;a href="https://amzn.to/2C0s7w2"&gt;A Smarter Way to Learn JavaScript&lt;/a&gt; by Mark Myers (11.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cI2lN-FR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/18.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cI2lN-FR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/18.jpg%23center" alt="" width="350" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Learning JavaScript is hell because of two problems. I remove the problems, and you start having fun.&lt;/p&gt;

&lt;p&gt;The first problem is retention. You remember only ten or twenty percent of what you read. That spells failure. To become fluent in a computer language, you have to retain pretty much everything.&lt;/p&gt;

&lt;p&gt;How can you retain everything? Only by constantly being asked to play everything back. That's why people use flashcards. But my system does flashcards one better. After reading a short chapter, you go to my website and complete twenty interactive exercises. Algorithms check your work to make sure you know what you think you know. When you stumble, you do the exercise again. You keep trying until you know the chapter cold. The exercises are free.&lt;/p&gt;

&lt;p&gt;The second problem is comprehension. Many learners hit a wall when they try to understand advanced concepts like variable scope and prototypes. Unfortunately, they blame themselves. That's why the Dummies books sell so well. But the fault lies with the authors, coding virtuosos who lack teaching talent. I'm the opposite of the typical software book author. I'll never code fast enough to land a job at Google. But I can teach.&lt;/p&gt;

&lt;p&gt;Anyway, most comprehension problems are just retention problems in disguise. If you get lost trying to understand variable scope, it's because you don't remember how functions work. Thanks to the interactive exercises on my website, you'll always understand and remember everything necessary to confidently tackle the next concept." &lt;a href="https://amzn.to/2C0s7w2"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  17. &lt;a href="https://amzn.to/31noTLJ"&gt;Head First JavaScript Programming&lt;/a&gt; by Eric Freeman &amp;amp; Elisabeth Robson (11.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FVj38rlS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/17.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FVj38rlS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/17.jpg%23center" alt="" width="260" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This brain friendly guide teaches you everything from JavaScript language fundamentals to advanced topics, including objects, functions, and the browser’s document object model. You won’t just be reading—you’ll be playing games, solving puzzles, pondering mysteries, and interacting with JavaScript in ways you never imagined. And you’ll write real code, lots of it, so you can start building your own web applications. Prepare to open your mind as you learn (and nail) key topics including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The inner details of JavaScript&lt;/li&gt;
&lt;li&gt;How JavaScript works with the browser&lt;/li&gt;
&lt;li&gt;The secrets of JavaScript types&lt;/li&gt;
&lt;li&gt;Using arrays&lt;/li&gt;
&lt;li&gt;The power of functions&lt;/li&gt;
&lt;li&gt;How to work with objects&lt;/li&gt;
&lt;li&gt;Making use of prototypes&lt;/li&gt;
&lt;li&gt;Understanding closures&lt;/li&gt;
&lt;li&gt;Writing and testing applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;" &lt;a href="https://amzn.to/31noTLJ"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  16. &lt;a href="https://amzn.to/33AKFyx"&gt;Javascript Allongé&lt;/a&gt; by Reginald Braithwaite (13.2% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pLBXAIPr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/16.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pLBXAIPr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/16.jpg%23center" alt="" width="386" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"A strong cup of functions, objects, combinators, and decorators by Reginald Braithwaite&lt;/p&gt;

&lt;p&gt;JavaScript Allongé solves two important problems for the ambitious JavaScript programmer. First, JavaScript Allongé gives you the tools to deal with JavaScript bugs, hitches, edge cases, and other potential pitfalls.&lt;/p&gt;

&lt;p&gt;There are plenty of good directions for how to write JavaScript programs. If you follow them without alteration or deviation, you will be satisfied. Unfortunately, software is a complex thing, full of interactions and side-effects. Two perfectly reasonable pieces of advice when taken separately may conflict with each other when taken together. An approach may seem sound at the outset of a project, but need to be revised when new requirements are discovered.&lt;/p&gt;

&lt;p&gt;When you “leave the path” of the directions, you discover their limitations. In order to solve the problems that occur at the edges, in order to adapt and deal with changes, in order to refactor and rewrite as needed, you need to understand the underlying principles of the JavaScript programming language in detail." &lt;a href="https://amzn.to/33AKFyx"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  15. &lt;a href="https://payhip.com/b/JrTz"&gt;Exploring ES2018 and ES2019&lt;/a&gt; by Dr. Axel Rauschmayer (13.2% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ao3T4bNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/15.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ao3T4bNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/15.jpg%23center" alt="" width="670" height="947"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Covers what’s new in ECMAScript 2018 and ECMAScript 2019." &lt;a href="https://payhip.com/b/JrTz"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  14. &lt;a href="https://amzn.to/3ifbFHV"&gt;JavaScript Enlightenment&lt;/a&gt; by Cody Lindley (15.1% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A6MPDi1o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/14.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A6MPDi1o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/14.jpg%23center" alt="" width="379" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"If you’re an advanced beginner or intermediate JavaScript developer, JavaScript Enlightenment will solidify your understanding of the language—especially if you use a JavaScript library. In this concise book, JavaScript expert Cody Lindley (jQuery Cookbook) provides an accurate view of the language by examining its objects and supporting nuances.&lt;/p&gt;

&lt;p&gt;Libraries and frameworks help you build web applications quickly and efficiently, but when things go wrong or performance becomes an issue, knowing how and why they work is critical. If you’re ready to go under the hood and get your hands dirty with JavaScript internals, this is your book." &lt;a href="https://amzn.to/3ifbFHV"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  13. &lt;a href="https://amzn.to/33tSHZH"&gt;JavaScript for Kids&lt;/a&gt; by Nick Morgan (18.9% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ug99ZXO1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/13.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ug99ZXO1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/13.jpg%23center" alt="" width="378" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"JavaScript is the programming language of the Internet, the secret sauce that makes the Web awesome, your favorite sites interactive, and online games fun!&lt;/p&gt;

&lt;p&gt;JavaScript for Kids is a lighthearted introduction that teaches programming essentials through patient, step-by-step examples paired with funny illustrations. You’ll begin with the basics, like working with strings, arrays, and loops, and then move on to more advanced topics, like building interactivity with jQuery and drawing graphics with Canvas." &lt;a href="https://amzn.to/33tSHZH"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  12. &lt;a href="https://amzn.to/30uB2PD"&gt;Professional JavaScript for Web Developers&lt;/a&gt; by Matt Frisbie (18.9% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hpJr3059--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/12.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hpJr3059--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/12.jpg%23center" alt="" width="399" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Professional JavaScript for Web Developers is the essential guide to next-level JavaScript development. Written for intermediate-to-advanced programmers, this book jumps right into the technical details to help you clean up your code and become a more sophisticated JavaScript developer. From JavaScript-specific object-oriented programming and inheritance, to combining JavaScript with HTML and other markup languages, expert instruction walks you through the fundamentals and beyond. &lt;/p&gt;

&lt;p&gt;At 1200 pages, this book is the most comprehensive JavaScript reference available anywhere. This new fourth edition has been updated to cover through ECMAScript 2019; new frameworks and libraries, new techniques, new APIs, and more are explained in detail for the professional developer, with a practical focus that helps you put your new skills to work on real-world projects." &lt;a href="https://amzn.to/30uB2PD"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  11. &lt;a href="https://amzn.to/31hH4T4"&gt;Programming JavaScript Applications&lt;/a&gt; by Eric Elliott (22.6% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ur4xl8PM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/11.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ur4xl8PM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/11.jpg%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Take advantage of JavaScript’s power to build robust web-scale or enterprise applications that are easy to extend and maintain. By applying the design patterns outlined in this practical book, experienced JavaScript developers will learn how to write flexible and resilient code that’s easier—yes, easier—to work with as your code base grows.&lt;/p&gt;

&lt;p&gt;JavaScript may be the most essential web programming language, but in the real world, JavaScript applications often break when you make changes. With this book, author Eric Elliott shows you how to add client- and server-side features to a large JavaScript application without negatively affecting the rest of your code.&lt;/p&gt;

&lt;p&gt;-Examine the anatomy of a large-scale JavaScript application&lt;br&gt;
-Build modern web apps with the capabilities of desktop applications&lt;br&gt;
-Learn best practices for code organization, modularity, and reuse&lt;br&gt;
-Separate your application into different layers of responsibility&lt;br&gt;
-Build efficient, self-describing hypermedia APIs with Node.js&lt;br&gt;
-Test, integrate, and deploy software updates in rapid cycles&lt;br&gt;
-Control resource access with user authentication and authorization&lt;/p&gt;

&lt;p&gt;-Expand your application’s reach through internationalization" &lt;a href="https://amzn.to/31hH4T4"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  10. &lt;a href="https://amzn.to/2PxXLnD"&gt;Speaking JavaScript&lt;/a&gt; by Axel Rauschmayer (22.6% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3rjXfjw9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/10.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3rjXfjw9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/10.jpg%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Like it or not, JavaScript is everywhere these days—from browser to server to mobile—and now you, too, need to learn the language or dive deeper than you have. This concise book guides you into and through JavaScript, written by a veteran programmer who once found himself in the same position.&lt;/p&gt;

&lt;p&gt;Speaking JavaScript helps you approach the language with four standalone sections. First, a quick-start guide teaches you just enough of the language to help you be productive right away. More experienced JavaScript programmers will find a complete and easy-to-read reference that covers each language feature in depth. Complete contents include:&lt;/p&gt;

&lt;p&gt;JavaScript quick start: Familiar with object-oriented programming? This part helps you learn JavaScript quickly and properly.&lt;/p&gt;

&lt;p&gt;JavaScript in depth: Learn details of ECMAScript 5, from syntax, variables, functions, and object-oriented programming to regular expressions and JSON with lots of examples. Pick a topic and jump in.&lt;/p&gt;

&lt;p&gt;Background: Understand JavaScript’s history and its relationship with other programming languages.&lt;/p&gt;

&lt;p&gt;Tips, tools, and libraries: Survey existing style guides, best practices, advanced techniques, module systems, package managers, build tools, and learning resources." &lt;a href="https://amzn.to/2PxXLnD"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  9. &lt;a href="https://amzn.to/2Xw2smwA"&gt;Beginning JavaScript&lt;/a&gt; by Jeremy McPeak (24.5% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Lfv3l7X9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/9.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Lfv3l7X9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/9.jpg%23center" alt="" width="399" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Beginning JavaScript 5th Edition shows you how to work effectively with JavaScript frameworks, functions, and modern browsers, and teaches more effective coding practices using HTML5. This new edition has been extensively updated to reflect the way JavaScript is most commonly used today, introducing you to the latest tools and techniques available to JavaScript developers. Coverage includes modern coding practices using HTML5 markup, the JSON data format, DOM APIs, the jQuery framework, and more. Exercises with solutions provide plenty of opportunity to practice, and the companion website offers downloadable code for all examples given in the book.&lt;/p&gt;

&lt;p&gt;Learn JavaScript using the most up to date coding style&lt;/p&gt;

&lt;p&gt;Understand JSON, functions, events, and feature detection&lt;/p&gt;

&lt;p&gt;Utilize the new HTML5 elements and the related API&lt;/p&gt;

&lt;p&gt;Explore new features including geolocation, local storage, and more&lt;/p&gt;

&lt;p&gt;JavaScript has shaped the Web from a passive medium into one that is rich, dynamic, and interactive. No matter the technology on the server side, it's JavaScript that makes it come alive in the browser. To learn JavaScript the way it's used today, Beginning JavaScript, 5th Edition is your concise guide." &lt;a href="https://amzn.to/2Xw2smw"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  8. &lt;a href="https://amzn.to/33ufh4z"&gt;The Principles of Object-Oriented JavaScript&lt;/a&gt; by Nicholas C.Zakas (24.5% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wliBuG5K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/8.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wliBuG5K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/8.jpg%23center" alt="" width="378" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"If you've used a more traditional object-oriented language, such as C++ or Java, JavaScript probably doesn't seem object-oriented at all. It has no concept of classes, and you don't even need to define any objects in order to write code. But don't be fooled—JavaScript is an incredibly powerful and expressive object-oriented language that puts many design decisions right into your hands.&lt;/p&gt;

&lt;p&gt;In The Principles of Object-Oriented JavaScript, Nicholas C. Zakas thoroughly explores JavaScript's object-oriented nature, revealing the language's unique implementation of inheritance and other key characteristics. You'll learn:&lt;/p&gt;

&lt;p&gt;–The difference between primitive and reference values&lt;/p&gt;

&lt;p&gt;–What makes JavaScript functions so unique&lt;/p&gt;

&lt;p&gt;–The various ways to create objects&lt;/p&gt;

&lt;p&gt;–How to define your own constructors&lt;/p&gt;

&lt;p&gt;–How to work with and understand prototypes&lt;/p&gt;

&lt;p&gt;–Inheritance patterns for types and objects&lt;/p&gt;

&lt;p&gt;The Principles of Object-Oriented JavaScript will leave even experienced developers with a deeper understanding of JavaScript. Unlock the secrets behind how objects work in JavaScript so you can write clearer, more flexible, and more efficient code." &lt;a href="https://amzn.to/33ufh4z"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  7. &lt;a href="https://amzn.to/3kh6Pvh"&gt;JavaScript Patterns&lt;/a&gt; by Stoyan Stefanov (26.4% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nQeHXnV4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/7.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nQeHXnV4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/7.jpg%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"What's the best approach for developing an application with JavaScript? This book helps you answer that question with numerous JavaScript coding patterns and best practices. If you're an experienced developer looking to solve problems related to objects, functions, inheritance, and other language-specific categories, the abstractions and code templates in this guide are ideal—whether you're using JavaScript to write a client-side, server-side, or desktop application.&lt;/p&gt;

&lt;p&gt;Written by JavaScript expert Stoyan Stefanov—Senior Yahoo! Technical and architect of YSlow 2.0, the web page performance optimization tool—JavaScript Patterns includes practical advice for implementing each pattern discussed, along with several hands-on examples. You'll also learn about anti-patterns: common programming approaches that cause more problems than they solve&lt;/p&gt;

&lt;p&gt;Explore useful habits for writing high-quality JavaScript code, such as avoiding globals, using single var declarations, and more &lt;/p&gt;

&lt;p&gt;Learn why literal notation patterns are simpler alternatives to constructor functions&lt;/p&gt;

&lt;p&gt;Discover different ways to define a function in JavaScript&lt;/p&gt;

&lt;p&gt;Create objects that go beyond the basic patterns of using object literals and constructor functions&lt;/p&gt;

&lt;p&gt;Learn the options available for code reuse and inheritance in JavaScript&lt;/p&gt;

&lt;p&gt;Study sample JavaScript approaches to common design patterns such as Singleton, Factory, Decorator, and more&lt;/p&gt;

&lt;p&gt;Examine patterns that apply specifically to the client-side browser environment" &lt;a href="https://amzn.to/3kh6Pvh"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  6. &lt;a href="https://amzn.to/3guE4Jy"&gt;JavaScript and JQuery: Interactive Front-End Web Development&lt;/a&gt; by Jon Duckett (30.2% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nXURzbma--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/6.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nXURzbma--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/6.jpg%23center" alt="" width="402" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This book was written for anyone who wants to use JavaScript to make their websites a little more interesting, engaging, interactive, or usable. In particular, it is aimed at people who do not have a degree in computer science (well, not yet anyway).Programming books can be intimidating, so we wanted to create a book that taught readers how to use JavaScript in a gentler, more visual way. And importantly, we did not want to assume that the reader had any experience of programming beyond the ability to create a web page in HTML and CSS. (After all, many kinds of people are creating websites these days, and not all of us come from a programming background.)So, if you have ever struggled to get a script working on your web pages, want a better idea of how to customize scripts, or want to write your own scripts from scratch, this book was written for you.We can't promise to remove the unfamiliar terms that programmers use, but we do tell you what they mean (with the aid of visual examples and diagrams) so that JavaScript won't seem like a foreign language any more." &lt;a href="https://amzn.to/3guE4Jy"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  5. &lt;a href="https://amzn.to/3ifygnM"&gt;Secrets of the JavaScript Ninja&lt;/a&gt; by John Resig &amp;amp; Bear Bibeault &amp;amp; Josip Maras (32.1% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1fo5grC5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/5.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1fo5grC5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/5.jpg%23center" alt="" width="399" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"More than ever, the web is a universal platform for all types of applications, and JavaScript is the language of the web. If you're serious about web development, it's not enough to be a decent JavaScript coder. You need to be ninja-stealthy, efficient, and ready for anything. This book shows you how." &lt;a href="https://amzn.to/3ifygnM"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. &lt;a href="https://amzn.to/2DCj3Ox"&gt;Effective JavaScript&lt;/a&gt; by David Herman (39.6% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UfCufq5k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/4.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UfCufq5k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/4.jpg%23center" alt="" width="382" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"In order to truly master JavaScript, you need to learn how to work effectively with the language’s flexible, expressive features and how to avoid its pitfalls. No matter how long you’ve been writing JavaScript code, Effective JavaScript will help deepen your understanding of this powerful language, so you can build more predictable, reliable, and maintainable programs. Author David Herman, with his years of experience on Ecma’s JavaScript standardization committee, illuminates the language’s inner workings as never before—helping you take full advantage of JavaScript’s expressiveness. Reflecting the latest versions of the JavaScript standard, the book offers well-proven techniques and best practices you’ll rely on for years to come." &lt;a href="https://amzn.to/2DCj3Ox"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;a href="https://amzn.to/2ETKwMe"&gt;Eloquent JavaScript&lt;/a&gt; by Marijn Haverbeke (56.6% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2MuJXV_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/3.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2MuJXV_b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/3.jpg%23center" alt="" width="379" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"JavaScript lies at the heart of almost every modern web application, from social apps like Twitter to browser-based game frameworks like Phaser and Babylon. Though simple for beginners to pick up and play with, JavaScript is a flexible, complex language that you can use to build full-scale applications. This much anticipated and thoroughly revised third edition of Eloquent JavaScript dives deep into the JavaScript language to show you how to write beautiful, effective code. It has been updated to reflect the current state of Java¬Script and web browsers and includes brand-new material on features like class notation, arrow functions, iterators, async functions, template strings, and block scope. A host of new exercises have also been added to test your skills and keep you on track." &lt;a href="https://amzn.to/2ETKwMe"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;a href="https://amzn.to/2DxVxSG"&gt;You Don't Know JS Book Series&lt;/a&gt; by Kyle Simpson (60.4% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tCl2Km0j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/2.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tCl2Km0j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/2.jpg%23center" alt="" width="145" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"It seems like there's never been as much widespread desire before for a better way to deeply learn the fundamentals of JavaScript. But with a million blogs, books, and videos out there, just where do you START? Look no further!The worldwide best selling 'You Don't Know JS' book series is back for a 2nd edition: 'You Don't Know JS Yet'. All 6 books are brand new, rewritten to cover all sides of JS for 2020 and beyond.'Get Started' prepares you for the journey ahead, first surveying the language then detailing how the rest of the You Don t Know JS Yet book series guides you to knowing JS more deeply." &lt;a href="https://amzn.to/2DxVxSG"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;a href="https://amzn.to/3a2xffF"&gt;JavaScript: The Definitive Guide&lt;/a&gt; by David Flanagan (66.0% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m8ug1QpW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/1.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m8ug1QpW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/js_book_list/1.jpg%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"JavaScript is the programming language of the web and is used by more software developers today than any other programming language. For nearly 25 years this best seller has been the go-to guide for JavaScript programmers. The seventh edition is fully updated to cover the 2020 version of JavaScript, and new chapters cover classes, modules, iterators, generators, Promises, async/await, and metaprogramming. You’ll find illuminating and engaging example code throughout." &lt;a href="https://amzn.to/3a2xffF"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Although the order might surprise some, by definition, most of you must have heard of these books already.&lt;/p&gt;

&lt;p&gt;A few additional things I learned making this list: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O’Reilly is the big winner of this list with 7 books in the top 25&lt;/li&gt;
&lt;li&gt;Surprisingly, "JavaScript the Good Part" is not in this list&lt;/li&gt;
&lt;li&gt;Jquery is still heavily tied to the JS ecosystem, even in 2020&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you enjoyed this article. I now publish all those lists in my first no-code tool: &lt;a href="https://best-books.dev"&gt;Best-Books.dev&lt;/a&gt;, check-it out.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>books</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Reflecting on my first 2 years bootstrapping</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Wed, 08 Jul 2020 12:32:48 +0000</pubDate>
      <link>https://dev.to/daolf/reflecting-on-my-first-2-years-bootstrapping-15i8</link>
      <guid>https://dev.to/daolf/reflecting-on-my-first-2-years-bootstrapping-15i8</guid>
      <description>&lt;p&gt;Hi there,&lt;/p&gt;

&lt;p&gt;In July 2018 I quit my job and tried to build a profitable SAAS with a lifelong friend of mine.&lt;/p&gt;

&lt;p&gt;The first time we failed, hard: $600 MRR after 1 year.&lt;/p&gt;

&lt;p&gt;We tried again and had a bit more luck: $75k ARR within 12m.&lt;/p&gt;

&lt;p&gt;In this thread, I laid down everything I wish I knew when I began.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7sET_fR8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/EcVRU4yWsAAOgJu.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--O4oJ33v8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1223995015741038592/2zY_Uo-d_normal.jpg" alt="Pierre de Wulf profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Pierre de Wulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @pierredewulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Reflecting on 2 years Bootstrapping.&lt;br&gt;&lt;br&gt;In July 2018 I quit my job and tried to build a profitable SAAS with &lt;a href="https://twitter.com/kevinsahin"&gt;@kevinsahin&lt;/a&gt;.&lt;br&gt;&lt;br&gt;And we failed, hard: $600 MRR after 1 year.&lt;br&gt;&lt;br&gt;We tried again and had a bit more luck: $75k ARR within 12m.&lt;br&gt;&lt;br&gt;Here's what I wish I knew when I began, a thread: 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      15:36 PM - 07 Jul 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1280526150243098627" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1280526150243098627" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1280526150243098627" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


</description>
      <category>startup</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Web Scraping 101 with Javascript and NodeJS</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Tue, 16 Jun 2020 13:26:33 +0000</pubDate>
      <link>https://dev.to/scrapingbee/web-scraping-101-with-javascript-and-nodejs-4klg</link>
      <guid>https://dev.to/scrapingbee/web-scraping-101-with-javascript-and-nodejs-4klg</guid>
      <description>&lt;p&gt;Javascript has become one of the most popular and widely used languages due to the massive improvements it has seen and the introduction of the runtime known as NodeJS. Whether it's a web or mobile application, Javascript now has the right tools. This article will explain how the vibrant ecosystem of NodeJS allows you to scrape the web efficiently to meet most of your requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  TOC
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;I. HTTP Clients&lt;/li&gt;
&lt;li&gt;II. Regular Expressions: The hard way&lt;/li&gt;
&lt;li&gt;III. Cheerio: Core JQuery for traversing the DOM&lt;/li&gt;
&lt;li&gt;IV. JSDOM: The DOM for Node&lt;/li&gt;
&lt;li&gt;V. Puppeteer: The headless browser&lt;/li&gt;
&lt;li&gt;VI. Nightmare: An alternative to Puppeteer&lt;/li&gt;
&lt;li&gt;Ressources&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;This post is primarily aimed at developers who have some level of experience with Javascript. If you have a firm understanding of Web Scraping but have no experience with Javascript, this post could still prove useful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ A background in Javascript&lt;/li&gt;
&lt;li&gt;✅ Experience using the DevTools to extract selectors of elements&lt;/li&gt;
&lt;li&gt;✅ Some experience with ES6 Javascript (Optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⭐ Make sure to check the resources topic to learn more!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Outcomes
&lt;/h3&gt;

&lt;p&gt;By reading this post will be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have a functional understanding of NodeJS&lt;/li&gt;
&lt;li&gt;Use multiple HTTP clients to assist the web scraping process&lt;/li&gt;
&lt;li&gt;Utilize multiple modern and battle-tested libraries to scrape the web &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Understanding NodeJS: A brief introduction
&lt;/h2&gt;

&lt;p&gt;Javascript is a simple and modern language that was initially created to add dynamic behavior to websites inside the browser. When a website is loaded, Javascript is run by the browser's Javascript Engine and converted into a bunch of code that the computer can understand. For Javascript to interact with your browser, the browser provides a Runtime Environment (document, window, etc.).&lt;/p&gt;

&lt;p&gt;This means that Javascript is not the kind of programming language that can interact with or manipulate the computer or it's resources directly. In a web server, for example, the server must be capable of interacting with the file system to maybe read a file or store a record in a database. &lt;/p&gt;

&lt;p&gt;Introducing NodeJS, the crux of the idea was to make Javascript capable of running not only client-side but also server-side. To make this possible, Ryan Dahl a skilled developer literally took Google Chrome's v8 Javascript Engine and embedded it with a C++ program which was named Node. So NodeJS is a runtime environment that allows an application written in Javascript to make it possible to be run at on a server as well.&lt;/p&gt;

&lt;p&gt;As opposed to how most languages like C or C++ deal with concurrency by employing multiple threads, NodeJS makes use of a single main thread and utilizes it to perform tasks in a Non-Blocking manner with the help of the &lt;a href="https://nodejs.dev/the-nodejs-event-loop"&gt;Event Loop&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Putting up a simple web server is fairly simple as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server running at PORT:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have NodeJS installed and you run the above code by typing(without the &amp;lt; and &amp;gt;) in &lt;code&gt;node &amp;lt;YourFileNameHere&amp;gt;.js&lt;/code&gt; and open up your browser and navigate to &lt;code&gt;localhost:3000&lt;/code&gt;, you will see some text saying "Hello World". NodeJS is highly ideal for applications that are I/O intensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  HTTP clients: querying the web
&lt;/h2&gt;

&lt;p&gt;HTTP clients are tools capable of sending a request to a server and then receive a response from it. Almost every tool that will be discussed uses an HTTP client under the hood, to query the server of the website that you will attempt to scrape.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request
&lt;/h3&gt;

&lt;p&gt;Request is one of the most widely used HTTP clients in the Javascript ecosystem, however, though currently, the author of the Request library has officially declared that it is deprecated. This does not mean it is unusable, quite a lot of libraries still use it, and it is every bit worth using. It is fairly simple to make an HTTP request with Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.reddit.com/r/programming.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;body&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;body:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find the Request library at &lt;a href="https://github.com/request/request"&gt;Github&lt;/a&gt;, and installing it is as simple as running &lt;code&gt;npm install request&lt;/code&gt;. You can also find the deprecation notice and what this means &lt;a href="https://github.com/request/request/issues/3142"&gt;here&lt;/a&gt;. If you don't feel safe about the fact that this library is deprecated, there's more down below!&lt;/p&gt;

&lt;h3&gt;
  
  
  Axios
&lt;/h3&gt;

&lt;p&gt;Axios is a promise-based HTTP client that runs both in the browser and NodeJS. If you use Typescript, then axios has you covered with built-in types. Making an HTTP request with Axios is straight forward, it ships with promise support by default as opposed to utilizing callbacks in Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;axios&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.reddit.com/r/programming.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you fancy the async/await syntax sugar for the Promises API, then you can do that too but since top level await is still at &lt;a href="https://github.com/tc39/proposal-top-level-await"&gt;stage 3&lt;/a&gt;, we will have to make use of an Async Function instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getForum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.reddit.com/r/programming.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And all you have to do is call &lt;code&gt;getForum&lt;/code&gt;! You can find Axios library at &lt;a href="https://github.com/axios/axios"&gt;Github&lt;/a&gt; and installing Axios is as simple as &lt;code&gt;npm install axios&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Superagent
&lt;/h3&gt;

&lt;p&gt;Much like Axios, Superagent is another robust HTTP client that has support for promises and the async/await syntax sugar. It has a fairly straightforward API like Axios, but Superagent has more dependencies and is less popular.&lt;/p&gt;

&lt;p&gt;Regardless, making an HTTP request with Superagent using promises, async/await or callbacks looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;superagent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;superagent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;forumURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.reddit.com/r/programming.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;// callbacks&lt;/span&gt;
&lt;span class="nx"&gt;superagent&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forumURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// promises&lt;/span&gt;
&lt;span class="nx"&gt;superagent&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forumURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// promises with async/await&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getForum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;superagent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forumURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find the Superagent library at &lt;a href="https://github.com/visionmedia/superagent"&gt;Github&lt;/a&gt; and installing Superagent is as simple as &lt;code&gt;npm install superagent&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For the upcoming few web scraping tools, Axios will be used as the HTTP client.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Regular Expressions: The hard way
&lt;/h2&gt;

&lt;p&gt;The simplest way to get started with web scraping without any dependencies is to use a bunch of regular expressions on the HTML string that you receive by querying a webpage using an HTTP client, but there is a big tradeoff. Regular Expressions aren't as flexible and quite a lot of people both professionals and amateurs struggle with writing the correct regular expression.&lt;/p&gt;

&lt;p&gt;For complex web scraping, the regular expression can also get out of hand very quickly. With that said, let's give it a go. Say there's a label with some username in it, and we want the username, this is similar to what you'd have to do if you relied on regular expressions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;htmlString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;label&amp;gt;Username: John Doe&amp;lt;/label&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;htmlString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;label&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;.+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;&amp;lt;&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;label&amp;gt;/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;// Username: John Doe, John Doe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Javascript, &lt;code&gt;match()&lt;/code&gt; usually returns an array with everything that matches the regular expression. The 2nd element(in index 1) you will find the &lt;code&gt;textContent&lt;/code&gt; or the &lt;code&gt;innerHTML&lt;/code&gt; of the &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;tag which is what we want. But this result contains some unwanted text ( "Username: ") which has to be removed.&lt;/p&gt;

&lt;p&gt;As you can see, for a very simple use case the steps and the work to be done are unnecessarily high. This is why you should rely on something like an HTML parser, which we will talk about next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cheerio: Core JQuery for traversing the DOM
&lt;/h2&gt;

&lt;p&gt;Cheerio is an efficient and light library which allows you to use the rich and powerful API of JQuery on the server-side. If you have used JQuery previously then you will feel right at home with Cheerio, it removes all the DOM inconsistencies and browser-related features and exposes an efficient API to parse and manipulate the DOM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cheerio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cheerio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cheerio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h2 class="title"&amp;gt;Hello world&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;h2.title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello there!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;h2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;welcome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;h2 class="title welcome"&amp;gt;Hello there!&amp;lt;/h2&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;As you can see, using Cheerio is very similar to how you'd use JQuery.&lt;/p&gt;

&lt;p&gt;However, though it does not work the same way that a web browser works, which means it does not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Render any of the parsed or manipulated DOM elements&lt;/li&gt;
&lt;li&gt;Apply CSS or load any external resource&lt;/li&gt;
&lt;li&gt;Execute javascript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if the website or web application that you are trying to crawl is Javascript heavy (for example a Single Page Application) then Cheerio is not your best bet, you might have to rely on some of the other options that are talked about later on.&lt;/p&gt;

&lt;p&gt;To demonstrate the power of Cheerio, we will attempt to crawl the &lt;a href="https://www.reddit.com/r/programming/"&gt;r/programming&lt;/a&gt; forum in Reddit, we will attempt to get a list of post names. &lt;/p&gt;

&lt;p&gt;First, install Cheerio and axios by running the following command:&lt;br&gt;
&lt;code&gt;npm install cheerio axios&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then create a new file called &lt;code&gt;crawler.js&lt;/code&gt; and copy/paste the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cheerio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cheerio&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getPostTitles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://old.reddit.com/r/programming/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cheerio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postTitles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div &amp;gt; p.title &amp;gt; a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;_idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="nx"&gt;postTitles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postTitle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;postTitles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;getPostTitles&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;postTitles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postTitles&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;getPostTitles()&lt;/code&gt; is an asynchronous function that will crawl the old reddit's r/programming forum. First the HTML of the website is obtained using a simple HTTP GET request with the axios HTTP client library, then the html data is fed into Cheerio using the &lt;code&gt;cheerio.load()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;Then with the help of the Dev Tools of the browser, you can obtain the selector that is capable of targetting all the postcards generally. If you've used JQuery, the &lt;code&gt;$('div &amp;gt; p.title &amp;gt; a')&lt;/code&gt; must be very familiar. This will get all the posts, since you only want the title of each post individually, you have to loop through each post which is done with the help of the &lt;code&gt;each()&lt;/code&gt; function. &lt;/p&gt;

&lt;p&gt;To extract the text out of each title, you must fetch the DOM element with the help of Cheerio (&lt;code&gt;el&lt;/code&gt; refers to the current element). Then calling &lt;code&gt;text()&lt;/code&gt; on each element will give you the text.&lt;/p&gt;

&lt;p&gt;Now you can pop open a terminal and run &lt;code&gt;node crawler.js&lt;/code&gt; and then you'll see an array of about 25 or 26 different post titles, it'll be quite long. While this is quite a simple use case, it demonstrates the simple nature of the API provided by Cheerio. &lt;/p&gt;

&lt;p&gt;If your use case requires the execution of Javascript and the loading of external sources, then the following few options will be helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  JSDOM: The DOM for Node
&lt;/h2&gt;

&lt;p&gt;JSDOM is a pure Javascript implementation of the Document Object Model to be used in NodeJS, as mentioned previously the DOM is not available to Node, so JSDOM is the closest you can get. It more or less emulates the browser. &lt;/p&gt;

&lt;p&gt;Since a DOM is created, it is possible to interact with the web application or website you want to crawl programmatically, so something like clicking on a button is possible. If you are familiar with manipulating the DOM, then using JSDOM will be quite straightforward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;JSDOM&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jsdom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;JSDOM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h2 class="title"&amp;gt;Hello world&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;heading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello there!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;welcome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;
&lt;span class="c1"&gt;// &amp;lt;h2 class="title welcome"&amp;gt;Hello there!&amp;lt;/h2&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;As you can see, JSDOM creates a DOM and then you can manipulate this DOM with the same methods and properties you would use while manipulating the browser DOM.&lt;/p&gt;

&lt;p&gt;To demonstrate how you could use JSDOM to interact with a website, we will get the first post of the Reddit r/programming forum and upvote it, then we will verify if the post has been upvoted. &lt;/p&gt;

&lt;p&gt;Start by running the following command to install jsdom and axios:&lt;br&gt;
&lt;code&gt;npm install jsdom axios&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then make a file by the name of &lt;code&gt;crawler.js&lt;/code&gt; and copy/paste the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;JSDOM&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jsdom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upvoteFirstPost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://old.reddit.com/r/programming/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;JSDOM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;runScripts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dangerously&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstPost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div &amp;gt; div.midcol &amp;gt; div.arrow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;firstPost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isUpvoted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstPost&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;upmod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isUpvoted&lt;/span&gt;
      &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Post has been upvoted successfully!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The post has not been upvoted!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;upvoteFirstPost&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;upvoteFirstPost()&lt;/code&gt; is an asynchronous function that will obtain the first post in r/programming and then upvote it. To do this, axios sends an HTTP GET request to fetch the HTML of the URL specified. Then a new DOM is created by feeding the HTML that was fetched earlier. The JSDOM constructor accepts the HTML as the first argument and the options as the second, the 2 options that have been added perform the following functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;runScripts&lt;/strong&gt;: When set to "dangerously", it allows the execution of event handlers and any Javascript code. If you do not have a clear idea on the credibility of the scripts that your application will run, then it is best to set runScripts to "outside-only", which attaches all the Javascript specification provided globals to the &lt;code&gt;window&lt;/code&gt; object thus preventing any script being executed on the &lt;em&gt;inside&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resources&lt;/strong&gt;: When set to "usable", it allows the loading of any external script declared using the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag (ex: the JQuery library fetched from a CDN)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the DOM has been created, you would use the same DOM methods to get the first post's upvote button and then click on it. To verify if it has indeed been clicked, you could check the &lt;code&gt;classList&lt;/code&gt; for a class called &lt;code&gt;upmod&lt;/code&gt;. If this class exists in &lt;code&gt;classList&lt;/code&gt;, then a message is returned.&lt;/p&gt;

&lt;p&gt;Now you can pop open a terminal and run &lt;code&gt;node crawler.js&lt;/code&gt; and then you'll see a neat string that will tell if the post has been upvoted or not. While this example use case is trivial, you could build on top of this to create something powerful for example, a bot that goes around upvoting a particular user's posts. &lt;/p&gt;

&lt;p&gt;If you dislike the lack of expressiveness in JSDOM, and if your crawling relies heavily on many such manipulations or if there is a need to recreate a lot of different DOMs, then the following options will be a better match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Puppeteer: The headless browser
&lt;/h2&gt;

&lt;p&gt;Puppeteer, as the name implies, allows you to manipulate the browser programmatically just like how a puppet would be manipulated by its puppeteer. It achieves this by providing a developer with a high-level API to control a headless version of Chrome by default and can be configured to run non-headless.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RisEdzQr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/746130/40333229-5df5480c-5d0c-11e8-83cb-c3e371de7374.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RisEdzQr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/746130/40333229-5df5480c-5d0c-11e8-83cb-c3e371de7374.png" alt="puppeteer-hierachy" width="880" height="861"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Taken from the Puppeter Docs (&lt;a href="https://github.com/puppeteer/puppeteer/blob/v3.0.2/docs/api.md"&gt;Source&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Puppeteer is particularly more useful than the aforementioned tools because it allows you to crawl the web as if a real person were interacting with a browser. This opens up a few possibilites that weren't there before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You can get screenshots or generate PDFs of pages.&lt;/li&gt;
&lt;li&gt;  You could crawl a Single Page Application and generate pre-rendered content.&lt;/li&gt;
&lt;li&gt;  Automate a lot of different user interactions like keyboard inputs, form submissions, navigation, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It could also play a big role in a lot of other tasks outside the scope of web crawling like UI testing, assist performance optimization, etc. &lt;/p&gt;

&lt;p&gt;It's quite often that you would want to take screenshots of websites, perhaps to get to know about a competitor's product catalog, puppeteer can be used to do this. To start, you must install puppeteer, to do so run the following command:&lt;br&gt;
&lt;code&gt;npm install puppeteer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will download a bundled version of Chromium which takes up about 180 MB to 300 MB depending on your Operating System. If you wish to disable this and point puppeteer to an already downloaded version of chromium, you must set a few &lt;a href="https://github.com/puppeteer/puppeteer/blob/v3.0.2/docs/api.md#environment-variables"&gt;environment variables&lt;/a&gt;. This, however, is not recommended, if you truly wish to avoid downloading Chromium and puppeteer for this tutorial, you can rely on the &lt;a href="https://try-puppeteer.appspot.com/"&gt;puppeteer playground&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's attempt to get a screenshot and a PDF of the r/programming forum in Reddit, create a new file called &lt;code&gt;crawler.js&lt;/code&gt; and then copy/paste the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;puppeteer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;getVisual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.reddit.com/r/programming/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puppeteer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;screenshot.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;page.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;getVisual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;getVisual()&lt;/code&gt; is an asynchronous function that will take a screenshot and a pdf of the value assigned to the &lt;code&gt;URL&lt;/code&gt; variable. To start, an instance of the browser is created by running &lt;code&gt;puppeteer.launch()&lt;/code&gt; then a new page is created. This page can be thought of like a tab in a regular browser. Then by calling &lt;code&gt;page.goto()&lt;/code&gt; with the &lt;code&gt;URL&lt;/code&gt; as the parameter, the page that was created earlier will be directed to the URL specified. Finally, the browser instance is destroyed along with the page.&lt;/p&gt;

&lt;p&gt;Once that is done and the page has finished loading, a screenshot and a pdf will be taken using &lt;code&gt;page.screenshot()&lt;/code&gt; and &lt;code&gt;page.pdf()&lt;/code&gt; respectively. You could listen to the javascript load event and then perform these actions too, which is highly recommended at a production level.&lt;/p&gt;

&lt;p&gt;To run the code type in &lt;code&gt;node crawler.js&lt;/code&gt; to the terminal, and after a few seconds, you will notice that 2 files by the names &lt;code&gt;screenshot.jpg&lt;/code&gt; and &lt;code&gt;page.pdf&lt;/code&gt; have been created.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nightmare: An alternative to Puppeteer
&lt;/h2&gt;

&lt;p&gt;Nightmare is also a high-level browser automation library like Puppeteer, that uses Electron but is said to be roughly twice as faster as it's predecessor PhantomJS and more modern. &lt;/p&gt;

&lt;p&gt;If you dislike Puppeteer in some way or feel discouraged by the size of the Chromium bundle then Nightmare is an ideal choice. To start, installghtmare library by running the following command:&lt;br&gt;
&lt;code&gt;npm install nightmare&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then once nightmare has been downloaded, we will use it to find ScrapingBee's website through the Google Search engine. To do so, create a file called &lt;code&gt;crawler.js&lt;/code&gt; and then copy/paste the following code into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Nightmare&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nightmare&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nightmare&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Nightmare&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;nightmare&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.google.com/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input[title='Search']&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ScrapingBee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input[value='Google Search']&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#rso &amp;gt; div:nth-child(1) &amp;gt; div &amp;gt; div &amp;gt; div.r &amp;gt; a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#rso &amp;gt; div:nth-child(1) &amp;gt; div &amp;gt; div &amp;gt; div.r &amp;gt; a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Scraping Bee Web Link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Search failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Firstly a Nighmare instance is created, then this instance is directed to the Google Search Engine by calling &lt;code&gt;goto()&lt;/code&gt; once it has loaded, the search box is fetched using it's selector and then the value of the search box (an input tag) is changed to "ScrapingBee". Once that is done, the search form is submitted by clicking on the "Google Search" button. Then Nightmare is told to wait till the first link has loaded, and once it has, a DOM method will be used to fetch the value of the &lt;code&gt;href&lt;/code&gt; attribute of the anchor tag that contains the link.&lt;/p&gt;

&lt;p&gt;Finally, once everything is complete, the link is printed to the console. To run the code, type in &lt;code&gt;node crawler.js&lt;/code&gt; to your terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;That was a long read! But now you understand the different ways to use NodeJS and it's rich ecosystem of libraries to crawl the web any way you want. To wrap up, you learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;NodeJS&lt;/strong&gt; is a Javascript &lt;em&gt;runtime&lt;/em&gt; to allow Javascript to be run in the &lt;em&gt;server-side&lt;/em&gt;. It has a &lt;strong&gt;non-blocking&lt;/strong&gt; nature thanks to the Event Loop.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;HTTP Clients&lt;/strong&gt; such as &lt;em&gt;Axios&lt;/em&gt;, &lt;em&gt;Superagent&lt;/em&gt;, and &lt;em&gt;Request&lt;/em&gt; are used to send HTTP requests to a &lt;em&gt;server&lt;/em&gt; and receive a response.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Cheerio&lt;/strong&gt; abstracts the best out of &lt;em&gt;JQuery&lt;/em&gt; for the sole purpose of running it in the &lt;em&gt;server-side&lt;/em&gt; for web crawling but &lt;em&gt;does not execute Javascript&lt;/em&gt; code.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;JSDOM&lt;/strong&gt; creates a DOM per the standard &lt;em&gt;Javascript specification&lt;/em&gt; out of an HTML string and allows you to perform DOM manipulations on it.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Puppeteer&lt;/strong&gt; and &lt;strong&gt;Nightmare&lt;/strong&gt; are &lt;em&gt;high-level browser automation&lt;/em&gt; libraries, that allow you to &lt;em&gt;programmatically manipulate&lt;/em&gt; web applications as if a real person were interacting with it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Feel like reading more? Check these links out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/about/"&gt;NodeJS website&lt;/a&gt; - Contains documentation and a lot of information on how to get started.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/web/tools/puppeteer"&gt;Puppeteer docs&lt;/a&gt; - Contains the API reference and getting started guides.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.scrapingbee.com/blog/"&gt;ScrapingBee's Blog&lt;/a&gt; - Contains a lot of information on Web Scraping goodies on multiple platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This blog post was originally posted on &lt;a href="https://www.scrapingbee.com/blog/web-scraping-javascript/"&gt;ScrapingBee's blog&lt;/a&gt; by Shenesh Perera&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>'JMAP (YC S10) Linux Inside is hiring': the quest for the best Hacker News title</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Sun, 05 Apr 2020 16:11:04 +0000</pubDate>
      <link>https://dev.to/daolf/jmap-yc-s10-linux-inside-is-hiring-the-quest-for-the-best-hacker-news-title-517</link>
      <guid>https://dev.to/daolf/jmap-yc-s10-linux-inside-is-hiring-the-quest-for-the-best-hacker-news-title-517</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;For those of you who don't know, &lt;a href="https://news.ycombinator.com"&gt;Hacker News&lt;/a&gt; is a successful social news website focusing on computer science and entrepreneurship visited by more than 10m people per month (source: SimilarWeb).&lt;/p&gt;

&lt;p&gt;Founded by Paul Graham, it works similarly to Reddit, users submit contents which can be upvoted by the community.&lt;br&gt;
The most upvoted content, mostly links, then reach the front-page, resulting in tens of thousands of visits for the lucky website.&lt;/p&gt;

&lt;p&gt;But the competition for the front page is fierce. Around 1000 posts get submitted each day, but most importantly, HN readers are known for valuing content quality a lot.&lt;/p&gt;

&lt;p&gt;Knowing all this, and for the sake of experiment, I wondered if some titles performed better than others and decided to see what would the best HN post title, statistically speaking, look like.&lt;/p&gt;

&lt;p&gt;To write this post, I analyzed all (2,6+ millions) HN submissions titles since 2006 and up until the end of 2019 coming from this &lt;a href="https://www.kaggle.com/santiagobasulto/all-hacker-news-posts-stories-askshow-hn-polls"&gt;dataset&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  General findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Number of submissions
&lt;/h3&gt;

&lt;p&gt;According to Similar Web HN has more than 10 millions visitors per month.&lt;/p&gt;

&lt;p&gt;Here is the number of posts per quarter since the launch of the website, as you can see, this number has been pretty stable for the last 6 years.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y7DCWCd2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y7DCWCd2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_1.png" alt="" width="823" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Points per submissions
&lt;/h3&gt;

&lt;p&gt;As said earlier, it is hard to have your post liked by the community. By default, all posts have 1 point.&lt;/p&gt;

&lt;p&gt;Some users have the ability to downvote posts and so some posts have a score of 0.&lt;/p&gt;

&lt;p&gt;Below is the distribution of posts score.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0DFLAO54--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0DFLAO54--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_2.png" alt="" width="823" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, almost 66% of all posts don't manage to have more than 2 points, which mean that 66% of all posts are not even upvoted by another person as every posts begin with a score of 1.&lt;/p&gt;

&lt;h3&gt;
  
  
  Title length distribution
&lt;/h3&gt;

&lt;p&gt;I also wanted to know the title length distribution of posts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--52hOLF3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--52hOLF3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_3.png" alt="" width="823" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The distribution is almost perfectly centered on seven. It is actually not a surprise to have a number that low, post title in HN can't exceed 80 characters.&lt;/p&gt;

&lt;p&gt;Knowing all this, let's now move to the most interesting part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quest to the perfect title
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The importance of title length
&lt;/h3&gt;

&lt;p&gt;I decided to plot the median score per number of words in post title.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bEJk8NEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bEJk8NEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_4.png" alt="" width="823" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unsurprisingly, no matter your title length, your median score will be 2 or 3. The fact that more than 66% of every posts never reach more than 2 points explains it.&lt;/p&gt;

&lt;p&gt;But if we choose to discard posts that don't perform, let's say post with less than 5 points, the chart is not really the same.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w9cp9Iv7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w9cp9Iv7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_5.png" alt="" width="823" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A good way to phrase this finding:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No matter your title length, your post won't perform well, but in the case it does, you'd want your title to be as short as possible&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was curious about those "1 word title" submissions that performs so well, here are some fun ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://news.ycombinator.com/item?id=7373566"&gt;2048&lt;/a&gt;: release of the famous game, 2903 points&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=7373566"&gt;Hyperloop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://news.ycombinator.com/item?id=7308071"&gt;Atom&lt;/a&gt;: Atom announcement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best categories
&lt;/h3&gt;

&lt;p&gt;Some submission on Hacker News relate to precise topics and follow a strict title format.&lt;br&gt;
They can be split into 5 categories:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Title format&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ask HN:&amp;lt;question&amp;gt;?&lt;/td&gt;
&lt;td&gt;People asking HN readers a particular question.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ask HN: who is hiring?&lt;/td&gt;
&lt;td&gt;Opportunity for companies to post job listing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Show HN:&amp;lt;project name&amp;gt;&lt;/td&gt;
&lt;td&gt;Showing to HN readers something you recently build: Open-source project, side-project or company.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;something&amp;gt; YC YYYY &amp;lt;something&amp;gt;?&lt;/td&gt;
&lt;td&gt;A post related to a company that did Y-Combinator.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Classic post&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It is worth noting that a post can overlap multiple categories. For example a post whose title is " Scale (YC S16) is hiring engineers to build infrastructure for AI", is counted as a "YC" post and an "is hiring" post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UeJplcXY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UeJplcXY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_6.png" alt="" width="823" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3VM7rTBx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3VM7rTBx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_7.png" alt="" width="823" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PmFEU4vO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PmFEU4vO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_8.png" alt="" width="823" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Posts related to YC companies seem to perform better than the others. However, if we only take into account posts with more thant 5 upvotes, those who talk about companies currently hiring are the champions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Top performing words
&lt;/h3&gt;

&lt;p&gt;Now let's find if some words, when they appeared in title, are correlated to posts performing better.&lt;/p&gt;

&lt;p&gt;For every posts in the dataset, I've split its title in single words, removing stop words (a, the, an, etc..).&lt;/p&gt;

&lt;p&gt;I ended up with a big array which size is  &lt;strong&gt;the number of words per titles&lt;/strong&gt; times &lt;strong&gt;the number of posts&lt;/strong&gt;, where each line was a word of one post's title associated with the score of said post.&lt;/p&gt;

&lt;p&gt;Finally I aggregated everything, and was able to find the top 50 words that had the best score.&lt;/p&gt;

&lt;p&gt;I must admit it took quite a bit of time and almost killed my 2013 MacBook pro. Below is the scatter plot of my findings.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The word "zwiebelfreunde" appeared in 7 submissions titles, and the median score of all those submission was 121 points. Impressive.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1_5qbjKC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1_5qbjKC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_9.png" alt="" width="823" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, some words really stand out.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Profit/Month" is here because of those &lt;a href="https://hn.algolia.com/?dateRange=all&amp;amp;page=0&amp;amp;prefix=true&amp;amp;query=profitmonth&amp;amp;sort=byDate&amp;amp;type=story"&gt;posts&lt;/a&gt; talking about the history of FipLab.&lt;/li&gt;
&lt;li&gt;"&lt;a href="https://mathics.github.io/"&gt;Mathics&lt;/a&gt;" is an open source alternative to Mathematica&lt;/li&gt;
&lt;li&gt;"&lt;a href="https://jmap.io/"&gt;Jmap&lt;/a&gt;" is an open API standard for modern mail clients&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;So here is what we know can make a post successful on HN:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a short title&lt;/li&gt;
&lt;li&gt;talking about a YC startup&lt;/li&gt;
&lt;li&gt;talking about hiring&lt;/li&gt;
&lt;li&gt;JMAP or LinuxInsides in the title&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hence our result for the best HN post title possible: &lt;strong&gt;"JMAP"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Ok this was a bit of a let down, let's try something else: &lt;a href="https://news.ycombinator.com/item?id=22674820"&gt;"JMAP (YC S10) Linux Inside is hiring"&lt;/a&gt; and see how it goes 🤷‍♂️.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus
&lt;/h2&gt;

&lt;p&gt;While writing this blog post I've made other fun discoveries.&lt;/p&gt;

&lt;p&gt;Those were not big enough to deserve their own article but were interesting nonetheless.&lt;/p&gt;

&lt;h3&gt;
  
  
  Most common programming language
&lt;/h3&gt;

&lt;p&gt;Here are the 25 programming language appearing the most time in HN post titles.&lt;/p&gt;

&lt;p&gt;C is not here as it was considered a stop-word.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vXqKLF7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vXqKLF7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_10.png" alt="" width="823" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  HN trend
&lt;/h3&gt;

&lt;p&gt;I've also analysed the evolution of number of occurrence of particular words in post titles over time.&lt;/p&gt;

&lt;p&gt;Here are a few:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9bU6KSBd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9bU6KSBd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/hn-title/plot_11.png" alt="" width="823" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Ask dev.to: the most generous affiliate program for developers tool?</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Fri, 27 Mar 2020 11:44:35 +0000</pubDate>
      <link>https://dev.to/daolf/ask-dev-to-the-most-generous-affiliate-program-for-developers-tool-b8f</link>
      <guid>https://dev.to/daolf/ask-dev-to-the-most-generous-affiliate-program-for-developers-tool-b8f</guid>
      <description>&lt;p&gt;Hi there, &lt;/p&gt;

&lt;p&gt;I was wondering if you knew developer tools with a generous affiliate program.&lt;/p&gt;

&lt;p&gt;Programs you are part of or programs you know are successful amongst the dev community.&lt;/p&gt;

&lt;p&gt;Thanks in advance&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Show dev.to: a 130 pages free book about web-scraping</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Thu, 12 Mar 2020 09:04:13 +0000</pubDate>
      <link>https://dev.to/daolf/show-dev-to-a-130-pages-free-book-about-web-scraping-43dp</link>
      <guid>https://dev.to/daolf/show-dev-to-a-130-pages-free-book-about-web-scraping-43dp</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hi everyone, &lt;/p&gt;

&lt;p&gt;2 years ago, I left my job full-time and joined Kevin to take the indie-hacker road.&lt;/p&gt;

&lt;p&gt;We had some ups and downs.&lt;/p&gt;

&lt;p&gt;We tanked our first product, a price monitoring application, that never managed to make money even 9 months after launch.&lt;/p&gt;

&lt;p&gt;Nevertheless, we persisted and then launched ScrapingBee, a web-scraping API.&lt;/p&gt;

&lt;p&gt;I don't know if you've been following our open report on Twitter or IndieHacker but currently, ScrapingBee is making around $4k per month.&lt;/p&gt;

&lt;p&gt;It is far from being enough to make a living out of it but we feel like we are onto something and work hard every-day to make it work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Java Web Scraping Handbook
&lt;/h2&gt;

&lt;p&gt;Today we are excited to release a 130 pages about web scraping, for free.&lt;/p&gt;

&lt;p&gt;We don't even ask about your email. &lt;/p&gt;

&lt;p&gt;The first four chapters are language agnostic, and the last can be applied to any language, so don't be scared if you don't know Java 😃&lt;/p&gt;

&lt;p&gt;By the end of the book, you will know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to scrape any website&lt;/li&gt;
&lt;li&gt;Just enough XPath / Regex / DOM knowledge to be dangerous 😈&lt;/li&gt;
&lt;li&gt;How to deal with Javascript-heavy websites (Single Page application...)&lt;/li&gt;
&lt;li&gt;How to programmatically perform actions on a website behind a login form 🤖&lt;/li&gt;
&lt;li&gt;Parse information inside PDFs 📑&lt;/li&gt;
&lt;li&gt;Bypass captchas ⛔️&lt;/li&gt;
&lt;li&gt;Deploy your scrapers in the cloud ☁️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The book is available &lt;a href="https://www.scrapingbee.com/java-webscraping-book/"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Happy Scraping&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>books</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The 25 most recommended Python books of all-time.</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Wed, 04 Mar 2020 14:51:54 +0000</pubDate>
      <link>https://dev.to/daolf/the-25-most-recommended-python-books-of-all-time-56kd</link>
      <guid>https://dev.to/daolf/the-25-most-recommended-python-books-of-all-time-56kd</guid>
      <description>&lt;p&gt;This article is a follow up of the one I did about the &lt;a href="https://dev.to/posts/best-programming-books/"&gt;the most recommended programming books of all-time&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've read this one recently. I guess you can jump straight to the results.&lt;/p&gt;

&lt;p&gt;There are countless lists on the internet claiming to be &lt;strong&gt;the&lt;/strong&gt; list of must-read python books and it seemed that all those lists always recommended that same books minus two or three odd choices.&lt;/p&gt;

&lt;p&gt;Finding good resources for learning programming is always tricky. Every-one has its own opinion about what book is the best to learn, and as we say in french, "Color and tastes should not be argued about".&lt;/p&gt;

&lt;p&gt;However I thought it would be interesting to trust the wisdom of the crown and to find the books that appeared the most in those "Best Python Book" lists.&lt;/p&gt;

&lt;p&gt;If you want to jump right on the results go take a look below at the full results. If you want to learn about the methodology, bear with me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I spent countless hours on this article so I've decided to put Amazon affiliation links to see if those kinds of detailed articles could be a viable source of revenue, ... or not 🤷‍♂️.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology:
&lt;/h2&gt;

&lt;p&gt;I've simply asked Google for a few queries like "Best Python Books" and its variations of. I have then scrapped all those pages (using ScrapingBee, a web scraping API I'm working on).&lt;/p&gt;

&lt;p&gt;I've deduplicated the links and ended up with nearly 170 links. Using the title of the pages I was also able to quickly discards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list focused on one particular technology or platform&lt;/li&gt;
&lt;li&gt;list focused on one particular year&lt;/li&gt;
&lt;li&gt;list focused on free books&lt;/li&gt;
&lt;li&gt;Quora and Reddit threads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ended up with almost 130 HTML files. I went on opening all the files on my browser, open my chrome inspector, found and wrote the CSS selector matching book titles in the article. This took me around 1hours, almost 30 seconds per page. &lt;/p&gt;

&lt;p&gt;This also allowed me to discard even more nonrelevant pages, and I discarded a lot. In the end I compiled around 70 lists into this one.&lt;/p&gt;

&lt;p&gt;Book titles were then extracted with manuel extraction and some web scraping. &lt;/p&gt;

&lt;p&gt;I ended up with a huge list of books, not usable without some post-processing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yQ6EWK8Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/links.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yQ6EWK8Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/links.png" alt="" width="796" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To find the most quoted python books I needed to normalize my results. &lt;/p&gt;

&lt;p&gt;I had to play with  all the different variation like "{title} by {author}" or "{title} - {author}".&lt;/p&gt;

&lt;p&gt;Or "{title}:{subtitle}" and "{title}", or even all the one containing edition number. &lt;/p&gt;

&lt;p&gt;I ended up doing it using this simple custom Python function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'ascii'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'ignore'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'the'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'by'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;':'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'('&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and quite a bit of manual cleaning.&lt;/p&gt;

&lt;p&gt;My list now looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VO-aFmjF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/clean_links.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VO-aFmjF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/programming_book_list/clean_links.png" alt="" width="822" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From there it was easy to compute the most recommended books. You can find all the data used to process this list on this &lt;a href="https://github.com/daolf/Most-recommended-programming-books"&gt;repo&lt;/a&gt;. Now let's take a look at the list:&lt;/p&gt;

&lt;h2&gt;
  
  
  25 most recommended Python books of all-time
&lt;/h2&gt;

&lt;h4&gt;
  
  
  25. &lt;a href="https://amzn.to/2VFKJcf"&gt;Python: Learn Python in One Day and Learn It Well&lt;/a&gt; by Jamie Chan (7.9% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bQnxG94N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/25.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bQnxG94N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/25.png%23center" alt="" width="376" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Have you always wanted to learn computer programming but are afraid it'll be too difficult for you? Or perhaps you know other programming languages but are interested in learning the Python language fast?&lt;/p&gt;

&lt;p&gt;This book is for you. You no longer have to waste your time and money learning Python from lengthy books, expensive online courses or complicated Python tutorials." &lt;a href="https://amzn.to/2VFKJcf"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  24. &lt;a href="https://amzn.to/38jS9V5"&gt;Deep Learning with Python&lt;/a&gt; by François Chollet (7.9% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h3tWgDu_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/24.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h3tWgDu_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/24.png%23center" alt="" width="400" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This book was written for anyone who wishes to explore deep learning from scratch or broaden their understanding of deep learning. Whether you’re a practicing machine-learning engineer, a software developer, or a college student, you’ll find value in these pages. This book offers a practical, hands-on exploration of deep learning. It avoids mathematical notation, preferring instead to explain quantitative concepts via code snippets and to build practical intuition about the core ideas of machine learning and deep learning. &lt;/p&gt;

&lt;p&gt;You’ll learn from more than 30 code examples that include detailed commentary, practical recommendations, and simple high-level explanations of everything you need to know to start using deep learning to solve concrete problems. The code examples use the Python deep-learning framework Keras, with Tensor- Flow as a back-end engine. Keras, one of the most popular and fastest-growing deeplearning frameworks, is widely recommended as the best tool to get started with deep learning." &lt;a href="https://amzn.to/38jS9V5"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  23. &lt;a href="https://amzn.to/38gvLw1"&gt;Python Data Science Handbook&lt;/a&gt; by Jake VanderPlas (7.9% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U67eeWjY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/23.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U67eeWjY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/23.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"For many researchers, Python is a first-class tool mainly because of its libraries for storing, manipulating, and gaining insight from data. Several resources exist for individual pieces of this data science stack, but only with the Python Data Science Handbook do you get them all—IPython, NumPy, Pandas, Matplotlib, Scikit-Learn, and other related tools.&lt;/p&gt;

&lt;p&gt;Working scientists and data crunchers familiar with reading and writing Python code will find this comprehensive desk reference ideal for tackling day-to-day issues: manipulating, transforming, and cleaning data; visualizing different types of data; and using data to build statistical or machine learning models. Quite simply, this is the must-have reference for scientific computing in Python." &lt;a href="https://amzn.to/38gvLw1"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  22. &lt;a href="https://amzn.to/32K1aFW"&gt;Violent Python&lt;/a&gt; by TJ O'Connor (8.8% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t79CYJ4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/22.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t79CYJ4X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/22.png%23center" alt="" width="405" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Violent Python shows you how to move from a theoretical understanding of offensive computing concepts to a practical implementation. Instead of relying on another attacker’s tools, this book will teach you to forge your own weapons using the Python programming language. This book demonstrates how to write Python scripts to automate large-scale network attacks, extract metadata, and investigate forensic artifacts. &lt;/p&gt;

&lt;p&gt;It also shows how to write code to intercept and analyze network traffic using Python, craft and spoof wireless frames to attack wireless and Bluetooth devices, and how to data-mine popular social media websites and evade modern anti-virus." &lt;a href="https://amzn.to/32K1aFW"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  21. &lt;a href="https://amzn.to/2vzPcCz"&gt;Natural Language Processing with Python&lt;/a&gt; by Steven Bird &amp;amp; Ewan Klein &amp;amp; Edward Loper (9.6% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VrlE8WIp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/21.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VrlE8WIp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/21.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This book offers a highly accessible introduction to natural language processing, the field that supports a variety of language technologies, from predictive text and email filtering to automatic summarization and translation. With it, you'll learn how to write Python programs that work with large collections of unstructured text. You'll access richly annotated datasets using a comprehensive range of linguistic data structures, and you'll understand the main algorithms for analyzing the content and structure of written communication. &lt;/p&gt;

&lt;p&gt;Packed with examples and exercises, Natural Language Processing with Python will help you: Extract information from unstructured text, either to guess the topic or identify 'named entities' Analyze linguistic structure in text, including parsing and semantic analysis Access popular linguistic databases, including WordNet and treebanks Integrate techniques drawn from fields as diverse as linguistics and artificial intelligence This book will help you gain practical skills in natural language processing using the Python programming language and the Natural Language Toolkit (Nltk) open source library. &lt;/p&gt;

&lt;p&gt;If you're interested in developing web applications, analyzing multilingual news sources, or documenting endangered languages - or if you're simply curious to have a programmer's perspective on how human language works - you'll find Natural Language Processing with Python both fascinating and immensely useful." &lt;a href="https://amzn.to/2vzPcCz"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  20. &lt;a href="https://amzn.to/3cqwH45"&gt;The Hitchhiker's Guide to Python&lt;/a&gt; by Kenneth Reitz &amp;amp; Tanya Schlusser (9.6% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bwjv1dEs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/20.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bwjv1dEs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/20.png%23center" alt="" width="379" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"The Hitchhiker's Guide to Python takes the journeyman Pythonista to true expertise. More than any other language, Python was created with the philosophy of simplicity and parsimony. Now 25 years old, Python has become the primary or secondary language (after SQL) for many business users. With popularity comes diversity—and possibly dilution.&lt;/p&gt;

&lt;p&gt;This guide, collaboratively written by over a hundred members of the Python community, describes best practices currently used by package and application developers. Unlike other books for this audience, The Hitchhiker’s Guide is light on reusable code and heavier on design philosophy, directing the reader to excellent sources that already exist." &lt;a href="https://amzn.to/3cqwH45"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  19. &lt;a href="https://amzn.to/2vzOIML"&gt;Python Pocket Reference&lt;/a&gt; by Mark Lutz (10.5% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rNbvMqYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/19.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rNbvMqYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/19.png%23center" alt="" width="306" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This convenient pocket guide is the perfect on-the-job quick reference. You’ll find concise, need-to-know information on Python types and statements, special method names, built-in functions and exceptions, commonly used standard library modules, and other prominent Python tools. The handy index lets you pinpoint exactly what you need.&lt;/p&gt;

&lt;p&gt;Written by Mark Lutz—widely recognized as the world’s leading Python trainer—Python Pocket Reference is an ideal companion to O’Reilly’s classic Python tutorials, Learning Python and Programming Python, also written by Mark." &lt;a href="https://amzn.to/2vzOIML"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  18. &lt;a href="https://amzn.to/3ao8ucN"&gt;Invent Your Own Computer Games with Python&lt;/a&gt; by Al Sweigart (10.5% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T2xxH1RX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/18.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T2xxH1RX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/18.png%23center" alt="" width="378" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Begin by building classic games like Hangman, Guess the Number, and Tic-Tac-Toe, and then work your way up to more advanced games, like a text-based treasure hunting game and an animated collision-dodging game with sound effects. Along the way, you’ll learn key programming and math concepts that will help you take your game programming to the next level." &lt;a href="https://amzn.to/3ao8ucN"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  17. &lt;a href="https://amzn.to/2IdkJgr"&gt;Python in a Nutshell&lt;/a&gt; by Alex Martelli &amp;amp; Anna Ravenscroft &amp;amp; Steve Holden (11.4% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ua7LpfYu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/17.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ua7LpfYu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/17.png%23center" alt="" width="333" height="499"&gt;&lt;/a&gt;&lt;br&gt;
"Useful in many roles, from design and prototyping to testing, deployment, and maintenance, Python is consistently ranked among today’s most popular programming languages. The third edition of this practical book provides a quick reference to the language—including Python 3.5, 2.7, and highlights of 3.6—commonly used areas of its vast standard library, and some of the most useful third-party modules and packages. &lt;/p&gt;

&lt;p&gt;Ideal for programmers with some Python experience, and those coming to Python from other programming languages, this book covers a wide range of application areas, including web and network programming, XML handling, database interactions, and high-speed numeric computing. Discover how Python provides a unique mix of elegance, simplicity, practicality, and sheer power." &lt;a href="https://amzn.to/2IdkJgr"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  16. &lt;a href="https://amzn.to/3coXmhI"&gt;Introduction to Machine Learning with Python&lt;/a&gt; by  Andreas C. Müller &amp;amp; Sarah Guido (12.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c52x2XRw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/16.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c52x2XRw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/16.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;br&gt;
"Machine learning has become an integral part of many commercial applications and research projects, but this field is not exclusive to large companies with extensive research teams. If you use Python, even as a beginner, this book will teach you practical ways to build your own machine learning solutions. With all the data available today, machine learning applications are limited only by your imagination. &lt;/p&gt;

&lt;p&gt;You’ll learn the steps necessary to create a successful machine-learning application with Python and the scikit-learn library. Authors Andreas Müller and Sarah Guido focus on the practical aspects of using machine learning algorithms, rather than the math behind them. Familiarity with the NumPy and matplotlib libraries will help you get even more from this book." &lt;a href="https://amzn.to/3coXmhI"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  15. &lt;a href="https://amzn.to/3aiYZLY"&gt;Programming Python&lt;/a&gt; by Mark Lutz (12.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L_hCB0L_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/15.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L_hCB0L_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/15.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"If you've mastered Python's fundamentals, you're ready to start using it to get real work done. Programming Python will show you how, with in depth tutorials on the language's primary application domains: system administration, GUIs, and the Web. You'll also explore how Python is used in databases, networking, front end scripting layers, text processing, and more. This book focuses on commonly used tools and libraries to give you a comprehensive understanding of Python’s many roles in practical, real world programming.&lt;/p&gt;

&lt;p&gt;You'll learn language syntax and programming techniques in a clear and concise manner, with lots of examples that illustrate both correct usage and common idioms. Completely updated for version 3.x, Programming Python also delves into the language as a software development tool, with many code examples scaled specifically for that purpose." &lt;a href="https://amzn.to/3aiYZLY"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  14. &lt;a href="https://amzn.to/2VHnI8A"&gt;David Beazley&lt;/a&gt; by Python Essential Reference (14.0% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NRTjseH_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/14.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NRTjseH_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/14.png%23center" alt="" width="334" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Python Essential Reference is the definitive reference guide to the Python programming language — the one authoritative handbook that reliably untangles and explains both the core Python language and the most essential parts of the Python library.&lt;/p&gt;

&lt;p&gt;Designed for the professional programmer, the book is concise, to the point, and highly accessible. It also includes detailed information on the Python library and many advanced subjects that is not available in either the official Python documentation or any other single reference source.&lt;/p&gt;

&lt;p&gt;Thoroughly updated to reflect the significant new programming language features and library modules that have been introduced in Python 2.6 and Python 3, the fourth edition of Python Essential Reference is the definitive guide for programmers who need to modernize existing Python code or who are planning an eventual migration to Python 3. Programmers starting a new Python project will find detailed coverage of contemporary Python programming idioms." &lt;a href="https://amzn.to/2VHnI8A"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  13. &lt;a href="https://amzn.to/38fd8Ze"&gt;Dive into Python 3&lt;/a&gt; by  Mark Pilgrim (14.0% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PUE46rVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/13.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PUE46rVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/13.png%23center" alt="" width="378" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"There are a huge number of python developers who will need to learn to port their code to python 3, and Dive Into Python 3 is the ideal hands-on introduction to the latest version of python for them. Its unique style of giving a chunk of code first and then picking it apart is ideally suited to existing developers who want to understand the new version of the language quickly." &lt;a href="https://amzn.to/38fd8Ze"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  12. &lt;a href="https://amzn.to/3cta5A0"&gt;Python Machine Learning&lt;/a&gt; by Sebastian Raschka &amp;amp; Vahid Mirjalili (14.9% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kryxYmuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/12.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kryxYmuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/12.png%23center" alt="" width="406" height="500"&gt;&lt;/a&gt;&lt;br&gt;
"is a comprehensive guide to machine learning and deep learning with Python. It acts as both a step-by-step tutorial, and a reference you'll keep coming back to as you build your machine learning systems.&lt;/p&gt;

&lt;p&gt;Packed with clear explanations, visualizations, and working examples, the book covers all the essential machine learning techniques in depth. While some books teach you only to follow instructions, with this machine learning book, Raschka and Mirjalili teach the principles behind machine learning, allowing you to build models and applications for yourself." &lt;a href="https://amzn.to/3cta5A0"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  11. &lt;a href="https://amzn.to/3crKx6j"&gt;Python Tricks&lt;/a&gt; by Dan Bader (14.9% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YQ671MEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/11.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YQ671MEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/11.png%23center" alt="" width="333" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"With Python Tricks: The Book you’ll discover Python’s best practices and the power of beautiful &amp;amp; Pythonic code with simple examples and a step-by-step narrative. &lt;/p&gt;

&lt;p&gt;You'll get one step closer to mastering Python, so you can write beautiful and idiomatic code that comes to you naturally. &lt;/p&gt;

&lt;p&gt;Learning the ins and outs of Python is difficult—and with this book you'll be able to focus on the practical skills that really matter. Discover the “hidden gold” in Python’s standard library and start writing clean and Pythonic code today." &lt;a href="https://amzn.to/3crKx6j"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  10. &lt;a href="https://amzn.to/2x2gXnz"&gt;Think Python: How to Think Like a Computer Scientist&lt;/a&gt; by Allen B. Downey  (19.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4PnchXKY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/10.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4PnchXKY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/10.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"If you want to learn how to program, working with Python is an excellent way to start. This hands-on guide takes you through the language a step at a time, beginning with basic programming concepts before moving on to functions, recursion, data structures, and object-oriented design. This second edition and its supporting code have been updated for Python 3. &lt;/p&gt;

&lt;p&gt;Through exercises in each chapter, you’ll try out programming concepts as you learn them. Think Python is ideal for students at the high school or college level, as well as self-learners, home-schooled students, and professionals who need to learn programming basics. Beginners just getting their feet wet will learn how to start with Python in a browser." &lt;a href="https://amzn.to/2x2gXnz"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  9. &lt;a href="https://amzn.to/3aiXTzQ"&gt;Effective Python&lt;/a&gt; by Brett Slatkin (19.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r8x7YF7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/9.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r8x7YF7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/9.png%23center" alt="" width="380" height="499"&gt;&lt;/a&gt;&lt;br&gt;
"It’s easy to start developing programs with Python, which is why the language is so popular. However, Python’s unique strengths, charms, and expressiveness can be hard to grasp, and there are hidden pitfalls that can easily trip you up." &lt;a href="https://amzn.to/3aiXTzQ"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  8. &lt;a href="https://amzn.to/2uQ5p6l"&gt;Python for Data Analysis&lt;/a&gt; by Wes McKinney (20.2% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bBRwvkLN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/8.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bBRwvkLN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/8.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This book is concerned with the nuts and bolts of manipulating, processing, cleaning, and crunching data in Python. My goal is to offer a guide to the parts of the Python programming language and its data-oriented library ecosystem and tools that will equip you to become an effective data analyst. While 'data analysis' is in the title of the book, the focus is specifically on Python programming, libraries, and tools as opposed to data analysis methodology. This is the Python programming you need for data analysis." &lt;a href="https://amzn.to/2uQ5p6l"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  7. &lt;a href="https://amzn.to/2x9ONY0"&gt;Learn Python the Hard Way&lt;/a&gt; by Zed Shaw (21.1% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GfnwTAQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/7.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GfnwTAQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/7.png%23center" alt="" width="382" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Zed Shaw has perfected the world’s best system for learning Python 3. Follow it and you will succeed—just like the millions of beginners Zed has taught to date! You bring the discipline, commitment, and persistence; the author supplies everything else." &lt;a href="https://amzn.to/2x9ONY0"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  6. &lt;a href="https://amzn.to/2Tj8WDn"&gt;Automate the Boring Stuff with Python&lt;/a&gt; by Al Sweigart (23.7% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JFP9cn4d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/6.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JFP9cn4d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/6.png%23center" alt="" width="378" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"If you've ever spent hours renaming files or updating hundreds of spreadsheet cells, you know how tedious tasks like these can be. But what if you could have your computer do them for you? &lt;/p&gt;

&lt;p&gt;In this fully revised second edition of the best-selling classic Automate the Boring Stuff with Python, you'll learn how to use Python to write programs that do in minutes what would take you hours to do by hand--no prior programming experience required. You'll learn the basics Python and explore Python's rich library of modules for performing specific tasks, like scraping data off websites, reading PDF and Word documents, and automating clicking and typing tasks." &lt;a href="https://amzn.to/2Tj8WDn"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  5. &lt;a href="https://amzn.to/2wt9KwQ"&gt;Head First Python: A Brain-Friendly Guide&lt;/a&gt; by Paul Barry (25.4% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HQW5k9rA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/5.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HQW5k9rA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/5.png%23center" alt="" width="435" height="500"&gt;&lt;/a&gt;&lt;br&gt;
"Want to learn the Python language without slogging your way through how to manuals? With Head First Python, you’ll quickly grasp Python’s fundamentals, working with the built in data structures and functions. Then you’ll move on to building your very own webapp, exploring database management, exception handling, and data wrangling. If you’re intrigued by what you can do with context managers, decorators, comprehensions, and generators, it’s all here. This second edition is a complete learning experience that will help you become a bonafide Python programmer in no time." &lt;a href="https://amzn.to/2wt9KwQ"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  4. &lt;a href="https://amzn.to/2VKa5G0"&gt;Python Crash Course&lt;/a&gt; by Eric Matthes  (33.3% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rV_hGlxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/4.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rV_hGlxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/4.png%23center" alt="" width="378" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"is a straightforward introduction to the core of Python programming. Author Eric Matthes dispenses with the sort of tedious, unnecessary information that can get in the way of learning how to program, choosing instead to provide a foundation in general programming concepts, Python fundamentals, and problem solving. Three real world projects in the second part of the book allow readers to apply their knowledge in useful ways.&lt;/p&gt;

&lt;p&gt;Readers will learn how to create a simple video game, use data visualization techniques to make graphs and charts, and build and deploy an interactive web application. Python Crash Course, 2nd Edition teaches beginners the essentials of Python quickly so that they can build practical programs and develop powerful programming techniques." &lt;a href="https://amzn.to/2VKa5G0"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  3. &lt;a href="https://amzn.to/2IgGQ5A"&gt;Fluent Python&lt;/a&gt; by Luciano Ramalho (35.1% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vduepXGn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/3.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vduepXGn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/3.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Python’s simplicity lets you become productive quickly, but this often means you aren’t using everything it has to offer. With this hands-on guide, you’ll learn how to write effective, idiomatic Python code by leveraging its best—and possibly most neglected—features. Author Luciano Ramalho takes you through Python’s core language features and libraries, and shows you how to make your code shorter, faster, and more readable at the same time. &lt;/p&gt;

&lt;p&gt;Many experienced programmers try to bend Python to fit patterns they learned from other languages, and never discover Python features outside of their experience. With this book, those Python programmers will thoroughly learn how to become proficient in Python 3." &lt;a href="https://amzn.to/2IgGQ5A"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. &lt;a href="https://amzn.to/2TCfXhw"&gt;Python Cookbook&lt;/a&gt; by David Beazley &amp;amp; Brian K. Jones (36.0% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HcezMNwl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/2.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HcezMNwl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/2.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"If you need help writing programs in Python 3, or want to update older Python 2 code, this book is just the ticket. Packed with practical recipes written and tested with Python 3.3, this unique cookbook is for experienced Python programmers who want to focus on modern tools and idioms. &lt;/p&gt;

&lt;p&gt;Inside, you’ll find complete recipes for more than a dozen topics, covering the core Python language as well as tasks common to a wide variety of application domains. Each recipe contains code samples you can use in your projects right away, along with a discussion about how and why the solution works." &lt;a href="https://amzn.to/2TCfXhw"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  1. &lt;a href="https://amzn.to/3cvghHw"&gt;Learning Python&lt;/a&gt; by Mark Lutz (36.0% recommended)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5v5d3IC6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/1.png%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5v5d3IC6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python_book_list/1.png%23center" alt="" width="381" height="499"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Although the order might suprise some, by definition, most of you must have heard of these books already.&lt;/p&gt;

&lt;p&gt;A few additional things I learned making this list: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O'Reilly is the big winner of this list with 12 books in the top 25&lt;/li&gt;
&lt;li&gt;I'm happy to see one of my favorite editor, No Starch Press with 4 books in the list&lt;/li&gt;
&lt;li&gt;Mark Lutz it the author of 3 books&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you enjoyed this article. &lt;/p&gt;

&lt;p&gt;I must admit, this one took a while to write. If you liked this article and feel like Twitter would like it please do not hesitate to love and retweet, it really does help :).  &lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--O4oJ33v8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1223995015741038592/2zY_Uo-d_normal.jpg" alt="Pierre de Wulf profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Pierre de Wulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @pierredewulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      This time: Python 🐍. &lt;br&gt;&lt;br&gt;I wanted to know what were the most recommended Python books ever 🏆&lt;br&gt;&lt;br&gt;So I've compiled more than 2000 recommendations from 130 lists and came up with this top 25 most recommended Python books of all-time 📕&lt;br&gt;&lt;br&gt;THREAD 👇
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      14:51 PM - 04 Mar 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1235216215620169728" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1235216215620169728" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1235216215620169728" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;(do NOT create an account just for this though)&lt;/p&gt;

&lt;p&gt;Do not hesitate to follow me if you don't want to miss my next posts. I write about tech, my bootstrapping journey and I occasionnaly write more data analysis article like this one.&lt;/p&gt;

</description>
      <category>books</category>
      <category>beginners</category>
      <category>python</category>
      <category>career</category>
    </item>
    <item>
      <title>Show dev.to: an A/B test checker</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Sat, 29 Feb 2020 17:15:07 +0000</pubDate>
      <link>https://dev.to/daolf/show-dev-to-an-a-b-test-checker-49e0</link>
      <guid>https://dev.to/daolf/show-dev-to-an-a-b-test-checker-49e0</guid>
      <description>&lt;p&gt;Hi everyone, &lt;/p&gt;

&lt;p&gt;Too many times I saw people on Facebook happy that their conversion increased from 1.1% to 2% with less than 500 visits, the truth is, there is no way to be sure that their conversion actually changed with only 500 visits and such a low conversion rate.&lt;/p&gt;

&lt;p&gt;This is because of something called the "p-value". In short, the "p-value" is a Mathematical value that measures how statistically significant is a hypothesis. &lt;/p&gt;

&lt;p&gt;In our case, the hypothesis could be: A is performing better than B in our A/B test or, this ad on Facebook is converting more.&lt;/p&gt;

&lt;p&gt;This is, of course, an oversimplification, but in short, the p-value can tell you if you can draw a conclusion with your results or if you should wait to have a bigger sample.&lt;/p&gt;

&lt;p&gt;I've made this &lt;a href="https://www.abtestchecker.com/"&gt;small tool&lt;/a&gt; to help you draw a conclusion from your A/B tests that I hope you will like and find interesting. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vp0bzujy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1mw8l84tfrfd8rzcbaf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vp0bzujy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1mw8l84tfrfd8rzcbaf6.png" alt="Alt Text" width="823" height="735"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This thing took me quite a bit of time to code, so if you think twitter would like it, do not hesitate to share it, it helps a lot 🙏😉&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--O4oJ33v8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1223995015741038592/2zY_Uo-d_normal.jpg" alt="Pierre de Wulf profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Pierre de Wulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @pierredewulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      People tend to draw conclusion from their A/B tests when actually they should not📈.&lt;br&gt;&lt;br&gt;You often can't be sure if B is better than A without computing the p-value 🤓&lt;br&gt;&lt;br&gt;To make this process as easy as possible I've made this 👇&lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/G3sLmLrv56"&gt;abtestchecker.com&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      17:11 PM - 29 Feb 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1233802055720087552" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1233802055720087552" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1233802055720087552" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;(but do NOT create an account just for this though)&lt;/p&gt;

&lt;p&gt;If you want to read more about it you can this &lt;a href="https://www.freecodecamp.org/news/what-is-statistical-significance-p-value-defined-and-how-to-calculate-it/"&gt;excellent post&lt;/a&gt; on FCC.com.&lt;/p&gt;

&lt;p&gt;Do not hesitate to &lt;a href="https://twitter.com/PierreDeWulf"&gt;follow me&lt;/a&gt; if you don't want to miss my next posts. I write about tech, my bootstrapping journey and I occasionally write more data analysis articles.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The 25 most recommended programming books of all-time.</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Tue, 18 Feb 2020 11:28:46 +0000</pubDate>
      <link>https://dev.to/daolf/the-25-most-recommended-programming-books-of-all-time-5fel</link>
      <guid>https://dev.to/daolf/the-25-most-recommended-programming-books-of-all-time-5fel</guid>
      <description>&lt;p&gt;This article is a follow up of the one I did about the &lt;a href="https://dev.to/daolf/the-25-most-recommended-startup-books-of-all-time-2o2h"&gt;the most recommended startup books of all-time&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've read this one recently. I guess you can jump straight to the results.&lt;/p&gt;

&lt;p&gt;There are countless lists on the internet claiming to be &lt;strong&gt;the&lt;/strong&gt; list of must-read programming books and it seemed that all those lists always recommended that same books minus two or three odd choices.&lt;/p&gt;

&lt;p&gt;Finding good resources for learning programming is always tricky. Every-one has its own opinion about what book is the best to learn, and as we say in french, "Color and tastes should not be argued about".&lt;/p&gt;

&lt;p&gt;However I thought it would be interesting to trust the wisdom of the crown and to find the books that appeared the most in those "Best Programming Book" lists.&lt;/p&gt;

&lt;p&gt;If you want to jump right on the results go take a look below at the full results. If you want to learn about the methodology, bear with me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I spent countless hours on this article so I've decided to put Amazon affiliation links to see if those kinds of detailed articles could be a viable source of revenue, ... or not 🤷‍♂️.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology:
&lt;/h2&gt;

&lt;p&gt;I've simply asked Google for a few queries like "Best Programming Books" and its variations. I have then scrapped all those pages (using ScrapingBee, a web scraping API I'm working on).&lt;/p&gt;

&lt;p&gt;I've deduplicated the links and ended up with nearly 150 links. Using the title of the pages I was also able to quickly discards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list focussed on one particular technology or platform&lt;/li&gt;
&lt;li&gt;list focussed on one particular year&lt;/li&gt;
&lt;li&gt;list focussed on free books&lt;/li&gt;
&lt;li&gt;Quora and Reddit threads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ended up with almost 200 HTML files. I went on opening all the files on my browser, open my chrome inspector, found and wrote the CSS selector matching book titles in the article. This took me around 1hours, almost 30 seconds per page. &lt;/p&gt;

&lt;p&gt;This also allowed me to discard even more nonrelevant pages, and I discarded a lot. In the end, I compiled around 70 lists into this one.&lt;/p&gt;

&lt;p&gt;At this moment I had this big JSON file referencing the HTML page previously scrapped, and a CSS selector.&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2Frules.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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2Frules.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Python with Beautiful soup, I've extracted every text inside DOM elements that matched the CSS selector. I ended up with a huge list of books, not usable without some post-processing.&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2Flinks.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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2Flinks.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To find the most quoted startup books I needed to normalize my results. &lt;/p&gt;

&lt;p&gt;I had to play with  all the different variation like "{title} by {author}" or "{title} - {author}".&lt;/p&gt;

&lt;p&gt;Or "{title}:{subtitle}" and "{title}", or even all the one containing edition number. &lt;/p&gt;

&lt;p&gt;I ended up doing it using this simple custom Python function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ascii&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ignore&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;by&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and quite a bit of manual cleaning.&lt;/p&gt;

&lt;p&gt;My list now looked 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2Fclean_links.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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2Fclean_links.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From there it was easy to compute the most recommended books. You can find all the data used to process this list on this &lt;a href="https://github.com/daolf/Most-recommended-programming-books" rel="noopener noreferrer"&gt;repo&lt;/a&gt;. Now let's take a look at the list:&lt;/p&gt;

&lt;h2&gt;
  
  
  25 most recommended programming books of all-time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  25. &lt;a href="https://amzn.to/2OZ9JXS" rel="noopener noreferrer"&gt;Continuous Delivery&lt;/a&gt; by Jez Humble &amp;amp; David Farley (8.8% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F25.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F25.jpg%23center"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Getting software released to users is often a painful, risky, and time-consuming process. This groundbreaking new book sets out the principles and technical practices that enable rapid, incremental delivery of high quality, valuable new functionality to users. Through automation of the build, deployment, and testing process, and improved collaboration between developers, testers, and operations, delivery teams can get changes released in a matter of hours, sometimes even minutes–no matter what the size of a project or the complexity of its code base.&lt;/p&gt;

&lt;p&gt;Jez Humble and David Farley begin by presenting the foundations of a rapid, reliable, low-risk delivery process. Next, they introduce the “deployment pipeline,” an automated process for managing all changes, from check-in to release. Finally, they discuss the “ecosystem” needed to&lt;br&gt;
support continuous delivery, from infrastructure, data and configuration management to governance." &lt;a href="https://amzn.to/2OZ9JXS" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  24. &lt;a href="https://amzn.to/2u2vpuG" rel="noopener noreferrer"&gt;Algorithms&lt;/a&gt; by Robert Sedgewick &amp;amp; Kevin Wayne (8.8% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F24.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F24.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"The algorithms in this book represent a body of knowledge developed over the last 50 years that has become indispensable, not just for professional programmers and computer science students but for any student with interests in science, mathematics, and engineering, not to mention students who use computation in the liberal arts."&lt;a href="https://amzn.to/2u2vpuG" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  23. &lt;a href="https://amzn.to/325cN9T" rel="noopener noreferrer"&gt;The Self-Taught Programmer&lt;/a&gt; by Cory Althoff (8.8% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F23.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F23.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"I am a self-taught programmer. After a year of self-study, I learned to program well enough to land a job as a software engineer II at eBay. &lt;/p&gt;

&lt;p&gt;Once I got there, I realized I was severely under-prepared. I was overwhelmed by the amount of things I needed to know but hadn't learned yet. My journey learning to program, and my experience at my first job as a software engineer were the inspiration for this book. &lt;/p&gt;

&lt;p&gt;This book is not just about learning to program; although you will learn to code. If you want to program professionally, it is not enough to learn to code; that is why, in addition to helping you learn to program, I also cover the rest of the things you need to know to program professionally that classes and books don't teach you. &lt;/p&gt;

&lt;p&gt;"The Self-taught Programmer" is a roadmap, a guide to take you from writing your first Python program, to passing your first technical interview. The path is there. Will you take it?"&lt;a href="https://amzn.to/325cN9T" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  22. &lt;a href="https://amzn.to/2SQLQTn" rel="noopener noreferrer"&gt;Rapid Development&lt;/a&gt; by Steve McConnell (8.8% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F22.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F22.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Corporate and commercial software-development teams all want solutions for one important problem—how to get their high-pressure development schedules under control. In RAPID DEVELOPMENT, author Steve McConnell addresses that concern head-on with overall strategies, specific best practices, and valuable tips that help shrink and control development schedules and keep projects moving. Inside, you’ll find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A rapid-development strategy that can be applied to any project and the best practices to make that strategy work&lt;/li&gt;
&lt;li&gt;Candid discussions of great and not-so-great rapid-development practices—estimation, prototyping, forced overtime, motivation, teamwork, rapid-development languages, risk management, and many others&lt;/li&gt;
&lt;li&gt;A list of classic mistakes to avoid for rapid-development projects, including creeping requirements, shortchanged quality, and silver-bullet syndrome&lt;/li&gt;
&lt;li&gt;Case studies that vividly illustrate what can go wrong, what can go right, and how to tell which direction your project is going&lt;/li&gt;
&lt;li&gt;RAPID DEVELOPMENT is the real-world guide to more efficient applications development."&lt;a href="https://amzn.to/2SQLQTn" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  21. &lt;a href="https://amzn.to/323c5Ki" rel="noopener noreferrer"&gt;Coders at Work&lt;/a&gt; by Peter Seibel (10.2% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F21.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F21.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"This is a who's who in the programming world - a fascinating look at how some of the best in the world do their work. Patterned after the best selling Founders at Work, the book represents two years of interviews with some of the top programmers of our times."&lt;a href="https://amzn.to/323c5Ki" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  20. &lt;a href="https://amzn.to/38BFCxd" rel="noopener noreferrer"&gt;Domain-Driven Design&lt;/a&gt; by Eric Evans (10.2% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F20.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F20.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Leading software designers have recognized domain modeling and design as critical topics for at least twenty years, yet surprisingly little has been written about what needs to be done or how to do it. Although it has never been clearly formulated, a philosophy has developed as an undercurrent in the object community, which I call "domain-driven design".&lt;/p&gt;

&lt;p&gt;I have spent the past decade focused on developing complex systems in several business and technical domains. I've tried best practices in design and development process as they have emerged from the leaders in the object-oriented development community. Some of my projects were very successful; a few failed. A feature common to the successes was a rich domain model that evolved through iterations of design and became part of the fabric of the project.&lt;/p&gt;

&lt;p&gt;This book provides a framework for making design decisions and a technical vocabulary for discussing domain design. It is a synthesis of widely accepted best practices along with my own insights and experiences. Projects facing complex domains can use this framework to approach domain-driven design systematically."&lt;a href="https://amzn.to/38BFCxd" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  19. &lt;a href="https://amzn.to/2SU7N3Q" rel="noopener noreferrer"&gt;The Art of Computer Programming&lt;/a&gt; by Donald E. Knuth(10.2% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F19.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F19.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Countless readers have spoken about the profound personal influence of Knuth’s work. Scientists have marveled at the beauty and elegance of his analysis, while ordinary programmers have successfully applied his “cookbook” solutions to their day-to-day problems. All have admired Knuth for the breadth, clarity, accuracy, and good humor found in his books."&lt;a href="https://amzn.to/2SU7N3Q" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  18. &lt;a href="https://amzn.to/2HJ7HqR" rel="noopener noreferrer"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt; by Harold Abelson / Gerald Jay Sussman / Julie Sussman (13.2% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F17.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F17.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Structure and Interpretation of Computer Programs has had a dramatic impact on computer science curricula over the past decade. This long-awaited revision contains changes throughout the text. There are new implementations of most of the major programming systems in the book, including the interpreters and compilers, and the authors have incorporated many small changes that reflect their experience teaching the course at MIT since the first edition was published. A new theme has been introduced that emphasizes the central role played by different approaches to dealing with time in computational models: objects with state, concurrent programming, functional programming and lazy evaluation, and nondeterministic programming. There are new example sections on higher-order procedures in graphics and on applications of stream processing in numerical programming, and many new exercises. In addition, all the programs have been reworked to run in any Scheme implementation that adheres to the IEEE standard."&lt;a href="https://amzn.to/2HJ7HqR" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  17. &lt;a href="https://amzn.to/37xEadR" rel="noopener noreferrer"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt; by Martin Fowler (14.7% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F16.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F16.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"The practice of enterprise application development has benefited from the emergence of many new enabling technologies. Multi-tiered object-oriented platforms, such as Java and .NET, have become commonplace. These new tools and technologies are capable of building powerful applications, but they are not easily implemented. Common failures in enterprise applications often occur because their developers do not understand the architectural lessons that experienced object developers have learned."&lt;a href="https://amzn.to/37xEadR" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  16. &lt;a href="https://amzn.to/2u8cOxo" rel="noopener noreferrer"&gt;Programming Pearls&lt;/a&gt; by  Jon Bentley (16.1% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F16-bis.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F16-bis.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Computer programming has many faces. Fred Brooks paints the big picture in The Mythical Man Month; his essays underscore the crucial role of management in large software projects. At a finer grain, Steve McConnell teaches good programming style in Code Complete. The topics in those books are the key to good software and the hallmark of the professional programmer. Unfortunately, though, the workmanlike application of those sound engineering principles isn't always thrilling -- until the software is completed on time and works without surprise.&lt;/p&gt;

&lt;p&gt;The columns in this book are about a more glamorous aspect of the profession: programming pearls whose origins lie beyond solid engineering, in the realm of insight and creativity. Just as natural pearls grow from grains of sand that have irritated oysters, these programming pearls have grown from real problems that have irritated real programmers. The programs are fun, and they teach important programming techniques and fundamental design principles."&lt;a href="https://amzn.to/2u8cOxo" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  15. &lt;a href="https://amzn.to/2P2YRIh" rel="noopener noreferrer"&gt;Peopleware&lt;/a&gt; by Tom DeMarco &amp;amp; Tim Lister (17.6% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F15.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F15.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"The unique insight of this longtime bestseller is that the major issues of software development are human, not technical. They're not easy issues; but solve them, and you'll maximize your chances of success."&lt;a href="https://amzn.to/2P2YRIh" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  14. &lt;a href="https://amzn.to/2SAdPrt" rel="noopener noreferrer"&gt;Introduction to Algorithms&lt;/a&gt; by Thomas H. Cormen / Charles E. Leiserson / Ronald L. Rivest / Clifford Stein (17.6% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F14.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F14.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Some books on algorithms are rigorous but incomplete; others cover masses of material but lack rigor. Introduction to Algorithms uniquely combines rigor and comprehensiveness. The book covers a broad range of algorithms in depth, yet makes their design and analysis accessible to all levels of readers. Each chapter is relatively self-contained and can be used as a unit of study. The algorithms are described in English and in a pseudocode designed to be readable by anyone who has done a little programming. The explanations have been kept elementary without sacrificing depth of coverage or mathematical rigor.&lt;/p&gt;

&lt;p&gt;The first edition became a widely used text in universities worldwide as well as the standard reference for professionals. The second edition featured new chapters on the role of algorithms, probabilistic analysis and randomized algorithms, and linear programming. The third edition has been revised and updated throughout. It includes two completely new chapters, on van Emde Boas trees and multithreaded algorithms, substantial additions to the chapter on recurrence (now called “Divide-and-Conquer”), and an appendix on matrices. It features improved treatment of dynamic programming and greedy algorithms and a new notion of edge-based flow in the material on flow networks. Many exercises and problems have been added for this edition. The international paperback edition is no longer available; the hardcover is available worldwide."&lt;a href="https://amzn.to/2SAdPrt" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  13. &lt;a href="https://amzn.to/38zhTOo" rel="noopener noreferrer"&gt;Code&lt;/a&gt; by Charles Petzold (19.1% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F13.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F13.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"What do flashlights, the British invasion, black cats, and seesaws have to do with computers? In CODE, they show us the ingenious ways we manipulate language and invent new means of communicating with each other. And through CODE, we see how this ingenuity and our very human compulsion to communicate have driven the technological innovations of the past two centuries.&lt;/p&gt;

&lt;p&gt;Using everyday objects and familiar language systems such as Braille and Morse code, author Charles Petzold weaves an illuminating narrative for anyone who’s ever wondered about the secret inner life of computers and other smart machines.&lt;/p&gt;

&lt;p&gt;It’s a cleverly illustrated and eminently comprehensible story—and along the way, you’ll discover you’ve gained a real context for understanding today’s world of PCs, digital media, and the Internet. No matter what your level of technical savvy, CODE will charm you—and perhaps even awaken the technophile within."&lt;a href="https://amzn.to/38zhTOo" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  12. &lt;a href="https://amzn.to/2UYPsW3" rel="noopener noreferrer"&gt;Don't Make Me Think&lt;/a&gt; by Steve Krug (19.1% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F12.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F12.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Since Don’t Make Me Think was first published in 2000, hundreds of thousands of Web designers and developers have relied on usability guru Steve Krug’s guide to help them understand the principles of intuitive navigation and information design. Witty, commonsensical, and eminently practical, it’s one of the best-loved and most recommended books on the subject.&lt;/p&gt;

&lt;p&gt;Now Steve returns with fresh perspective to reexamine the principles that made Don’t Make Me Think a classic–with updated examples and a new chapter on mobile usability. And it’s still short, profusely illustrated…and best of all–fun to read.&lt;/p&gt;

&lt;p&gt;If you’ve read it before, you’ll rediscover what made Don’t Make Me Think so essential to Web designers and developers around the world. If you’ve never read it, you’ll see why so many people have said it should be required reading for anyone working on Web sites."&lt;a href="https://amzn.to/2UYPsW3" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  11. &lt;a href="https://amzn.to/2HziTGl" rel="noopener noreferrer"&gt;Soft Skills&lt;/a&gt; by John Sonmez  (22% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F11.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F11.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"For most software developers, coding is the fun part. The hard bits are dealing with clients, peers, and managers, staying productive, achieving financial security, keeping yourself in shape, and finding true love. This book is here to help.&lt;/p&gt;

&lt;p&gt;Soft Skills: The software developer's life manual is a guide to a well-rounded, satisfying life as a technology professional. In it, developer and life coach John Sonmez offers advice to developers on important "soft" subjects like career and productivity, personal finance and investing, and even fitness and relationships. Arranged as a collection of 71 short chapters, this fun-to-read book invites you to dip in wherever you like. A Taking Action section at the end of each chapter shows you how to get quick results. Soft Skills will help make you a better programmer, a more valuable employee, and a happier, healthier person."&lt;a href="https://amzn.to/2HziTGl" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  10. &lt;a href="https://amzn.to/37CuhvD" rel="noopener noreferrer"&gt;Cracking the Coding Interview&lt;/a&gt; by Gayle Laakmann McDowell (22% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F10.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F10.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"I am not a recruiter. I am a software engineer. And as such, I know what it's like to be asked to whip up brilliant algorithms on the spot and then write flawless code on a whiteboard. I've been through this as a candidate and as an interviewer.&lt;/p&gt;

&lt;p&gt;Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hundreds of software engineers. The result is this book.&lt;/p&gt;

&lt;p&gt;Learn how to uncover the hints and hidden details in a question, discover how to break down a problem into manageable chunks, develop techniques to unstick yourself when stuck, learn (or re-learn) core computer science concepts, and practice on 189 interview questions and solutions.&lt;/p&gt;

&lt;p&gt;These interview questions are real; they are not pulled out of computer science textbooks. They reflect what's truly being asked at the top companies, so that you can be as prepared as possible. WHAT'S INSIDE?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;189 programming interview questions, ranging from the basics to the trickiest algorithm problems.&lt;/li&gt;
&lt;li&gt;A walk-through of how to derive each solution, so that you can learn how to get there yourself.&lt;/li&gt;
&lt;li&gt;Hints on how to solve each of the 189 questions, just like what you would get in a real interview.&lt;/li&gt;
&lt;li&gt;Five proven strategies to tackle algorithm questions, so that you can solve questions you haven't seen.&lt;/li&gt;
&lt;li&gt;Extensive coverage of essential topics, such as big O time, data structures, and core algorithms.&lt;/li&gt;
&lt;li&gt;A behind the scenes look at how top companies like Google and Facebook hire developers.&lt;/li&gt;
&lt;li&gt;Techniques to prepare for and ace the soft side of the interview: behavioral questions.&lt;/li&gt;
&lt;li&gt;For interviewers and companies: details on what makes a good interview question and hiring process."&lt;a href="https://amzn.to/37CuhvD" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  9. &lt;a href="https://amzn.to/38Eb9yO" rel="noopener noreferrer"&gt;Design Patterns&lt;/a&gt; by by Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides (25% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F9.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F9.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Capturing a wealth of experience about the design of object-oriented software, four top-notch designers present a catalog of simple and succinct solutions to commonly occurring design problems. Previously undocumented, these 23 patterns allow designers to create more flexible, elegant, and ultimately reusable designs without having to rediscover the design solutions themselves.&lt;/p&gt;

&lt;p&gt;The authors begin by describing what patterns are and how they can help you design object-oriented software. They then go on to systematically name, explain, evaluate, and catalog recurring designs in object-oriented systems. With Design Patterns as your guide, you will learn how these important patterns fit into the software development process, and how you can leverage them to solve your own design problems most efficiently.&lt;/p&gt;

&lt;p&gt;Each pattern describes the circumstances in which it is applicable, when it can be applied in view of other design constraints, and the consequences and trade-offs of using the pattern within a larger design. All patterns are compiled from real systems and are based on real-world examples. Each pattern also includes code that demonstrates how it may be implemented in object-oriented programming languages like C++ or Smalltalk."&lt;a href="https://amzn.to/38Eb9yO" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  8. &lt;a href="https://amzn.to/2P37DWJ" rel="noopener noreferrer"&gt;Working Effectively with Legacy Code&lt;/a&gt; by Michael Feathers (26.4% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F8.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F8.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"In this book, Michael Feathers offers start-to-finish strategies for working more effectively with large, untested legacy code bases. This book draws on material Michael created for his own renowned Object Mentor seminars: techniques Michael has used in mentoring to help hundreds of developers, technical managers, and testers bring their legacy systems under control.&lt;br&gt;
This book also includes a catalog of twenty-four dependency-breaking techniques that help you work with program elements in isolation and make safer changes."&lt;a href="https://amzn.to/2P37DWJ" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  7. &lt;a href="https://amzn.to/2u63SIS" rel="noopener noreferrer"&gt;The Clean Coder&lt;/a&gt; by Robert Martin (27.9% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F7.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F7.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Programmers who endure and succeed amidst swirling uncertainty and nonstop pressure share a common attribute: They care deeply about the practice of creating software. They treat it as a craft. They are professionals.&lt;/p&gt;

&lt;p&gt;In The Clean Coder: A Code of Conduct for Professional Programmers, legendary software expert Robert C. Martin introduces the disciplines, techniques, tools, and practices of true software craftsmanship. This book is packed with practical advice–about everything from estimating and coding to refactoring and testing. It covers much more than technique: It is about attitude. Martin shows how to approach software development with honor, self-respect, and pride; work well and work clean; communicate and estimate faithfully; face difficult decisions with clarity and honesty; and understand that deep knowledge comes with a responsibility to act.&lt;/p&gt;

&lt;p&gt;Great software is something to marvel at: powerful, elegant, functional, a pleasure to work with as both a developer and as a user. Great software isn’t written by machines. It is written by professionals with an unshakable commitment to craftsmanship. The Clean Coder will help you become one of them–and earn the pride and fulfillment that they alone possess."&lt;a href="https://amzn.to/2u63SIS" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  6. &lt;a href="https://amzn.to/3bL1lVz" rel="noopener noreferrer"&gt;The Mythical Man-Month&lt;/a&gt; by Frederick P. Brooks Jr (27.9% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F6.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F6.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Few books on software project management have been as influential and timeless as The Mythical Man-Month. With a blend of software engineering facts and thought-provoking opinions, Fred Brooks offers insight for anyone managing complex projects. These essays draw from his experience as project manager for the IBM System/360 computer family and then for OS/360, its massive software system. Now, 20 years after the initial publication of his book, Brooks has revisited his original ideas and added new thoughts and advice, both for readers already familiar with his work and for readers discovering it for the first time."&lt;a href="https://amzn.to/3bL1lVz" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  5. &lt;a href="https://amzn.to/2SUiUtA" rel="noopener noreferrer"&gt;Head First Design Patterns&lt;/a&gt; by Eric Freeman / Bert Bates / Kathy Sierra / Elisabeth Robson (29.4% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F5.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F5.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"What’s so special about design patterns?&lt;/p&gt;

&lt;p&gt;At any given moment, someone struggles with the same software design problems you have. And, chances are, someone else has already solved your problem. This edition of Head First Design Patterns—now updated for Java 8—shows you the tried-and-true, road-tested patterns used by developers to create functional, elegant, reusable, and flexible software. By the time you finish this book, you’ll be able to take advantage of the best design practices and experiences of those who have fought the beast of software design and triumphed.&lt;/p&gt;

&lt;p&gt;What’s so special about this book?&lt;/p&gt;

&lt;p&gt;We think your time is too valuable to spend struggling with new concepts. Using the latest research in cognitive science and learning theory to craft a multi-sensory learning experience, Head First Design Patterns uses a visually rich format designed for the way your brain works, not a text-heavy approach that puts you to sleep."&lt;a href="https://amzn.to/2SUiUtA" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;a href="https://amzn.to/2uSs167" rel="noopener noreferrer"&gt;Refactoring&lt;/a&gt; by Martin Fowler (35% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F4.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F4.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"As the application of object technology--particularly the Java programming language--has become commonplace, a new problem has emerged to confront the software development community. Significant numbers of poorly designed programs have been created by less-experienced developers, resulting in applications that are inefficient and hard to maintain and extend. Increasingly, software system professionals are discovering just how difficult it is to work with these inherited, non-optimal applications. &lt;/p&gt;

&lt;p&gt;For several years, expert-level object programmers have employed a growing collection of techniques to improve the structural integrity and performance of such existing software programs. Referred to as refactoring, these practices have remained in the domain of experts because no attempt has been made to transcribe the lore into a form that all developers could use. . .until now. In Refactoring: Improving the Design of Existing Software, renowned object technology mentor Martin Fowler breaks new ground, demystifying these master practices and demonstrating how software practitioners can realize the significant benefits of this new process. With proper training a skilled system designer" &lt;a href="https://amzn.to/2uSs167" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;a href="https://amzn.to/37wO0wR" rel="noopener noreferrer"&gt;Code Complete&lt;/a&gt; by Steve McConnell (42% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F3.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F3.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Widely considered one of the best practical guides to programming, Steve McConnell’s original CODE COMPLETE has been helping developers write better software for more than a decade. Now this classic book has been fully updated and revised with leading-edge practices—and hundreds of new code samples—illustrating the art and science of software construction. Capturing the body of knowledge available from research, academia, and everyday commercial practice, McConnell synthesizes the most effective techniques and must-know principles into clear, pragmatic guidance. No matter what your experience level, development environment, or project size, this book will inform and stimulate your thinking—and help you build the highest quality code."&lt;a href="https://amzn.to/37wO0wR" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;a href="https://amzn.to/2Hy0n0U" rel="noopener noreferrer"&gt;Clean Code&lt;/a&gt; by Robert C. Martin  (66% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F2.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F2.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"Clean Code is divided into three parts. The first describes the principles, patterns, and practices of writing clean code. The second part consists of several case studies of increasing complexity. Each case study is an exercise in cleaning up code—of transforming a code base that has some problems into one that is sound and efficient. The third part is the payoff: a single chapter containing a list of heuristics and “smells” gathered while creating the case studies. The result is a knowledge base that describes the way we think when we write, read, and clean code."&lt;a href="https://amzn.to/2Hy0n0U" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1. &lt;a href="https://amzn.to/3bO6Xyb" rel="noopener noreferrer"&gt;The Pragmatic Programmer&lt;/a&gt; by David Thomas &amp;amp; Andrew Hunt (67% recommended)
&lt;/h3&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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F1.jpg%23center" 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%2Fwww.daolf.com%2Fimages%2Fprogramming_book_list%2F1.jpg%23center"&gt;&lt;/a&gt;&lt;br&gt;
"&lt;br&gt;
The Pragmatic Programmer is one of those rare tech books you’ll read, re-read, and read again over the years. Whether you’re new to the field or an experienced practitioner, you’ll come away with fresh insights each and every time.&lt;/p&gt;

&lt;p&gt;Dave Thomas and Andy Hunt wrote the first edition of this influential book in 1999 to help their clients create better software and rediscover the joy of coding. These lessons have helped a generation of programmers examine the very essence of software development, independent of any particular language, framework, or methodology, and the Pragmatic philosophy has spawned hundreds of books, screencasts, and audio books, as well as thousands of careers and success stories.&lt;/p&gt;

&lt;p&gt;Now, twenty years later, this new edition re-examines what it means to be a modern programmer. Topics range from personal responsibility and career development to architectural techniques for keeping your code flexible and easy to adapt and reuse."&lt;a href="https://amzn.to/3bO6Xyb" rel="noopener noreferrer"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Although the order might suprise some, by definition, most of you must have heard of these books already.&lt;/p&gt;

&lt;p&gt;A few additional things I learned making this list: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marting Fowler, Robert C. Martin and Steve McConnell are the only authors with several books in the list.&lt;/li&gt;
&lt;li&gt;Cracking to Code interview is the most recent book on the list, released in 2015.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amzn.to/321qbMx" rel="noopener noreferrer"&gt;Python Programming&lt;/a&gt;, by John Zelle was the most cited book focused on one language. It would have #5 had I taken it into account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you enjoyed this article. &lt;/p&gt;

&lt;p&gt;I must admit, this one took a while to write. If you liked this article and feel like Twitter would like it please do not hesitate to love and retweet, it really does help :). &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1229731043332231169-706" src="https://platform.twitter.com/embed/Tweet.html?id=1229731043332231169"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1229731043332231169-706');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1229731043332231169&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;(do &lt;strong&gt;NOT&lt;/strong&gt; create an account just for this though)&lt;/p&gt;

&lt;p&gt;Do not hesitate to follow me if you don't want to miss my next posts. I write about tech, my boostraping journey and I occasionnaly write more data analysis article like this one.&lt;/p&gt;

&lt;p&gt;I'll continue this serie next week with more specific lists.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: while making this article, &lt;a href="https://dev.to/awwsmm/20-most-recommended-books-for-software-developers-5578"&gt;this one&lt;/a&gt; appeared in the Google results. I ended up doing mine anyway because I would use a different automated aggregation technique that allowed be to compiled twice as much lists as he did. However, checking both list could be interesting :).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>books</category>
      <category>beginners</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>The 25 most recommended startup books of all time</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Sat, 15 Feb 2020 19:28:30 +0000</pubDate>
      <link>https://dev.to/daolf/the-25-most-recommended-startup-books-of-all-time-2o2h</link>
      <guid>https://dev.to/daolf/the-25-most-recommended-startup-books-of-all-time-2o2h</guid>
      <description>&lt;p&gt;There are countless lists on the internet claiming to be &lt;strong&gt;the&lt;/strong&gt; list of must-read startup books and it seemed that all those lists always recommended that same books minus two or three odd choices.&lt;/p&gt;

&lt;p&gt;I wanted to find out what were the most recommended books about startups, and so I've made this. I've compiled more than &lt;strong&gt;208 lists&lt;/strong&gt; and almost &lt;strong&gt;4,000&lt;/strong&gt; recommendations found on the internet. To my knowledge, this is the most complete list of its kind on the subject.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I spent countless hours on this article so I've decided to put Amazon affiliation links to see if those kinds of detailed articles could be a viable source of revenue, ... or not 🤷‍♂️.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you want to jump right on the results go take a look below at the full results. If you want to learn about the methodology, bear with me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology:
&lt;/h2&gt;

&lt;p&gt;I've simply asked Google for a few queries like "Best Startup Books", "Best entrepreneur books" and other variations of it. I have then scrapped all those pages (using ScrapingBee, a web scraping API I'm working on).&lt;/p&gt;

&lt;p&gt;I've deduplicated the links and ended up with nearly 300 links. Using the title of the pages I was also able to quickly discards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list focussed on one particular editor&lt;/li&gt;
&lt;li&gt;list focussed on one particular topic (i.e "Best Book for Crypto Entrepreneur")&lt;/li&gt;
&lt;li&gt;list focussed on free books&lt;/li&gt;
&lt;li&gt;Quora and Reddit threads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ended up with 254 HTML files. I went on opening all the files on my browser, open my chrome inspector, found and wrote the CSS selector matching book titles in the article. This took me around 2hours, almost 30 seconds per page. &lt;/p&gt;

&lt;p&gt;This also allowed me to discard even more nonrelevant pages. &lt;/p&gt;

&lt;p&gt;At this moment I had this big JSON file referencing the HTML page previously scrapped, and a CSS selector.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V6Zv8WwD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/rules.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V6Zv8WwD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/rules.png" alt="" width="758" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Python with Beautiful soup, I've extracted every text inside DOM elements that matched the CSS selector. I ended up with a huge list of books, not usable without some post-processing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7ccWCllI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/links.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7ccWCllI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/links.png" alt="" width="847" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To find the most quoted startup books I needed to normalize my results. As a matter of fact, a book like "7 habits of highly effective people" appeared on my results using 3 different titles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;7 habits of highly effective people&lt;/li&gt;
&lt;li&gt;Seven habits of highly effective people&lt;/li&gt;
&lt;li&gt;7 habits for highly for effective people&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This plus all the different variation like "{title} by {author}" or "{title} - {author}" made this task a bit tricky.&lt;/p&gt;

&lt;p&gt;I ended up doing it using this simple custom Python function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'ascii'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'ignore'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'the'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'by'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;':'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'('&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and quite a bit of manual cleaning.&lt;/p&gt;

&lt;p&gt;My list now looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kEtuoYij--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/clean_links.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kEtuoYij--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/clean_links.png" alt="" width="843" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From there it was easy to compute the most recommended books. You can find all the data used to process this list on this &lt;a href="https://github.com/daolf/Most-recommended-startup-books"&gt;repo&lt;/a&gt;. Now let's look at the list:&lt;/p&gt;

&lt;h1&gt;
  
  
  The 25 most recommended startup books of all-time.
&lt;/h1&gt;

&lt;p&gt;Details about the methodology available &lt;a href="https://www.daolf.com/posts/best-startup-books/"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  25. &lt;a href="https://amzn.to/37rgeZH"&gt;Delivering Happiness: A Path to Profits, Passion, and Purpose&lt;/a&gt; by Tony Hsieh (7.6% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D-WjuvlQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/25.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D-WjuvlQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/25.jpg%23center" alt="" width="331" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"In Delivering Happiness, Zappos CEO Tony Hsieh shares the different lessons he has learned in business and life, from starting a worm farm to running a pizza business, through LinkExchange, Zappos, and more. Fast-paced and down-to-earth, Deliverin Happiness shows how a very different kind of corporate culture is a powerful model for achieving success-and how by concentrating on the happiness of those around you, you can dramatically increase your own." &lt;a href="https://amzn.to/37rgeZH"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  24. &lt;a href="https://amzn.to/2uEd9s8"&gt;Shoe Dog: A Memoir by the Creator of Nike&lt;/a&gt; by Phil Knight (7.6% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0AgikEPK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/24.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0AgikEPK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/24.jpg%23center" alt="" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Knight details the many risks and daunting setbacks that stood between him and his dream - along with his early triumphs. Above all, he recalls the formative relationships with his first partners and employees, a ragtag group of misfits and seekers who became a tight-knit band of brothers. Together, harnessing the transcendent power of a shared mission and a deep belief in the spirit of sport, they built a brand that changed everything." &lt;a href="https://amzn.to/2uEd9s8"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  23. &lt;a href="https://amzn.to/2OZFUq6"&gt;Purple Cow: Transform Your Business by Being Remarkable&lt;/a&gt; by Seth Godin (8.1% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bQqV9f4a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/23.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bQqV9f4a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/23.jpg%23center" alt="" width="327" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"You're either a Purple Cow or you're not. You're either remarkable or invisible. Make your choice. What do Apple, Starbucks, Dyson and Pret a Manger have in common? How do they achieve spectacular growth, leaving behind former tried-and-true brands to gasp their last? The old checklist of P's used by marketers - Pricing, Promotion, Publicity - aren't working anymore. The golden age of advertising is over. It's time to add a new P - the Purple Cow."Purple Cow" describes something phenomenal, something counterintuitive and exciting and flat-out unbelievable. In his new bestseller, Seth Godin urges you to put a Purple Cow into everything you build, and everything you do, to create something truly noticeable. It's a manifesto for anyone who wants to help create products and services that are worth marketing in the first place." &lt;a href="https://amzn.to/2OZFUq6"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  22. &lt;a href="https://amzn.to/31Xvexc"&gt;Outliers: The Story of Success&lt;/a&gt; by Malcolm Gladwell (8.1% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---4H2GJYp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/22.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---4H2GJYp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/22.jpg%23center" alt="" width="332" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"In this stunning new book, Malcolm Gladwell takes us on an intellectual journey through the world of "outliers"--the best and the brightest, the most famous and the most successful. He asks the question: what makes high-achievers different? &lt;/p&gt;

&lt;p&gt;His answer is that we pay too much attention to what successful people are like, and too little attention to where they are from: that is, their culture, their family, their generation, and the idiosyncratic experiences of their upbringing. Along the way he explains the secrets of software billionaires, what it takes to be a great soccer player, why Asians are good at math, and what made the Beatles the greatest rock band." &lt;a href="https://amzn.to/31Xvexc"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  21. &lt;a href="https://amzn.to/2wnfW9D"&gt;The Power of Habit: Why We Do What We Do in Life and Business&lt;/a&gt; by Charles Duhigg (8.1% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sZBkl2cT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/21.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sZBkl2cT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/21.jpg%23center" alt="" width="324" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"In The Power of Habit, award-winning business reporter Charles Duhigg takes us to the thrilling edge of scientific discoveries that explain why habits exist and how they can be changed. Distilling vast amounts of information into engrossing narratives that take us from the boardrooms of Procter &amp;amp; Gamble to the sidelines of the NFL to the front lines of the civil rights movement, Duhigg presents a whole new understanding of human nature and its potential. At its core, The Power of Habit contains an exhilarating argument: The key to exercising regularly, losing weight, being more productive, and achieving success is understanding how habits work. As Duhigg shows, by harnessing this new science, we can transform our businesses, our communities, and our lives." &lt;a href="https://amzn.to/2wnfW9D"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  20. &lt;a href="https://amzn.to/37wUFH4"&gt;Founders at Work: Stories of Startups' Early Days&lt;/a&gt; by  Jessica Livingston ( 8.6% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4ltn_nWY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/20.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4ltn_nWY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/20.jpg%23center" alt="" width="333" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"For would-be entrepreneurs, innovation managers or just anyone fascinated by the special chemistry and drive that created some of the best technology companies in the world, this book offers both wisdom and engaging insights straight from the source. FaW is a collection of interviews with founders of famous technology companies about what happened in the very earliest days." &lt;a href="https://amzn.to/37wUFH4"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  19. &lt;a href="https://amzn.to/2HoRPcz"&gt;Hooked: A Guide to Building Habit-Forming Products&lt;/a&gt; by Nir Eyal (8.6% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TjKvuKod--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/19.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TjKvuKod--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/19.jpg%23center" alt="" width="333" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;""Hooked" presents a simple, yet very useful model to channel your thoughts when building a product you want to get in the hands of millions. It's quick to read (only 140 pages), to-the-point and made a world of difference to our concept&amp;amp;design challenges. We used it a lot to model the behavior of our users and figure out specific areas we missed and needed to focus on in order to get engagement.&lt;/p&gt;

&lt;p&gt;Another great value of the book is the in-depth analysis of the hooks we are subject to every day (in Twitter, Facebook, Pinterest, Instagram etc). As you go around the everyday loop you know so well from the user perspective, you see in a structured way the other side of the coin. The side of the people who know how to design behavior patterns and make others tick." &lt;a href="https://amzn.to/2HoRPcz"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  18. &lt;a href="https://amzn.to/2SueY3F"&gt;The Innovator's Dilemma: When New Technologies Cause Great Firms to Fail&lt;/a&gt; by Clayton M. Christensen (9.1% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5Cjd4mwT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/18.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Cjd4mwT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/18.jpg%23center" alt="" width="333" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Christensen explains why most companies miss out on new waves of innovation. No matter the industry, he says, a successful company with established products will get pushed aside unless managers know how and when to abandon traditional business practices.&lt;/p&gt;

&lt;p&gt;Offering both successes and failures from leading companies as a guide, The Innovator’s Dilemma gives you a set of rules for capitalizing on the phenomenon of disruptive innovation." &lt;a href="https://amzn.to/2SueY3F"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  17. &lt;a href="https://amzn.to/38y7CSr"&gt;Art of the Start 2.0: The Time-Tested, Battle-Hardened Guide for Anyone Starting Anything&lt;/a&gt; by Guy Kawasaki (9.1% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d1ftIlFZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/17.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d1ftIlFZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/17.jpg%23center" alt="" width="334" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"In The Art of the Start, Guy Kawasaki brings two decades of experience as one of business’s most original and irreverent strategists to offer the essential guide for anyone starting anything, from a multinational corporation to a church group. At Apple in the 1980s, he helped lead one of the great companies of the century, turning ordinary consumers into evangelists. As founder and CEO of Garage Technology Ventures, a venture capital firm, he has field-tested his ideas with dozens of newly hatched companies. And as the author of bestselling business books and articles, he has advised thousands of people who are making their startup dreams real." &lt;a href="https://amzn.to/38y7CSr"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  16. &lt;a href="https://amzn.to/323obmP"&gt;Tools of Titans: The Tactics, Routines, and Habits of Billionaires, Icons, and World-Class Performers&lt;/a&gt; by Tim Ferriss (9.1% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WWwHSmA6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/16.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WWwHSmA6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/16.jpg%23center" alt="" width="392" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"From the author:&lt;/p&gt;

&lt;p&gt;“For the last two years, I’ve interviewed more than 200 world-class performers for my podcast, The Tim Ferriss Show. The guests range from super celebs (Jamie Foxx, Arnold Schwarzenegger, etc.) and athletes (icons of powerlifting, gymnastics, surfing, etc.) to legendary Special Operations commanders and black-market biochemists. For most of my guests, it’s the first time they’ve agreed to a two-to-three-hour interview. This unusual depth has helped make The Tim Ferriss Show the first business/interview podcast to pass 100 million downloads." &lt;a href="https://amzn.to/323obmP"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  15. &lt;a href="https://amzn.to/31VeNBA"&gt;Influence: Science and Practice&lt;/a&gt; by Robert B. Cialdini (9.6% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rRpudVw9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/15.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rRpudVw9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/15.jpg%23center" alt="" width="333" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Written in a narrative style combined with scholarly research, Cialdini combines evidence from experimental work with the techniques and strategies he gathered while working as a salesperson, fundraiser, advertiser, and in other positions inside organizations that commonly use compliance tactics to get us to say “yes.” Widely used in classes, as well as sold to people operating successfully in the business world, the eagerly awaited revision of Influence reminds the reader of the power of persuasion." &lt;a href="https://amzn.to/31VeNBA"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  14. &lt;a href="https://amzn.to/31XH4aJ"&gt;Traction&lt;/a&gt; by  Gabriel Weinberg and Justin Mares (9.6% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JZOAQyWl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/14.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JZOAQyWl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/14.jpg%23center" alt="" width="325" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Traction will teach you the nineteen channels you can use to build a customer base, and how to pick the right ones for your business. It draws on inter-views with more than forty successful founders, including Jimmy Wales (Wikipedia), Alexis Ohanian (reddit), Paul English (Kayak), and Dharmesh Shah (HubSpot). You’ll learn, for example, how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find and use offline ads and other channels your competitors probably aren’t using&lt;/li&gt;
&lt;li&gt;Get targeted media coverage that will help you reach more customers&lt;/li&gt;
&lt;li&gt;Boost the effectiveness of your email marketing campaigns by automating staggered sets of prompts and updates&lt;/li&gt;
&lt;li&gt;Improve your search engine rankings and advertising through online tools and research"
&lt;a href="https://amzn.to/31XH4aJ"&gt;Amazon.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  13. &lt;a href="https://amzn.to/2wf6Knn"&gt;Rich Dad Poor Dad&lt;/a&gt; by Robert T. Kiyosaki (12.9% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q1CE9gvo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/13.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q1CE9gvo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/13.jpg%23center" alt="" width="332" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Rich Dad Poor Dad is Robert's story of growing up with two dads — his real father and the father of his best friend, his rich dad — and the ways in which both men shaped his thoughts about money and investing. The book explodes the myth that you need to earn a high income to be rich and explains the difference between working for money and having your money work for you." &lt;a href="https://amzn.to/2wf6Knn"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  12. &lt;a href="https://amzn.to/2SvHtyb"&gt;The 7 Habits of Highly Effective People&lt;/a&gt; by Stephen R. Covey (12.9% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zl4ZnpPO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/12.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zl4ZnpPO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/12.jpg%23center" alt="" width="331" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"One of the most inspiring and impactful books ever written, The 7 Habits of Highly Effective People has captivated readers for 25 years. It has transformed the lives of presidents and CEOs, educators and parents—in short, millions of people of all ages and occupations across the world. This twenty-fifth anniversary edition of Stephen Covey’s cherished classic commemorates his timeless wisdom, and encourages us to live a life of great and enduring purpose." &lt;a href="https://amzn.to/2SvHtyb"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  11. &lt;a href="https://amzn.to/2SufFKn"&gt;Rework&lt;/a&gt; by Jason Fried and David Heinemeier Hansson (14% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HnCir5iN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/11.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HnCir5iN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/11.jpg%23center" alt="" width="331" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Most business books give you the same old advice: Write a business plan, study the competition, seek investors, yadda yadda. If you're looking for a book like that, put this one back on the shelf.&lt;/p&gt;

&lt;p&gt;Read it and you'll know why plans are actually harmful, why you don't need outside investors, and why you're better off ignoring the competition. The truth is, you need less than you think. You don't need to be a workaholic. You don't need to staff up. You don't need to waste time on paperwork or meetings. You don't even need an office. Those are all just excuses. &lt;/p&gt;

&lt;p&gt;What you really need to do is stop talking and start working. This book shows you the way. You'll learn how to be more productive, how to get exposure without breaking the bank, and tons more counterintuitive ideas that will inspire and provoke you.&lt;/p&gt;

&lt;p&gt;With its straightforward language and easy-is-better approach, Rework is the perfect playbook for anyone who’s ever dreamed of doing it on their own. Hardcore entrepreneurs, small-business owners, people stuck in day jobs they hate, victims of "downsizing," and artists who don’t want to starve anymore will all find valuable guidance in these pages." &lt;a href="https://amzn.to/2SufFKn"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. &lt;a href="https://amzn.to/2wikE8l"&gt;Start with Why&lt;/a&gt; by Simon Sinek (14.4% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bUriIDwh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/10.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bUriIDwh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/10.jpg%23center" alt="" width="332" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Sinek starts with a fundamental question: Why are some people and organizations more innovative, more influential, and more profitable than others? Why do some command greater loyalty from customers and employees alike? Even among the successful, why are so few able to repeat their success over and over?&lt;/p&gt;

&lt;p&gt;People like Martin Luther King Jr., Steve Jobs, and the Wright Brothers had little in common, but they all started with WHY. They realized that people won't truly buy into a product, service, movement, or idea until they understand the WHY behind it. &lt;/p&gt;

&lt;p&gt;START WITH WHY shows that the leaders who've had the greatest influence in the world all think, act, and communicate the same way -- and it's the opposite of what everyone else does. Sinek calls this powerful idea The Golden Circle, and it provides a framework upon which organizations can be built, movements can be led, and people can be inspired. And it all starts with WHY." &lt;a href="https://amzn.to/2wikE8l"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  9. &lt;a href="https://amzn.to/39DlcUN"&gt;Think and Grow Rich&lt;/a&gt; by Napoleon Hill (14.4% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NvcCrT0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/9.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NvcCrT0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/9.jpg%23center" alt="" width="351" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Think and Grow Rich has been called the "Granddaddy of All Motivational Literature." It was the first book to boldly ask, "What makes a winner?" The man who asked and listened for the answer, Napoleon Hill, is now counted in the top ranks of the world's winners himself.&lt;br&gt;
The most famous of all teachers of success spent "a fortune and the better part of a lifetime of effort" to produce the "Law of Success" philosophy that forms the basis of his books and that is so powerfully summarized in this one.&lt;/p&gt;

&lt;p&gt;In the original Think and Grow Rich, published in 1937, Hill draws on stories of Andrew Carnegie, Thomas Edison, Henry Ford, and other millionaires of his generation to illustrate his principles. In the updated version, Arthur R. Pell, Ph.D., a nationally known author, lecturer, and consultant in human resources management and an expert in applying Hill's thought, deftly interweaves anecdotes of how contemporary millionaires and billionaires, such as Bill Gates, Mary Kay Ash, Dave Thomas, and Sir John Templeton, achieved their wealth. Outmoded or arcane terminology and examples are faithfully refreshed to preclude any stumbling blocks to a new generation of readers." &lt;a href="https://amzn.to/39DlcUN"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  8. &lt;a href="https://amzn.to/37wvV1U"&gt;Good to Great: Why Some Companies Make the Leap and Others Don't&lt;/a&gt; by Jim Collins  (14.9% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TujXLe34--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/8.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TujXLe34--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/8.jpg%23center" alt="" width="335" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Five years ago, Jim Collins asked the question, "Can a good company become a great company and if so, how?" In Good to Great Collins, the author of Built to Last, concludes that it is possible, but finds there are no silver bullets. Collins and his team of researchers began their quest by sorting through a list of 1,435 companies, looking for those that made substantial improvements in their performance over time. They finally settled on 11--including Fannie Mae, Gillette, Walgreens, and Wells Fargo--and discovered common traits that challenged many of the conventional notions of corporate success. Making the transition from good to great doesn't require a high-profile CEO, the latest technology, innovative change management, or even a fine-tuned business strategy. At the heart of those rare and truly great companies was a corporate culture that rigorously found and promoted disciplined people to think and act in a disciplined manner. Peppered with dozens of stories and examples from the great and not so great, the book offers a well-reasoned road map to excellence that any organization would do well to consider. Like Built to Last, Good to Great is one of those books that managers and CEOs will be reading and rereading for years to come." &lt;a href="https://amzn.to/37wvV1U"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  7. &lt;a href="https://amzn.to/39zZZuS"&gt;The E-Myth Revisited: Why Most Small Businesses Don't Work and What to Do About It &lt;/a&gt; by Michael E. Gerber  (15.3% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RHNwrxa2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/7.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RHNwrxa2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/7.jpg%23center" alt="" width="332" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"An instant classic, this revised and updated edition of the phenomenal bestseller dispels the myths about starting your own business. Small business consultant and author Michael E. Gerber, with sharp insight gained from years of experience, points out how common assumptions, expectations, and even technical expertise can get in the way of running a successful business.&lt;/p&gt;

&lt;p&gt;Gerber walks you through the steps in the life of a business—from entrepreneurial infancy through adolescent growing pains to the mature entrepreneurial perspective: the guiding light of all businesses that succeed—and shows how to apply the lessons of franchising to any business, whether or not it is a franchise. Most importantly, Gerber draws the vital, often overlooked distinction between working on your business and working in your business." &lt;a href="https://amzn.to/39zZZuS"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  6. &lt;a href="https://amzn.to/3bDW7La"&gt;The 4-Hour Workweek&lt;/a&gt; by Timothy Ferriss (15.8% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pX_80dai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/6.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pX_80dai--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/6.jpg%23center" alt="" width="331" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Forget the old concept of retirement and the rest of the deferred-life plan–there is no need to wait and every reason not to, especially in unpredictable economic times. Whether your dream is escaping the rat race, experiencing high-end world travel, or earning a monthly five-figure income with zero management, The 4-Hour Workweek is the blueprint." &lt;a href="https://amzn.to/3bDW7La"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  5. &lt;a href="https://amzn.to/31WyKrP"&gt;How To Win Friends and Influence People&lt;/a&gt; by Dale Carnegie (22.5% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VP-fZ2MK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/5.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VP-fZ2MK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/5.jpg%23center" alt="" width="324" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Dale Carnegie’s rock-solid, time-tested advice has carried countless people up the ladder of success in their business and personal lives. One of the most groundbreaking and timeless bestsellers of all time, How to Win Friends &amp;amp; Influence People will teach you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Six ways to make people like you&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Twelve ways to win people to your way of thinking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nine ways to change people without arousing resentment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And much more! Achieve your maximum potential—a must-read for the twenty-first century with more than 15 million copies sold!" &lt;a href="https://amzn.to/31WyKrP"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;a href="https://amzn.to/2SvDPEz"&gt;The $100 Startup: Reinvent the Way You Make a Living, Do What You Love, and Create a New Future&lt;/a&gt; by Chris Guillebeau (24% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zBWpKs88--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/4.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zBWpKs88--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/4.jpg%23center" alt="" width="330" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Still in his early thirties, Chris is on the verge of completing a tour of every country on earth – he’s already visited more than 175 nations – and yet he’s never held a “real job” or earned a regular paycheck.  Rather, he has a special genius for turning ideas into income, and he uses what he earns both to support his life of adventure and to give back. &lt;/p&gt;

&lt;p&gt;There are many others like Chris – those who’ve found ways to opt out of traditional employment and create the time and income to pursue what they find meaningful.  Sometimes, achieving that perfect blend of passion and income doesn’t depend on shelving what you currently do.  You can start small with your venture, committing little time or money, and wait to take the real plunge when you're sure it's successful." &lt;a href="https://amzn.to/2SvDPEz"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;a href="https://amzn.to/2StUZC9"&gt;The Hard Thing About Hard Things&lt;/a&gt; by Ben Horowitz (24.5% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lZc1m3LO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/3.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lZc1m3LO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/3.jpg%23center" alt="" width="331" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Ben Horowitz, cofounder of Andreessen Horowitz and one of Silicon Valley's most respected and experienced entrepreneurs, offers essential advice on building and running a startup—practical wisdom for managing the toughest problems business school doesn’t cover, based on his popular ben’s blog.&lt;/p&gt;

&lt;p&gt;While many people talk about how great it is to start a business, very few are honest about how difficult it is to run one. Ben Horowitz analyzes the problems that confront leaders every day, sharing the insights he’s gained developing, managing, selling, buying, investing in, and supervising technology companies. A lifelong rap fanatic, he amplifies business lessons with lyrics from his favorite songs, telling it straight about everything from firing friends to poaching competitors, cultivating and sustaining a CEO mentality to knowing the right time to cash in.&lt;/p&gt;

&lt;p&gt;Filled with his trademark humor and straight talk, The Hard Thing About Hard Things is invaluable for veteran entrepreneurs as well as those aspiring to their own new ventures, drawing from Horowitz's personal and often humbling experiences." &lt;a href="https://amzn.to/2StUZC9"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;a href="https://amzn.to/3bIB1Lw"&gt;Zero to One&lt;/a&gt; by Peter Thiel (29.3% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oscITmED--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/2.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oscITmED--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/2.jpg%23center" alt="" width="333" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"The great secret of our time is that there are still uncharted frontiers to explore and new inventions to create. In Zero to One, legendary entrepreneur and investor Peter Thiel shows how we can find singular ways to create those new things.&lt;/p&gt;

&lt;p&gt;Thiel begins with the contrarian premise that we live in an age of technological stagnation, even if we’re too distracted by shiny mobile devices to notice. Information technology has improved rapidly, but there is no reason why progress should be limited to computers or Silicon Valley. Progress can be achieved in any industry or area of business. It comes from the most important skill that every leader must master: learning to think for yourself.&lt;/p&gt;

&lt;p&gt;Doing what someone else already knows how to do takes the world from 1 to n, adding more of something familiar. But when you do something new, you go from 0 to 1. The next Bill Gates will not build an operating system. The next Larry Page or Sergey Brin won’t make a search engine. Tomorrow’s champions will not win by competing ruthlessly in today’s marketplace. They will escape competition altogether, because their businesses will be unique.&lt;/p&gt;

&lt;p&gt;Zero to One presents at once an optimistic view of the future of progress in America and a new way of thinking about innovation: it starts by learning to ask the questions that lead you to find value in unexpected places." &lt;a href="https://amzn.to/3bIB1Lw"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1. &lt;a href="https://amzn.to/3bBJtwp"&gt;The Lean Startup&lt;/a&gt; by Eric Ries (44.7% recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---3NdBsmF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/1.jpg%23center" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---3NdBsmF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/book_list/1.jpg%23center" alt="" width="331" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Eric Ries defines a startup as an organization dedicated to creating something new under conditions of extreme uncertainty. This is just as true for one person in a garage or a group of seasoned professionals in a Fortune 500 boardroom. What they have in common is a mission to penetrate that fog of uncertainty to discover a successful path to a sustainable business.&lt;/p&gt;

&lt;p&gt;The Lean Startup approach fosters companies that are both more capital efficient and that leverage human creativity more effectively. Inspired by lessons from lean manufacturing, it relies on “validated learning,” rapid scientific experimentation, as well as a number of counter-intuitive practices that shorten product development cycles, measure actual progress without resorting to vanity metrics, and learn what customers really want. It enables a company to shift directions with agility, altering plans inch by inch, minute by minute.&lt;/p&gt;

&lt;p&gt;Rather than wasting time creating elaborate business plans, The Lean Startup offers entrepreneurs—in companies of all sizes—a way to test their vision continuously, to adapt and adjust before it’s too late. Ries provides a scientific approach to creating and managing successful startups in a age when companies need to innovate more than ever." &lt;a href="https://amzn.to/3bBJtwp"&gt;Amazon.com&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Although the order might suprise some, by definition, most of you must have heard of these book already.&lt;/p&gt;

&lt;p&gt;A few additional things I learned making this list: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tim Ferriss is the only author with several books in the list.&lt;/li&gt;
&lt;li&gt;The Bible was quoted one time&lt;/li&gt;
&lt;li&gt;The &lt;a href="https://amzn.to/2SKalRW"&gt;Steve Jobs biography&lt;/a&gt; by Walter Isaacson is the most quoted biography, being recommended by 6% of the article.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you enjoyed this article. &lt;/p&gt;

&lt;p&gt;I must admit, this one took a while to write. If you liked this article and feel like Twitter would like it please do not hesitate to love and retweet, it really does help :). &lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--O4oJ33v8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1223995015741038592/2zY_Uo-d_normal.jpg" alt="Pierre de Wulf profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Pierre de Wulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @pierredewulf
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      There are countless startup book lists on the internet 🌐&lt;br&gt;&lt;br&gt;I wanted to know what were the most recommended startup books ever 🏆&lt;br&gt;&lt;br&gt;So I've compiled more than 4000 recommendations from 208 lists and came up with with this top 25 most recommended startup books of all-time📕&lt;br&gt;&lt;br&gt;THREAD
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      22:11 PM - 15 Feb 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1228803928856420358" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1228803928856420358" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1228803928856420358" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;(do &lt;strong&gt;NOT&lt;/strong&gt; create an account just for this though)&lt;/p&gt;

</description>
      <category>startup</category>
      <category>books</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>🐍 Writing tests faster with pytest.parametrize</title>
      <dc:creator>Pierre </dc:creator>
      <pubDate>Mon, 03 Feb 2020 21:33:58 +0000</pubDate>
      <link>https://dev.to/daolf/writing-tests-faster-with-pytest-parametrize-2d1a</link>
      <guid>https://dev.to/daolf/writing-tests-faster-with-pytest-parametrize-2d1a</guid>
      <description>&lt;h1&gt;
  
  
  Write your Python tests faster with parametrize
&lt;/h1&gt;

&lt;p&gt;I think there is no need to explain here how important testing your code is. If somehow, you have doubt about it, I can only recommend you to read those great resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/maxwell_dev/the-testing-introduction-i-wish-i-had-2dn"&gt;The testing introduction I wish I had&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.testdevlab.com/blog/2018/07/importance-of-software-testing/"&gt;The importance of software testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But more often than not, when working on your side projects, we tend to overlook this thing.&lt;/p&gt;

&lt;p&gt;I am in no way advocating that every code you write in every situation should be tested, it is perfectly fine to hack something and never test it.&lt;/p&gt;

&lt;p&gt;This post was only written to show you how to quickly write Python tests using &lt;code&gt;pytest&lt;/code&gt; and one particular feature, hoping it will reduce the amount of non-tested code you write &lt;/p&gt;

&lt;h2&gt;
  
  
  Writing some tests
&lt;/h2&gt;

&lt;p&gt;We are going to write some tests for our method that takes an array, removes its odd member, and sort it.&lt;/p&gt;

&lt;p&gt;This will be the method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;even_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;sorted_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;even_array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sorted_array&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Let's now write some basic tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_empty_array&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_one_size_array&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_only_odd_in_array&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_only_even_in_array&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_even_and_odd_in_array&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run those tests simple &lt;code&gt;pytest &amp;lt;your_file&amp;gt;&lt;/code&gt; and you should see something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rjHZCGex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python-tips-3/screen_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rjHZCGex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python-tips-3/screen_1.png" alt="" width="880" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see it was rather simple, but writing 20 lines of codes for such a simple method can sometimes be seen as a too expensive price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing them faster
&lt;/h2&gt;

&lt;p&gt;Pytest is really an awesome test framework, one of its features I use the most to quickly write tests is the &lt;code&gt;parametrize&lt;/code&gt; decorator.&lt;/p&gt;

&lt;p&gt;The way it works is rather simple, you give the decorator the name of your arguments and an array of tuple representing multiple argument values.&lt;/p&gt;

&lt;p&gt;Your test will then be run one time per tuple in the list.&lt;/p&gt;

&lt;p&gt;With that in mind, all the tests written above can be shortened into this snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parametrize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"test_input,expected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="p"&gt;[]),&lt;/span&gt;
    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[]),&lt;/span&gt;
    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[]),&lt;/span&gt;
    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;remove_odd_and_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this will be the output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rjHZCGex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python-tips-3/screen_1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rjHZCGex--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.daolf.com/images/python-tips-3/screen_1.png" alt="" width="880" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See? And in only 10 lines. &lt;code&gt;parametrize&lt;/code&gt; is very flexible, it also allows you to defined case the will break your code and many other things as detailed &lt;a href="https://docs.pytest.org/en/latest/example/parametrize.html#paramexamples"&gt;here&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Of course, this was only a short introduction to this framework showing you only a small subset of what you can do with it.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://twitter.com/intent/follow?screen_name=PierreDeWulf"&gt;follow me on Twitter&lt;/a&gt;, I tweet about bootstrapping, indie-hacking, startups and code 😊&lt;/p&gt;

&lt;p&gt;Happy coding&lt;/p&gt;

&lt;p&gt;If you like those short blog post about Python you can find my 2 previous one here:&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
