<?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: Betty Kamanthe</title>
    <description>The latest articles on DEV Community by Betty Kamanthe (@betty1999kamanthe).</description>
    <link>https://dev.to/betty1999kamanthe</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%2F802174%2F30683a08-8c4e-410b-9508-6fdf743d54eb.jpeg</url>
      <title>DEV Community: Betty Kamanthe</title>
      <link>https://dev.to/betty1999kamanthe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/betty1999kamanthe"/>
    <language>en</language>
    <item>
      <title>Pricing Strategy Can Make or Break Your Business</title>
      <dc:creator>Betty Kamanthe</dc:creator>
      <pubDate>Sun, 23 Mar 2025 18:07:26 +0000</pubDate>
      <link>https://dev.to/betty1999kamanthe/pricing-strategy-can-make-or-break-your-business-2cgo</link>
      <guid>https://dev.to/betty1999kamanthe/pricing-strategy-can-make-or-break-your-business-2cgo</guid>
      <description>&lt;p&gt;Businesses leave money on the table by choosing the wrong pricing strategy and model. Let’s talk about it. You have created an amazing SaaS product and now its time to sell it. The question you have is , how much should you sell it for? Pricing strategies and pricing models are often confused with each other. Pricing Strategy refers to the method a business uses to set prices for its goods and services. Pricing Model determines how to calculate and adjust the prices .&lt;/p&gt;

&lt;p&gt;In short: Pricing strategy = &lt;strong&gt;Company Centric&lt;/strong&gt; and Pricing models = &lt;strong&gt;Customer Centric&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When developing a SaaS pricing strategy, you need to consider all direct and indirect costs to ensure profitability while remaining competitive.&lt;/p&gt;

&lt;p&gt;Direct costs includes expenses tied to delivering the software to customers like :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud infrastructure &amp;amp; Hosting&lt;/li&gt;
&lt;li&gt;Engineering team salaries&lt;/li&gt;
&lt;li&gt;Third-Party services and APIs&lt;/li&gt;
&lt;li&gt;Security &amp;amp; Compliance&lt;/li&gt;
&lt;li&gt;Customer Support &amp;amp; Onboarding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indirect costs includes costs crucial for scaling the business and keeping it sustainable. These are costs like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Digital Ads&lt;/li&gt;
&lt;li&gt;Content marketing&lt;/li&gt;
&lt;li&gt;Webinars&lt;/li&gt;
&lt;li&gt;Sales commissions &amp;amp; Salaries&lt;/li&gt;
&lt;li&gt;CAC (Customer Acquisition Cost)&lt;/li&gt;
&lt;li&gt;Loyalty programs&lt;/li&gt;
&lt;li&gt;Product Management &amp;amp; Research&lt;/li&gt;
&lt;li&gt;Legal &amp;amp; Administrative costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is very important to also list the costs of the free credits you are utilizing at the moment like ChatGPT credits. This is because when these free credits expire/ you ran out, then you will need to pay for them and will affect your profitability. Once you have all your costs accurately outlined, you are one step closer to figuring out your pricing strategy.&lt;/p&gt;

&lt;p&gt;There are several pricing strategies for SaaS products, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Value-based pricing&lt;/strong&gt; - You set your prices based on what consumers think your product is worth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive pricing&lt;/strong&gt; - You set your prices based on what the competition is charging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-plus pricing&lt;/strong&gt; - You take the product production cost and add a certain percentage to it. Like adding 95% markup because its the known gross margin in SaaS products.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Penetration pricing&lt;/strong&gt; - Offering prices that are much lower than the competition.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When entering a saturated market or one with similar services, many founders attempt to gain market share by undercutting competitors—sometimes even operating at a loss—or by offering a freemium model to attract users. Freemium is an acquisition model and not a pricing strategy because you will often end up increasing noise or false positives while trying to segment beachheads. Positioning your SaaS product as the cheapest option not only erodes profitability but also hinders scalability. Cash flow is king—higher profits give you the financial flexibility to hire top talent and invest in R&amp;amp;D (Research &amp;amp; Development) , both of which are essential for staying competitive in the long run.&lt;/p&gt;

&lt;p&gt;Pricing is one of the most overlooked yet powerful growth levers, often sidelined in growth discussions despite being 7.5 times more impactful than customer acquisition. To maximize its potential, growth teams should track key metrics such as Customer Retention, MRR(Monthly Recurring Revenue) , ARR (Annual Recurring Revenue), and CAC to evaluate the effectiveness of different pricing strategies.&lt;/p&gt;

&lt;p&gt;Have you ever revisited your pricing model? What changes made the biggest impact for you?&lt;/p&gt;

</description>
      <category>saas</category>
      <category>pricingstrategy</category>
      <category>growth</category>
      <category>top7</category>
    </item>
    <item>
      <title>Why Push Notifications Are On The Rise &amp; What To Do About It</title>
      <dc:creator>Betty Kamanthe</dc:creator>
      <pubDate>Wed, 08 Feb 2023 04:25:14 +0000</pubDate>
      <link>https://dev.to/betty1999kamanthe/why-push-notifications-are-on-the-rise-what-to-do-about-it-5079</link>
      <guid>https://dev.to/betty1999kamanthe/why-push-notifications-are-on-the-rise-what-to-do-about-it-5079</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--baYP-rtr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sg0sf6vx8cd95a5tnx5b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--baYP-rtr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sg0sf6vx8cd95a5tnx5b.jpg" alt="Push Notifications" width="223" height="226"&gt;&lt;/a&gt;&lt;br&gt;
Push notifications are clickable pop-up messages that appear on your subscribed users’ browsers as long as they’re online or have their browsers running on their devices. Push notifications are text-based, configurable and straightforward to apply. They serve as a quick communication channel enabling companies to keep their customers engaged and convey messages, offers, or reminders to their customers.&lt;/p&gt;

&lt;p&gt;Analysts estimate that the click rate from push notifications is 4-8X times that of email. Also, it takes less time to come up with a resonating message for push notifications than emails. Push notifications improve outreach compared to SMS which people don't have to read or emails which might end up in spam.&lt;/p&gt;

&lt;p&gt;There are two types of Push notifications: &lt;em&gt;Web Push Notifications&lt;/em&gt; and &lt;em&gt;Mobile App Push Notifications&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Push Notifications&lt;/strong&gt;: Web push notifications are usually delivered on a user’s desktop or mobile screen anytime they’re active on their browser, irrespective of whether they’re on your website. These alert messages slide in at the top or bottom right-hand side of the desktop screen.&lt;/p&gt;

&lt;p&gt;Marketers use these notifications to increase website engagement and encourage visitors to keep coming back to their website, thereby increasing conversions. This makes web push notifications such a handy tool for marketers since even with little or no technical background, they are easy to build &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile App Push Notifications&lt;/strong&gt;: Having installed an application triggers mobile app push notifications. The push notification alerts display in three locations: on your lock screen, banner or notification center.&lt;/p&gt;

&lt;h2&gt;
  
  
  PUSH NOTIFICATIONS USE CASES
&lt;/h2&gt;

&lt;p&gt;Push notifications were first introduced in June 2009 by Apple. Although it is a new digital marketing channel, marketers have observed that push notifications increase customer engagement, retention and repeat visits. Marketers are still discovering new use cases for push notifications but here are a few:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re-activate inactive users&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consistent high customer retention rates equal increased profits but with the growth in many e-commerce sites and travel agencies, users are bombarded with discounts and similar products and this causes a low retention rate. Push notifications purpose to remind customers how useful your application is to them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cart Reminders&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In an e-commerce site, a customer may add products to their cart and not check out. Push notifications purpose to remind users of their pending carts. This leads to increased sales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Increase user engagement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even after a client has picked a travel package and paid for it, you should not end the engagement there. You can share a blog post about the area or country they are about to travel to. If they have completed shopping from your Fresh Vegetable site, you can send them articles about recipes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-sell or Upsell based on previous purchases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a personalized messaging where based on the previous purchases by a user you might push another product that may complement their previous buy. Let’s say a customer bought baby clothes in their last cart, a push notification telling them about new arrivals of teddy bears or mothers’ nutrition supplements. This may lead to more sales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product review campaigns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Customers are always right and their feedback is essential. After the delivery of goods, you can ask for reviews and even remind customers if they fail to review the product after a week. This will help the business note its shortcomings or strongholds in the eyes of its customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This hyper-personalized method analyzes visitor movements on the internet, and then, if they are by chance near a corresponding physical store, it sends them a simple mobile push message to encourage action. For example, If a potential buyer is near your physical location, sending a push notification with a gift voucher only redeemable at a physical location is a solid strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  BENEFITS OF PUSH NOTIFICATIONS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Increase Return Traffic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it comes to maintaining customer retention, sending users alert messages is an ideal form of interaction. This may be in the form of promotional offers or informative messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capturing Quality Leads&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In marketing, leads are individuals who have interacted with your brand in some way or have the potential to become future customers. Many businesses suffer from low lead count, with push notifications you can add subscribers with single-click permission and engage them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time-Saving&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Push notifications are simple to craft and thus take little to no time to come up with. Also, you can automate messages for particular campaigns or personalize push notifications for specific zones or time zones. Enabling you to communicate with your users at the right time by using several forms of push notifications. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Removes dependence on mobile apps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Businesses now don’t need to build or invest in mobile apps to engage their customers. They receive notifications, like in-app, right on their Android device. All it requires is a browser that supports push notifications like Chrome, Firefox and Opera.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Improved Reach&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In most cases, push notifications will outperform SMS or email alerts, which are becoming obsolete. Most devices also have browsers that support push notifications.&lt;/p&gt;

&lt;p&gt;If you want to implement push notifications you can use the following packages and libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/novuhq/novu"&gt;Novu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pushsafer.com/"&gt;Push Safer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mynotifier.app/"&gt;myNotifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geeksforgeeks.org/python-web-app-to-send-push-notification-to-your-phone/"&gt;PushBullet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;According to Xtify, a company of IBM, open rates with Push Notifications range between 30% to 60% and interaction rates are as high as 40%. Compared to email open rates which average 20% and an interaction rate of 5.4%. I would encourage any business to implement push notifications on their websites or mobile apps. Although push notifications are not a customer acquisition tool, they work well for customer engagement. &lt;/p&gt;

&lt;p&gt;If you find this useful, share the article with your friends and colleagues and bring them a step closer to achieving their business goals by using push notifications.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>api</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Linear Regression for absolute beginners</title>
      <dc:creator>Betty Kamanthe</dc:creator>
      <pubDate>Mon, 09 May 2022 09:41:39 +0000</pubDate>
      <link>https://dev.to/betty1999kamanthe/linear-regression-for-absolute-beginners-2m9f</link>
      <guid>https://dev.to/betty1999kamanthe/linear-regression-for-absolute-beginners-2m9f</guid>
      <description>&lt;p&gt;Linear Regression predicts a value based on an independent variable. It assumes that there is a linear relationship between input (X) and output (Y). Linear Regression is a supervised machine learning algorithm and it works best with continuous variables. Supervised machine learning means that it has labeled training data .&lt;/p&gt;

&lt;p&gt;In linear regression, there are two types of variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependent&lt;/strong&gt; or &lt;strong&gt;outcome variable&lt;/strong&gt; which is the variable we want to predict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independent&lt;/strong&gt; or &lt;strong&gt;predictor variable&lt;/strong&gt; which is the variable used for the prediction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Applications of linear regression models
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;It establishes the relationship between values. For instance, an Ice cream vendor may want to know the relationship between the temperature of the day and the revenue collected. They can find out that on hot days, the sales are higher than on cold days.&lt;/li&gt;
&lt;li&gt;It's used in predictive analytics or forecasting. An insurance company can detect fraudulent claims based on previous data.&lt;/li&gt;
&lt;li&gt;It's used to optimize business processes by analyzing factors affecting sales. This can be factors like pricing and marketing strategies.&lt;/li&gt;
&lt;li&gt;It's used to support business decisions by evaluating trends.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are two basic types of linear regression:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple linear regression - It has one independent variable.&lt;/li&gt;
&lt;li&gt;Multiple linear regression - It has two or more independent variables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CpqWNZfF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0mhc5xlmfeslxqt44bu7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CpqWNZfF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0mhc5xlmfeslxqt44bu7.png" alt="Linear Regression" width="685" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;regression line&lt;/strong&gt; is a line that minimizes the error between predicted values and actual values.&lt;/p&gt;

&lt;p&gt;The regression equation is represented as:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Y = mX + c&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Where:&lt;br&gt;
&lt;strong&gt;Y&lt;/strong&gt; :  is the dependent variable&lt;br&gt;
&lt;strong&gt;m&lt;/strong&gt; : is the scope&lt;br&gt;
&lt;strong&gt;X&lt;/strong&gt; :  is the independent variable&lt;br&gt;
&lt;strong&gt;c&lt;/strong&gt; :  is the intercept&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;m&lt;/strong&gt; and &lt;strong&gt;c&lt;/strong&gt; are derived by minimizing the sum of the squared difference of distance between the data points and the regression line. The goal of the equation is to reduce the difference between &lt;strong&gt;ya&lt;/strong&gt; (actual) and &lt;strong&gt;yp&lt;/strong&gt; (predicted).&lt;/p&gt;

&lt;h3&gt;
  
  
  How to update m and c to get the line of best fit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ordinary Least Squares&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ordinary Least Squares or Least square method treats the data as a matrix. It uses linear algebra to estimate the optimal values for the m and c coefficients. To use this method, all the data must be available and must fit in memory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gradient descent&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To optimize the values of the coefficients, gradient descent minimizes the error of your model on your training data. It starts with random coefficients and then calculates the sum of errors for each input and output value. Using the learning rate, the coefficients are updated in the direction of minimizing the error.&lt;/p&gt;

&lt;p&gt;Learning rate is a parameter that determines the size of the improvement step to take with each iteration. This method is useful when you have a large data set that doesn’t fit in memory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost function&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is also known as Root Mean Square Error. It is the square of the difference between &lt;strong&gt;ya&lt;/strong&gt; (actual) and &lt;strong&gt;yp&lt;/strong&gt; (predicted) divided by N (Number of observations).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regularization&lt;/strong&gt;&lt;br&gt;
Regularization methods aim to minimize squared error using Ordinary Least Squares and to reduce the complexity of the model. There are two popular examples :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lasso Regression or L1.&lt;/strong&gt;
The Ordinary Least Square is modified to minimize the absolute sum of coefficients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ridge Regression or L2.&lt;/strong&gt;
The Ordinary Least Square is modified to minimize the squared absolute sum of coefficients.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Assumptions made when building a linear regression model.
&lt;/h3&gt;

&lt;p&gt;To ensure that a linear regression model achieves its intended purpose and high accuracy, it makes some assumptions about the data. Here are some of the assumptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linear assumption&lt;/strong&gt;&lt;br&gt;
The model assumes that the Dependent variable and Independent variable must have a linear relationship. This relationship is best shown using a scatter plot between the dependent and independent variables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Noiseless data&lt;/strong&gt;&lt;br&gt;
Noise in data can be outliers. We use Box plots or outlier detection algorithms to detect outliers. You can either drop an outlier or replace it with the median or mean. It is most important to remove outliers from the output variable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No multicollinearity&lt;/strong&gt;&lt;br&gt;
Multicollinearity happens when you can derive an independent variable from other independent variables.  Use a heatmap to detect correlating variables if the data set is small. Use VIF (Variance Inflation Factor) if the dataset is large.&lt;br&gt;&lt;br&gt;
If &lt;strong&gt;VIF=1&lt;/strong&gt;, Very Less Multicollinearity&lt;br&gt;
&lt;strong&gt;VIF&amp;lt;5&lt;/strong&gt;, Moderate Multicollinearity&lt;br&gt;
&lt;strong&gt;VIF&amp;gt;5&lt;/strong&gt;, Extreme Multicollinearity&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Removing the column with the highest VIF fixes multicollinearity.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Re-scaled inputs&lt;/strong&gt;&lt;br&gt;
Re-scale the data during the data preparation stage by standardization or normalization. This ensures that the model makes more reliable predictions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gaussian distribution&lt;/strong&gt;&lt;br&gt;
Gaussian distribution is another term for normal distribution. Ensure that all input and output variables have gaussian distribution. If a variable is not, you can use Log Transformation or BoxCox to fix this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No autocorrelation in residuals&lt;/strong&gt;&lt;br&gt;
A residual is a deviation from the fitted line to the observed values. Use the Durbin-Watson Test to check for autocorrelation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DW = 2&lt;/strong&gt; shows no autocorrelation&lt;br&gt;
&lt;strong&gt;0 &amp;lt; DW &amp;lt; 2&lt;/strong&gt; shows positive autocorrelation&lt;br&gt;
&lt;strong&gt;2 &amp;lt; DW &amp;lt; 4&lt;/strong&gt; shows negative autocorrelation&lt;/p&gt;

&lt;p&gt;Statsmodels’ linear regression summary gives us the Durbin-Watson value among other useful insights.&lt;/p&gt;

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

&lt;p&gt;This article was a brief explanation of what Linear regression is. We have also covered its applications and the different methods we can use to improve the performance of linear regression models. I hope it was helpful. Comment your thoughts and questions below.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>machinelearning</category>
      <category>datascience</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Improve UX in E-commerce sites using Typesense</title>
      <dc:creator>Betty Kamanthe</dc:creator>
      <pubDate>Mon, 07 Feb 2022 07:34:48 +0000</pubDate>
      <link>https://dev.to/betty1999kamanthe/improve-ux-in-e-commerce-sites-using-typesense-44gn</link>
      <guid>https://dev.to/betty1999kamanthe/improve-ux-in-e-commerce-sites-using-typesense-44gn</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq0f2y4ksh6fbv43i96q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feq0f2y4ksh6fbv43i96q.png" alt="Improve UX in E-commerce sites"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever been searching for an item but you don’t know how it's supposed to be spelled?&lt;/p&gt;

&lt;p&gt;Most eCommerce sites are not typo-tolerant. Ease of use is a great plus in the user experience . This is &lt;a href="https://aviyel.com/post/1184/why-is-ux-important-for-building-search-engines" rel="noopener noreferrer"&gt;why ux is important for building search engines&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial I will use the &lt;a href="https://typesense.org/docs/" rel="noopener noreferrer"&gt;typesense API&lt;/a&gt; to demonstrate how typesense handles typo errors made by users. I will use data that I scraped from &lt;a href="https://www.jumia.co.ke/" rel="noopener noreferrer"&gt;jumia&lt;/a&gt; . &lt;br&gt;
The data is stored in .csv format and you can download it from &lt;a href="https://github.com/Betty1999Kamanthe/deodorants_data/blob/main/deodorants.csv" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  STEP 1: Convert our CSV data to JSONL
&lt;/h4&gt;

&lt;p&gt;The documents to import need to be formatted as a newline delimited JSON string,aka JSONLines format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install miller
mlr --c2j cat deodorants.csv &amp;gt; deodorants.jsonl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  STEP 2: Install typesense cloud
&lt;/h4&gt;

&lt;p&gt;The easiest way to run typesense is using typesense cloud&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a href="https://cloud.typesense.org/?_ga=2.144490229.1398194184.1643611745-1126443687.1643264214" rel="noopener noreferrer"&gt;Typesense&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign-in with Github&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pick a configuration and click on Launch. You'll have a ready-to-use cluster in a few minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then click on "Generate API Key", which will give you the hostnames and API keys to use in your code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  STEP 3: Install client
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install typesense
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  STEP 4: Initialising the client
&lt;/h4&gt;

&lt;p&gt;Configuring the typesense client by pointing it to the typesense node.&lt;br&gt;
Since we are using Typesense Cloud, click on the "Generate API key" button on the cluster page. This will give you a set of hostnames and API keys to use.&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="n"&gt;typesense&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;typesense&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nodes&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&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;host&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;51owicq83p97fb0xp-1.a1.typesense.net&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;port&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;443&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;protocol&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;https&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;api_key&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;gQZZpXyeoubYaQoz4UrrHuN2uKHFPVYn&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;connection_timeout_seconds&lt;/span&gt;&lt;span class="sh"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  STEP 5: Creating a collection
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Collection&lt;/strong&gt; - a group of related documents. sort of like relational tables&lt;/p&gt;

&lt;p&gt;When we create a collection, we give it a name and describe the fields that will be indexed when a document is added to the collection.&lt;/p&gt;

&lt;p&gt;In Typesense, every record you index is called a &lt;strong&gt;Document&lt;/strong&gt;&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="c1"&gt;#creating a schema
&lt;/span&gt;
&lt;span class="n"&gt;deodorants_schema&lt;/span&gt;&lt;span class="o"&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;name&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;deodorants&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;#The name of our collection
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&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;name&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;Name&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;type&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;string&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;facet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;# Name field with a string fieldtype
&lt;/span&gt;              &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&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;Price&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;type&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;float&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="c1"&gt;# price field with a float fieldtype
&lt;/span&gt;    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;default_sort&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;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;#determines how the results must be sorted when no sort_by clause is provided.
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deodorants_schema&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A facet field allows us to cluster the search results into categories and lets us drill into each of those categories&lt;/p&gt;

&lt;h4&gt;
  
  
  STEP 6: Add documents to the collection
&lt;/h4&gt;

&lt;p&gt;There are two ways of doing this. &lt;br&gt;
&lt;strong&gt;1. Using Python&lt;/strong&gt;&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;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;deodorants.jsonl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;jsonl_file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;deodorants&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;import_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonl_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&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;action&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;create&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Using Typesense Cloud&lt;/strong&gt;&lt;br&gt;
This also very simple if you have very few documents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mq5brj19apqy3t04yw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8mq5brj19apqy3t04yw2.png" alt="Typesense Cloud"&gt;&lt;/a&gt;&lt;br&gt;
Click &lt;strong&gt;add document&lt;/strong&gt; and in simply enter the documents inside the curly braces&lt;/p&gt;

&lt;p&gt;Check the number of records by clicking &lt;strong&gt;schema&lt;/strong&gt; and check &lt;em&gt;"num_documents"&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fel6azrrellzqkze8g8ur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fel6azrrellzqkze8g8ur.png" alt="Typesense Cloud"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  STEP 7: Search for items from deodorants collection
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#search for a deodorant
&lt;/span&gt;&lt;span class="n"&gt;search_parameters&lt;/span&gt; &lt;span class="o"&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;q&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;NIVEA&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;query_by&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;Name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;deodorants&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search_parameters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h6&gt;
  
  
  Sample Response
&lt;/h6&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{'facet_counts': [],
 'found': 14,
 'hits': [{'document': {'Name': 'NIVEA Fresh Cherry Anti-Perspirant Spray For Women - 150ml',
    'Price': 365,
    'id': '61'},
   'highlights': [{'field': 'Name',
     'matched_tokens': ['NIVEA'],
     'snippet': '&amp;lt;mark&amp;gt;NIVEA&amp;lt;/mark&amp;gt; Fresh Cherry Anti-Perspirant Spray For Women - 150ml'}],
   'text_match': 33514496},
  {'document': {'Name': 'NIVEA MEN Cool Kick Anti-Perspirant Spray For Men, 48h - 150ml',
    'Price': 375,
    'id': '60'},
   'highlights': [{'field': 'Name',
     'matched_tokens': ['NIVEA'],
     'snippet': '&amp;lt;mark&amp;gt;NIVEA&amp;lt;/mark&amp;gt; MEN Cool Kick Anti-Perspirant Spray For Men, 48h - 150ml'}],
   'text_match': 33514496},
  {'document': {'Name': 'NIVEA MEN Black &amp;amp; White Invisible Original, 48h - 150ml (Pack Of 2)',
    'Price': 800,
    'id': '59'},
   'highlights': [{'field': 'Name',
     'matched_tokens': ['NIVEA'],
     'snippet': '&amp;lt;mark&amp;gt;NIVEA&amp;lt;/mark&amp;gt; MEN Black &amp;amp; White 
 'out_of': 14,
 'page': 1,
 'request_params': {'collection_name': 'deodorants',
  'per_page': 10,
  'q': 'NIVEA'},
 'search_cutoff': False,
 'search_time_ms': 0}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  STEP 8: Filtering results
&lt;/h4&gt;

&lt;p&gt;In this I will search for the item nivea but type it as Nyvea. Then filter the reults for nivea products that cost less than 500 and sort the prices in ascending order&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="c1"&gt;#Filtering results
&lt;/span&gt;&lt;span class="n"&gt;search_parameters&lt;/span&gt; &lt;span class="o"&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;q&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;nyvea&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;query_by&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;Name&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;filter_by&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;Price:&amp;lt;500&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;sort_by&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;Price:asc&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;deodorants&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search_parameters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Sample response
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{'facet_counts': [],
 'found': 26,
 'hits': [{'document': {'Name': 'NIVEA Pearl &amp;amp; Beauty Anti-Perspirant Rollon For Women, 48h - 50ml',
    'Price': 270,
    'id': '94'},
   'highlights': [{'field': 'Name',
     'matched_tokens': ['NIVEA'],
     'snippet': '&amp;lt;mark&amp;gt;NIVEA&amp;lt;/mark&amp;gt; Pearl &amp;amp; Beauty Anti-Perspirant Rollon For Women, 48h - 50ml'}],
   'text_match': 33317888},
  {'document': {'Name': 'NIVEA Fresh Cherry Anti-Perspirant Rollon For Women - 50ml',
    'Price': 330,
    'id': '93'},
   'highlights': [{'field': 'Name',
     'matched_tokens': ['NIVEA'],
     'snippet': '&amp;lt;mark&amp;gt;NIVEA&amp;lt;/mark&amp;gt; Fresh Cherry Anti-Perspirant Rollon For Women - 50ml'}],
   'text_match': 33317888},

  {'document': {'Name': 'NIVEA MEN Black &amp;amp; White Invisible Fresh Anti-Perspirant Rollon - 50ml',
    'Price': 355,
    'id': '89'},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see that Typesense is typo-tolerant from the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;That is how simple it is to build a search application with Typesense API. There is a lot that can be done with Typesense, like &lt;a href="https://typesense.org/docs/guide/search-ui-components.html#walk-through" rel="noopener noreferrer"&gt;creating Search UI&lt;/a&gt;. To get more functionalities check the &lt;a href="https://typesense.org/docs/0.22.1/api/#what-s-new" rel="noopener noreferrer"&gt;API reference&lt;/a&gt;. To add to all of these, it is Open Source!&lt;/p&gt;

</description>
      <category>ux</category>
      <category>tutorial</category>
      <category>api</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Simple Web scraping project using python and Beautiful soup</title>
      <dc:creator>Betty Kamanthe</dc:creator>
      <pubDate>Mon, 24 Jan 2022 06:53:04 +0000</pubDate>
      <link>https://dev.to/betty1999kamanthe/simple-web-scraping-project-using-python-and-beautiful-soup-33j3</link>
      <guid>https://dev.to/betty1999kamanthe/simple-web-scraping-project-using-python-and-beautiful-soup-33j3</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fev5hmr5bfke1kre7v14i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fev5hmr5bfke1kre7v14i.png" alt="Web scraping a shopping site"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Web scraping is an automated method used to extract large amounts of data from websites. The data on the websites are unstructured. Web scraping helps collect these unstructured data and store it in a structured form.&lt;/p&gt;

&lt;p&gt;In this project I will show you how to scrape data from a Kenyan website called Jumia &lt;a href="https://www.jumia.co.ke/" rel="noopener noreferrer"&gt;https://www.jumia.co.ke/&lt;/a&gt;. The data we gather can be used for price comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website Inspection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The aim of this project is to scrape all products, their prices and rating. So first, we need to inspect the website, this is done by:&lt;/p&gt;

&lt;p&gt;1.Visiting this site &lt;a href="https://www.jumia.co.ke/all-products/" rel="noopener noreferrer"&gt;https://www.jumia.co.ke/all-products/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Right clicking and selecting &lt;strong&gt;inspect&lt;/strong&gt; or clicking &lt;strong&gt;ctrl+shift+i&lt;/strong&gt; to inspect the website.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa7gdo723ii1wkkpzi2t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa7gdo723ii1wkkpzi2t.png" alt="Inspect"&gt;&lt;/a&gt;&lt;br&gt;
3.Move the cursor around till a product is selected.Then search for the div tag that has the name, price and rating of the product.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkh5ifau6o06cyy382bg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkh5ifau6o06cyy382bg.png" alt="Web scraping"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write the code&lt;/strong&gt;&lt;br&gt;
We start by importing the necessary libraries&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;from&lt;/span&gt; &lt;span class="n"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The requests library will make a GET request to a web server, which will download the HTML contents of a given web page for us.&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="n"&gt;jumia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://www.jumia.co.ke/all-products/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Parsing a page using BeautifulSoup&lt;/strong&gt;&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="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jumia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;html.parser&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsoup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the find_all method, which will find all the instances of the div tag that has a class called 'info' on the page.&lt;/p&gt;

&lt;p&gt;We now extract the name, price and rating.If you want to find the first instance of a tag, you can use the find method, which will return a single BeautifulSoup object:&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="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;h3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;Price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;Rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stars _s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;replace() is an inbuilt function in the Python programming language that returns a copy of the string where all occurrences of a substring are replaced with another substring. &lt;/p&gt;

&lt;p&gt;We can now loop over all products on the page to extract the name, price and rating.&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;for&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;h3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;Price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;Rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stars _s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Rating&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that we are storing all these in a list called info.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loop over all pages&lt;/strong&gt;&lt;br&gt;
We have only scraped data from the first page. The site has 50 pages and when you click on the second page you notice that the url changes. So to get the new url we do this:&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="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.jumia.co.ke/all-products/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;?page=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#catalog-listing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a simple string concatination. The code to loop through all the pages is:&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;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&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;51&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.jumia.co.ke/all-products/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;?page=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#catalog-listing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
  &lt;span class="n"&gt;furl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;jsoup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;furl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;html.parser&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsoup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;h3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;Price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;Rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stars _s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;Rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;None&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

      &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Rating&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;range() function goes up to but doesn't include the last number. The website has 50 pages this range is up to 51.&lt;br&gt;
Since some of the products have no ratings, we put it between try catch clause and print None in that instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saving to csv&lt;/strong&gt;&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="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Product Name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Rating&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Ratings&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; 
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;products.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The whole code&lt;/strong&gt;&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;from&lt;/span&gt; &lt;span class="n"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&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;51&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.jumia.co.ke/all-products/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;?page=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#catalog-listing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
  &lt;span class="n"&gt;furl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;jsoup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;furl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;html.parser&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsoup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;h3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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;Price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;Rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stars _s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&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="se"&gt;\n&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="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;Rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;None&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

      &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Rating&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;This is a simple web scraping beginners project into data analytics. All the best in your journey.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>python</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
