{"id":1346,"date":"2023-09-14T13:06:00","date_gmt":"2023-09-14T13:06:00","guid":{"rendered":"https:\/\/engelias.website\/blog\/?p=1346"},"modified":"2023-09-14T13:06:52","modified_gmt":"2023-09-14T13:06:52","slug":"building-a-web-search-engine-with-django-a-comprehensive-guide","status":"publish","type":"post","link":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/","title":{"rendered":"Building a Web Search Engine with Django: A Comprehensive Guide"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"1346\" class=\"elementor elementor-1346\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7e50104 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"7e50104\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-955387c\" data-id=\"955387c\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b6aef7c elementor-widget elementor-widget-wpr-post-title\" data-id=\"b6aef7c\" data-element_type=\"widget\" data-widget_type=\"wpr-post-title.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h1 class=\"wpr-post-title\">Building a Web Search Engine with Django: A Comprehensive Guide<\/h1>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-42ccabf elementor-widget elementor-widget-wpr-post-media\" data-id=\"42ccabf\" data-element_type=\"widget\" data-widget_type=\"wpr-post-media.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"wpr-featured-media-wrap\" data-caption=\"standard\"><div class=\"wpr-featured-media-image\" data-src=\"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2023\/09\/search.jpg\"><img decoding=\"async\" src=\"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2023\/09\/search.jpg\" alt=\"\"><\/div><\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-601b94f elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"601b94f\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-4f148af\" data-id=\"4f148af\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6f4cbb0 wpr-post-info-align-center elementor-widget elementor-widget-wpr-post-info\" data-id=\"6f4cbb0\" data-element_type=\"widget\" data-widget_type=\"wpr-post-info.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<ul class=\"wpr-post-info wpr-post-info-vertical\"><li class=\"wpr-post-info-taxonomy\"><span class=\"wpr-post-info-text\"><\/span><span>Programming<\/span><\/li><li class=\"wpr-post-info-date\"><span class=\"wpr-post-info-text\"><\/span><span>September 14, 2023<\/span><\/li><\/ul>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a0dc9ab\" data-id=\"a0dc9ab\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a915268 wpr-author-box-arrange-left elementor-widget elementor-widget-wpr-author-box\" data-id=\"a915268\" data-element_type=\"widget\" data-widget_type=\"wpr-author-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"wpr-author-box\"><div class=\"wpr-author-box-image\"><img alt='' src='https:\/\/secure.gravatar.com\/avatar\/507b21d461987cad31fe69fa52e20fab?s=264&#038;d=mm&#038;r=g' class='avatar avatar-264 photo' height='264' width='264' \/><\/div><div class=\"wpr-author-box-text\"><P class=\"wpr-author-box-name\">Elias Owis<\/P><span class=\"wpr-author-box-title\">Software Engineer<\/span><\/div><\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f3d6b9e elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"f3d6b9e\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fe30e24\" data-id=\"fe30e24\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0c3e089 toc-header elementor-widget elementor-widget-heading\" data-id=\"0c3e089\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.20.0 - 20-03-2024 *\/\n.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}<\/style><h2 class=\"elementor-heading-title elementor-size-default\">Introduction:<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-431101a elementor-widget elementor-widget-text-editor\" data-id=\"431101a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.20.0 - 20-03-2024 *\/\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t<p>In today&#8217;s digital age, information is abundant and easily accessible online. However, the large volume of data can sometimes make it challenging to find specific information quickly. This is where search engines come to the rescue, helping us sift through the vast ocean of data and locate what we need with just a few keystrokes.<\/p><p>Have you ever wondered how these search engines work under the hood? How do they crawl the web, index web pages, and provide relevant search results? If you&#8217;ve ever been curious about building your own web search engine, you&#8217;re in the right place.<\/p><p>In this article, we&#8217;ll take you on a journey to create a fully functional web search engine using the power of Django, a high-level Python web framework. We&#8217;ll leverage my open-source project available on GitHub, called &#8220;search_engine_spider&#8221; as our starting point. This project provides the essential tools and infrastructure needed to crawl web pages, extract information, and store the results in a database.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0bd5985 elementor-widget elementor-widget-alert\" data-id=\"0bd5985\" data-element_type=\"widget\" data-widget_type=\"alert.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.20.0 - 20-03-2024 *\/\n.elementor-alert{padding:15px;border-left:5px solid transparent;position:relative;text-align:left}.elementor-alert .elementor-alert-title{display:block;font-weight:700}.elementor-alert .elementor-alert-description{font-size:13px}.elementor-alert button.elementor-alert-dismiss{position:absolute;right:var(--dismiss-icon-horizontal-position,10px);top:var(--dismiss-icon-vertical-position,10px);padding:3px;font-size:var(--dismiss-icon-size,20px);line-height:1;background:transparent;color:var(--dismiss-icon-normal-color,inherit);border:none;cursor:pointer;transition-duration:var(--dismiss-icon-hover-transition-duration,.3s)}.elementor-alert button.elementor-alert-dismiss:hover{color:var(--dismiss-icon-hover-color,inherit)}.elementor-alert button.elementor-alert-dismiss svg{width:var(--dismiss-icon-size,20px);height:var(--dismiss-icon-size,20px);fill:var(--dismiss-icon-normal-color,currentColor);transition-duration:var(--dismiss-icon-hover-transition-duration,.3s)}.elementor-alert button.elementor-alert-dismiss svg:hover{fill:var(--dismiss-icon-hover-color,currentColor)}.elementor-alert.elementor-alert-info{color:#31708f;background-color:#d9edf7;border-color:#bcdff1}.elementor-alert.elementor-alert-success{color:#3c763d;background-color:#dff0d8;border-color:#cae6be}.elementor-alert.elementor-alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#f9f0c3}.elementor-alert.elementor-alert-danger{color:#a94442;background-color:#f2dede;border-color:#e8c4c4}@media (max-width:767px){.elementor-alert{padding:10px}.elementor-alert button.elementor-alert-dismiss{right:7px;top:7px}}<\/style>\t\t<div class=\"elementor-alert elementor-alert-info\" role=\"alert\">\n\t\t\t<span class=\"elementor-alert-title\">Ready to take your web development skills to the next level? <\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-alert-description\">Our GitHub repository <a>https:\/\/github.com\/Eng-Elias\/search_engine_spider<\/a> offers a hands-on opportunity to explore web crawling, search engine development, and more.<\/span>\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"elementor-alert-dismiss\">\n\t\t\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">&times;<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-screen-only\">Dismiss this alert.<\/span>\n\t\t\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d320687 elementor-widget elementor-widget-text-editor\" data-id=\"d320687\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Whether you&#8217;re an aspiring developer looking to dive into web crawling and search engine development or a seasoned Django enthusiast eager to expand your skill set, this guide has something for you. By the end of this article, you&#8217;ll have a solid understanding of how to build a web search engine from scratch, and you&#8217;ll be well-equipped to customize it to suit your specific needs.<\/p><p>Let&#8217;s embark on this exciting journey to unlock the world of web search engines with Django!<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d451246 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"d451246\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7ba17cb\" data-id=\"7ba17cb\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6e9a3e8 toc-header elementor-widget elementor-widget-heading\" data-id=\"6e9a3e8\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"font-weight:600\" data-token-index=\"0\" class=\"notion-enable-hover\">Project Prerequisites:<\/span><\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d06db3f elementor-widget elementor-widget-text-editor\" data-id=\"d06db3f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Before we dive into the nitty-gritty of building our web search engine with Django, let&#8217;s ensure we have all the prerequisites in place. To follow along with this tutorial, you&#8217;ll need the following:<\/p><ul><li><strong>Python 3.x<\/strong>: Django is a Python web framework, so make sure you have Python 3.x installed on your system.<\/li><li><strong>Django<\/strong>: our web framework of choice, which will provide the structure for our project.<\/li><li><strong>BeautifulSoup<\/strong>: We&#8217;ll be using BeautifulSoup to parse web page content.<\/li><li><strong>Requests<\/strong>: This library is essential for making HTTP requests to fetch web pages.<\/li><li><strong>Database<\/strong>: Decide on the database you want to use. We recommend PostgreSQL if you plan to enable parallel crawling due to its support for concurrent access. SQLite is an option too, but keep in mind that it limits crawling to a sequential process.<\/li><\/ul>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c73dab4 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"c73dab4\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5d797c3\" data-id=\"5d797c3\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3407cb5 toc-header elementor-widget elementor-widget-heading\" data-id=\"3407cb5\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"font-weight:600\" data-token-index=\"0\" class=\"notion-enable-hover\">What We Will Build:<\/span><\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ef2348f elementor-widget elementor-widget-text-editor\" data-id=\"ef2348f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In this tutorial, we&#8217;ll start with a solid foundation &#8211; the &#8220;Search Engine Spider&#8221; available on GitHub. This project provides a pre-built Django application that includes a web crawling utility, a Django management command for initiating the crawling process, and a user-friendly web interface for searching the scraped data.<\/p><p>We will explore how to use the included <code>Spider<\/code> class to crawl web pages, extract information, and store the results in a database. You&#8217;ll also learn how to configure your database settings and decide whether to enable parallel crawling based on your needs.<\/p><p>The web interface we&#8217;ll create allows users to enter search queries and retrieve search results from the database. By the end of this tutorial, you&#8217;ll have a functioning web search engine that you can customize and expand to suit your specific requirements. Whether you&#8217;re interested in web crawling, database management, or building user interfaces with Django, this project will provide valuable insights into each of these areas.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f53da6b elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"f53da6b\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-da0cf62\" data-id=\"da0cf62\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-baefa35 toc-header elementor-widget elementor-widget-heading\" data-id=\"baefa35\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"font-weight:600\" data-token-index=\"0\" class=\"notion-enable-hover\">ScrapingResult Model:<\/span><\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cdb2178 elementor-widget elementor-widget-text-editor\" data-id=\"cdb2178\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>The heart of our web search engine project is the <span class=\"notion-enable-hover\" style=\"font-family: 'SFMono-Regular', Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; line-height: normal; background: rgba(135,131,120,.15); color: #eb5757; border-radius: 3px; font-size: 85%; padding: 0.2em 0.4em;\" spellcheck=\"false\" data-token-index=\"1\">ScrapingResult<\/span> model. This Django model defines the structure in which we store the information we gather during web crawling. Let&#8217;s take a closer look at the model&#8217;s code and its significance:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f489d10 elementor-widget elementor-widget-text-editor\" data-id=\"f489d10\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre>class ScrapingResult(models.Model):<br>&nbsp;&nbsp;&nbsp; title = models.CharField(max_length=200)<br>&nbsp;&nbsp;&nbsp; content = models.TextField()<br>&nbsp;&nbsp;&nbsp; url = models.URLField()<br>\n<p>&nbsp;&nbsp;&nbsp; def __str__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.title<\/p><\/pre>\n<p><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7c3eee0 elementor-widget elementor-widget-text-editor\" data-id=\"7c3eee0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul><li><code>ScrapingResult<\/code> is a Django model, and each instance of this model represents a single result obtained from crawling a web page.<\/li><li>It has three main fields:<ul><li><code>title<\/code>: A <code>CharField<\/code> which stores the title of the web page, which is typically found within the HTML <code>&lt;title&gt;<\/code> tag.<\/li><li><code>content<\/code>: A <code>TextField<\/code> where we store the text content extracted from the web page. This field captures the textual information from the entire page.<\/li><li><code>url<\/code>: A <code>URLField<\/code> that stores the URL of the web page we crawled.<\/li><\/ul><\/li><\/ul><p>In essence, the <code>ScrapingResult<\/code> model acts as our structured data store, allowing us to save the titles, content, and URLs of web pages we&#8217;ve crawled. This structured storage makes it easy to manage and retrieve the information we need for search functionality and display to users in our web interface.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-85846df toc-header elementor-widget elementor-widget-heading\" data-id=\"85846df\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Understanding Views, Templates, and SearchForm:<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bfd9a9f elementor-widget elementor-widget-text-editor\" data-id=\"bfd9a9f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In our web search engine project built with Django, Views, Templates, and the SearchForm are used to create a seamless user experience. Let&#8217;s break down each of these components:<\/p><ul><li><strong>Views:<\/strong> In Django, views are responsible for processing user requests and returning appropriate responses. In our project, we have two key views. The <code>search_page<\/code> view renders a search form template where users can input their queries. The <code>search_results<\/code> view handles the search logic, querying the <code>ScrapingResult<\/code> model to find matching results and rendering them for display. Additionally, this view provides support for AJAX-based pagination, ensuring efficient navigation through search results.<\/li><li><strong>Templates:<\/strong> Templates in Django are used to generate HTML dynamically. In our project, we have several templates, including <code>layout.html<\/code>, <code>search_form.html<\/code>, <code>search_results.html<\/code>, and <code>search_result_item.html<\/code>. <code>layout.html<\/code> serves as the base template for all pages, providing a consistent structure. <code>search_form.html<\/code> presents the search input form to users, while <code>search_results.html<\/code> displays the search results along with pagination. <code>search_result_item.html<\/code> is a partial template used to format individual search result items. Together, these templates create a user-friendly interface for interacting with the search engine.<\/li><li><strong>SearchForm:<\/strong> The <code>SearchForm<\/code> is a Django form class that handles user input for search queries. It is defined in the code and used in the <code>search_page<\/code> view. This form ensures that user input is validated, and it simplifies the process of gathering query parameters. It&#8217;s a crucial component for user interaction as it enables users to submit their search queries efficiently.<\/li><\/ul><p>In summary, views manage the logic behind our web pages, templates provide the visual representation, and the SearchForm streamlines user input handling. Together, they form the backbone of our web search engine, delivering a smooth and intuitive search experience to users.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-55cf915 toc-header elementor-widget elementor-widget-heading\" data-id=\"55cf915\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"font-weight:600\" data-token-index=\"0\" class=\"notion-enable-hover\">Spider (Crawler):<\/span><\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-22e6535 elementor-widget elementor-widget-text-editor\" data-id=\"22e6535\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Certainly, let&#8217;s break down the functionality of the <span class=\"notion-enable-hover\" style=\"font-family: 'SFMono-Regular', Menlo, Consolas, 'PT Mono', 'Liberation Mono', Courier, monospace; line-height: normal; background: rgba(135,131,120,.15); color: #eb5757; border-radius: 3px; font-size: 85%; padding: 0.2em 0.4em;\" spellcheck=\"false\" data-token-index=\"1\">Spider<\/span> class step by step, explaining each part of the code:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e7d6b3d elementor-widget elementor-widget-text-editor\" data-id=\"e7d6b3d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre>class Spider:<br \/>\u00a0\u00a0\u00a0 def crawl(self, url, depth, parallel=True):<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 response = requests.get(url)<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 except:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 content = BeautifulSoup(response.text, 'lxml')<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 title = content.find('title').text<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 page_content = ''<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for tag in content.findAll():<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if hasattr(tag, 'text'):<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 page_content += tag.text.strip().replace('\\\\n', ' ')<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 except:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ScrapingResult.objects.get_or_create(url=url, defaults={'title': title, 'content': page_content})<br \/><br \/><\/pre>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-104fba8 elementor-widget elementor-widget-text-editor\" data-id=\"104fba8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ol><li>The <code>crawl<\/code> method initiates the crawling process. It takes three parameters:<ul><li><code>url<\/code>: The URL to start crawling from.<\/li><li><code>depth<\/code>: The depth of crawling, determining how many levels of links to follow.<\/li><li><code>parallel<\/code>: An optional parameter that enables parallel crawling.<\/li><\/ul><\/li><li>Inside the method, it starts by making an HTTP GET request to the provided URL using the <code>requests<\/code> library. If there&#8217;s an issue with the request, it returns early.<\/li><li>It then parses the HTML content of the web page using BeautifulSoup and stores it in the <code>content<\/code> variable.<\/li><li>The code tries to extract the title and textual content from the web page. It looks for the <code>&lt;title&gt;<\/code> tag to get the title and iterates through all tags on the page to extract and concatenate their text content.<\/li><li>The extracted <code>title<\/code> and <code>page_content<\/code> are used to create a new <code>ScrapingResult<\/code> instance, which is saved to the database using <code>get_or_create<\/code>. This method ensures that if the URL already exists in the database, it updates the existing record with the new title and content.<\/li><\/ol>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d6ee791 elementor-widget elementor-widget-text-editor\" data-id=\"d6ee791\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if depth == 0:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 links = content.findAll('a')<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 def crawl_link(link):<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 href = link['href']<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if href.startswith('http'):<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.crawl(href, depth - 1)<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parsed_url = urlparse(url)<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 protocol = parsed_url.scheme<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 domain = parsed_url.netloc<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 self.crawl(f'{protocol}:\/\/{domain}{href}', depth - 1)<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 except KeyError:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pass<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if parallel:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 with ThreadPoolExecutor(max_workers=10) as executor:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 executor.map(crawl_link, links)<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for link in links:<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 crawl_link(link)<br \/><br \/><\/pre>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-60972a6 elementor-widget elementor-widget-text-editor\" data-id=\"60972a6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ol><li>Next, the code checks if the specified <code>depth<\/code> has been reached (depth equals 0). If so, it returns, effectively limiting the depth of the crawling process.<\/li><li>It then extracts all the links (<code>&lt;a&gt;<\/code> tags) from the current web page and stores them in the <code>links<\/code> variable.<\/li><li>The <code>crawl_link<\/code> function is defined to crawl individual links. It extracts the <code>href<\/code> attribute from the link, and if it starts with &#8220;http,&#8221; it recursively calls the <code>crawl<\/code> method for that URL with a reduced depth. If the link is relative, it constructs an absolute URL using the current page&#8217;s protocol and domain.<\/li><li>Depending on the <code>parallel<\/code> flag, the code either processes the links in parallel using a thread pool or sequentially.<\/li><\/ol><p>In summary, the <code>Spider<\/code> class <code>crawl<\/code> method retrieves web pages, extracts their title and content, and stores the results in the <code>ScrapingResult<\/code> model. It then follows links to other web pages, either in parallel or sequentially, based on the specified depth. This recursive crawling process allows the spider to traverse multiple levels of web pages, collecting valuable data for our search engine.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6c4cfe3 toc-header elementor-widget elementor-widget-heading\" data-id=\"6c4cfe3\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span style=\"font-weight:600\" data-token-index=\"0\" class=\"notion-enable-hover\">Understanding the \"crawl\" Management Command:<\/span><\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-09d02c8 elementor-widget elementor-widget-text-editor\" data-id=\"09d02c8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In our Django web search engine project, we&#8217;ve implemented a custom management command named &#8220;crawl.&#8221; This command allows users to initiate the web crawling process with specific parameters. Let&#8217;s delve into the code, how to use the command, and its significance:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ebe8af8 elementor-widget elementor-widget-text-editor\" data-id=\"ebe8af8\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre>from django.core.management.base import BaseCommand<br \/>from scraping_results.spiders.general_spider import Spider<br \/><br \/>class Command(BaseCommand):<br \/>\u00a0\u00a0\u00a0 help = 'Crawl a URL using the Spider class'<br \/><br \/>\u00a0\u00a0\u00a0 def add_arguments(self, parser):<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parser.add_argument('url', help='The URL to start crawling from')<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parser.add_argument('depth', type=int, help='The depth of crawling')<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parser.add_argument('--parallel', action='store_true', help='Enable parallel crawling')<br \/><br \/>\u00a0\u00a0\u00a0 def handle(self, *args, **options):<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 url = options['url']<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 depth = options['depth']<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parallel = options['parallel']<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 spider = Spider()<br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 spider.crawl(url, depth, parallel=parallel)<br \/><br \/><\/pre>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-991d87a elementor-widget elementor-widget-text-editor\" data-id=\"991d87a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul><li>The &#8220;crawl&#8221; management command is implemented as a Django management command class. It extends <code>BaseCommand<\/code> and has a <code>help<\/code> attribute that provides a description of what the command does.<\/li><li>The <code>add_arguments<\/code> method allows users to pass arguments and options when invoking the command. It defines three parameters:<ul><li><code>url<\/code>: The URL from which to start crawling.<\/li><li><code>depth<\/code>: The depth of crawling, specifying how many levels of links to follow.<\/li><li><code>--parallel<\/code>: An optional flag that enables parallel crawling.<\/li><\/ul><\/li><li>In the <code>handle<\/code> method, the command logic is implemented. It retrieves the values passed as arguments and options, namely the <code>url<\/code>, <code>depth<\/code>, and <code>parallel<\/code> flag.<\/li><li>An instance of the <code>Spider<\/code> class is created, which is responsible for the actual crawling process. The <code>crawl<\/code> method of the spider is then called with the provided parameters.<\/li><\/ul>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0f14beb toc-header elementor-widget elementor-widget-heading\" data-id=\"0f14beb\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Using the \"crawl\" Management Command:<\/h3>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f7dea10 elementor-widget elementor-widget-text-editor\" data-id=\"f7dea10\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>To use the &#8220;crawl&#8221; management command, you can run it from the command line as follows:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-58c0423 elementor-widget elementor-widget-text-editor\" data-id=\"58c0423\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre>python manage.py crawl &lt;url&gt; &lt;depth&gt; [--parallel]<\/pre>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e8ca5d elementor-widget elementor-widget-text-editor\" data-id=\"1e8ca5d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul><li><code>&lt;url&gt;<\/code>: Replace this with the URL you want to start crawling from.<\/li><li><code>&lt;depth&gt;<\/code>: Specify the depth of crawling, indicating how many levels of links to follow.<\/li><li><code>-parallel<\/code> (optional): Include this flag if you want to enable parallel crawling. Note that parallel crawling works only with databases that support concurrent connections like PostgreSQL and doesn&#8217;t work with SQLite.<\/li><\/ul><p>For example, you can initiate a crawl with the following command:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7288191 elementor-widget elementor-widget-text-editor\" data-id=\"7288191\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre>python manage.py crawl http:\/\/example.com 2 --parallel<\/pre>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-169cf1f elementor-widget elementor-widget-text-editor\" data-id=\"169cf1f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>This command will start the crawling process from &#8220;<a href=\"http:\/\/example.com\">http:\/\/example.com<\/a>&#8221; with a depth of 2, and if <code>--parallel<\/code> is provided, it will enable parallel crawling for more efficient data retrieval.<\/p><p>In summary, the &#8220;crawl&#8221; management command is a user-friendly way to trigger web crawling in our search engine project. It allows users to specify the starting URL, depth of crawling, and whether to use parallel crawling using command line, providing flexibility and control over the crawling process.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d8f3881 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"d8f3881\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-16d0291\" data-id=\"16d0291\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-458d6e9 toc-header elementor-widget elementor-widget-heading\" data-id=\"458d6e9\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conclusion:<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b5194b2 elementor-widget elementor-widget-text-editor\" data-id=\"b5194b2\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In the ever-expanding digital landscape, the ability to harness the vast web of information is an invaluable skill. Our &#8220;Search Engine Spider&#8221; offers you a powerful toolkit to dive into the world of web crawling and search engine development with Django. As you&#8217;ve seen in this comprehensive guide, the project comes packed with features, including a robust web crawling utility, a Django management command for easy initiation, and a user-friendly web interface for seamless searches.<\/p><p>But this journey doesn&#8217;t end here; it&#8217;s just the beginning. We invite you to explore, experiment, and, most importantly, contribute to this open-source project. if you like this kink of projects and content, please support us by starring the repository and sharing the article.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ccd0369 elementor-widget elementor-widget-alert\" data-id=\"ccd0369\" data-element_type=\"widget\" data-widget_type=\"alert.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-alert elementor-alert-info\" role=\"alert\">\n\t\t\t<span class=\"elementor-alert-title\">Star, fork and contribute to:<\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-alert-description\">https:\/\/github.com\/Eng-Elias\/search_engine_spider <\/span>\n\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"elementor-alert-dismiss\">\n\t\t\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\">&times;<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-screen-only\">Dismiss this alert.<\/span>\n\t\t\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1918479 elementor-widget elementor-widget-text-editor\" data-id=\"1918479\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Whether you&#8217;re a seasoned developer looking to enhance your skills, a web enthusiast with a passion for data exploration, or simply curious about the inner workings of search engines, your contributions are invaluable. You can add new features, improve existing ones, or help us refine our documentation to make the project more accessible to everyone.<\/p><p>Join us on this exciting quest to build and expand our web search engine with Django. By working together, we can unlock new possibilities in web crawling and search technology, making the digital world more accessible and manageable for everyone. So, star our repository, get involved, and let&#8217;s shape the future of web search engines together!<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5400d39 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"5400d39\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-b0f9fd4\" data-id=\"b0f9fd4\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ae03dcb elementor-widget elementor-widget-text-editor\" data-id=\"ae03dcb\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>If you liked this content, please share it.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-420f7b7\" data-id=\"420f7b7\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-565e68c elementor-grid-0 elementor-widget elementor-widget-wpr-sharing-buttons\" data-id=\"565e68c\" data-element_type=\"widget\" data-widget_type=\"wpr-sharing-buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<div class=\"wpr-sharing-buttons elementor-grid wpr-sharing-official wpr-sharing-label-off wpr-sharing-label-tr\"><div class=\"elementor-grid-item\"><a href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&url=https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/&title=Building a Web Search Engine with Django: A Comprehensive Guide&summary=Building a Web Search Engine with Django: A Comprehensive Guide Programming September 14, 2023 Elias OwisSoftware Engineer Introduction: In today&#8217;s digital age, information is abundant and easily accessible online. However, the large volume of data can sometimes make it challenging to find specific information quickly. This is where search engines come to the rescue, helping &hellip;&lt;p class=&quot;read-more&quot;&gt; &lt;a class=&quot;&quot; href=&quot;https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/&quot;&gt; &lt;span class=&quot;screen-reader-text&quot;&gt;Building a Web Search Engine with Django: A Comprehensive Guide&lt;\/span&gt; Read More &raquo;&lt;\/a&gt;&lt;\/p&gt;&source=https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\" class=\"wpr-sharing-icon wpr-sharing-linkedin-in\" title=\"\" target=\"_blank\"><i class=\"fab fa-linkedin-in\"><\/i><\/a><\/div><div class=\"elementor-grid-item\"><a href=\"https:\/\/telegram.me\/share\/url?url=https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/&text=Building a Web Search Engine with Django: A Comprehensive Guide Programming September 14, 2023 Elias OwisSoftware Engineer Introduction: In today&#8217;s digital age, information is abundant and easily accessible online. However, the large volume of data can sometimes make it challenging to find specific information quickly. This is where search engines come to the rescue, helping &hellip;&lt;p class=&quot;read-more&quot;&gt; &lt;a class=&quot;&quot; href=&quot;https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/&quot;&gt; &lt;span class=&quot;screen-reader-text&quot;&gt;Building a Web Search Engine with Django: A Comprehensive Guide&lt;\/span&gt; Read More &raquo;&lt;\/a&gt;&lt;\/p&gt;\" class=\"wpr-sharing-icon wpr-sharing-telegram\" title=\"\" target=\"_blank\"><i class=\"fab fa-telegram\"><\/i><\/a><\/div><div class=\"elementor-grid-item\"><a href=\"https:\/\/api.whatsapp.com\/send?text=*Building a Web Search Engine with Django: A Comprehensive Guide*%0ahttps:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\" class=\"wpr-sharing-icon wpr-sharing-whatsapp\" title=\"\" target=\"_blank\"><i class=\"fab fa-whatsapp\"><\/i><\/a><\/div><div class=\"elementor-grid-item\"><a href=\"https:\/\/reddit.com\/submit?url=https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/&title=Building a Web Search Engine with Django: A Comprehensive Guide\" class=\"wpr-sharing-icon wpr-sharing-reddit\" title=\"\" target=\"_blank\"><i class=\"fab fa-reddit\"><\/i><\/a><\/div><\/div>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Building a Web Search Engine with Django: A Comprehensive Guide Programming September 14, 2023 Elias OwisSoftware Engineer Introduction: In today&#8217;s digital age, information is abundant and easily accessible online. However, the large volume of data can sometimes make it challenging to find specific information quickly. This is where search engines come to the rescue, helping &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\"> <span class=\"screen-reader-text\">Building a Web Search Engine with Django: A Comprehensive Guide<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":1352,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"footnotes":""},"categories":[13],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX<\/title>\n<meta name=\"description\" content=\"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX\" \/>\n<meta property=\"og:description\" content=\"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines\" \/>\n<meta property=\"og:url\" content=\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"LifeOptimizeX\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-14T13:06:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-14T13:06:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2023\/04\/you.com_.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Elias Owis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX\" \/>\n<meta name=\"twitter:description\" content=\"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Elias Owis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\"},\"author\":{\"name\":\"Elias Owis\",\"@id\":\"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458\"},\"headline\":\"Building a Web Search Engine with Django: A Comprehensive Guide\",\"datePublished\":\"2023-09-14T13:06:00+00:00\",\"dateModified\":\"2023-09-14T13:06:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\"},\"wordCount\":2005,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458\"},\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\",\"url\":\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\",\"name\":\"Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX\",\"isPartOf\":{\"@id\":\"https:\/\/engelias.website\/blog\/#website\"},\"datePublished\":\"2023-09-14T13:06:00+00:00\",\"dateModified\":\"2023-09-14T13:06:52+00:00\",\"description\":\"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines\",\"breadcrumb\":{\"@id\":\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/engelias.website\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a Web Search Engine with Django: A Comprehensive Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/engelias.website\/blog\/#website\",\"url\":\"https:\/\/engelias.website\/blog\/\",\"name\":\"LifeOptimizeX\",\"description\":\"Creative Blog Website\",\"publisher\":{\"@id\":\"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/engelias.website\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458\",\"name\":\"Elias Owis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/engelias.website\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2021\/07\/logo.svg\",\"contentUrl\":\"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2021\/07\/logo.svg\",\"width\":1835,\"height\":1836,\"caption\":\"Elias Owis\"},\"logo\":{\"@id\":\"https:\/\/engelias.website\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Software Engineer - Full Stack Developer\",\"sameAs\":[\"https:\/\/engelias.website\/blog\",\"https:\/\/www.linkedin.com\/in\/elias-awess\/\"],\"url\":\"https:\/\/engelias.website\/blog\/author\/eliasawess\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX","description":"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/","og_locale":"en_US","og_type":"article","og_title":"Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX","og_description":"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines","og_url":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/","og_site_name":"LifeOptimizeX","article_published_time":"2023-09-14T13:06:00+00:00","article_modified_time":"2023-09-14T13:06:52+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2023\/04\/you.com_.png","type":"image\/png"}],"author":"Elias Owis","twitter_card":"summary_large_image","twitter_title":"Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX","twitter_description":"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines","twitter_misc":{"Written by":"Elias Owis","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#article","isPartOf":{"@id":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/"},"author":{"name":"Elias Owis","@id":"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458"},"headline":"Building a Web Search Engine with Django: A Comprehensive Guide","datePublished":"2023-09-14T13:06:00+00:00","dateModified":"2023-09-14T13:06:52+00:00","mainEntityOfPage":{"@id":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/"},"wordCount":2005,"commentCount":0,"publisher":{"@id":"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458"},"articleSection":["Programming"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/","url":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/","name":"Building a Web Search Engine with Django: A Comprehensive Guide - LifeOptimizeX","isPartOf":{"@id":"https:\/\/engelias.website\/blog\/#website"},"datePublished":"2023-09-14T13:06:00+00:00","dateModified":"2023-09-14T13:06:52+00:00","description":"My experience after many months using you.com as my default search engine. you.com is a search engine more organized than other search engines","breadcrumb":{"@id":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/engelias.website\/blog\/building-a-web-search-engine-with-django-a-comprehensive-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/engelias.website\/blog\/"},{"@type":"ListItem","position":2,"name":"Building a Web Search Engine with Django: A Comprehensive Guide"}]},{"@type":"WebSite","@id":"https:\/\/engelias.website\/blog\/#website","url":"https:\/\/engelias.website\/blog\/","name":"LifeOptimizeX","description":"Creative Blog Website","publisher":{"@id":"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/engelias.website\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/engelias.website\/blog\/#\/schema\/person\/a5464a1c9c2b022880b7b66b92ff4458","name":"Elias Owis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/engelias.website\/blog\/#\/schema\/person\/image\/","url":"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2021\/07\/logo.svg","contentUrl":"https:\/\/engelias.website\/blog\/wp-content\/uploads\/2021\/07\/logo.svg","width":1835,"height":1836,"caption":"Elias Owis"},"logo":{"@id":"https:\/\/engelias.website\/blog\/#\/schema\/person\/image\/"},"description":"Software Engineer - Full Stack Developer","sameAs":["https:\/\/engelias.website\/blog","https:\/\/www.linkedin.com\/in\/elias-awess\/"],"url":"https:\/\/engelias.website\/blog\/author\/eliasawess\/"}]}},"_links":{"self":[{"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/posts\/1346"}],"collection":[{"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/comments?post=1346"}],"version-history":[{"count":17,"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/posts\/1346\/revisions"}],"predecessor-version":[{"id":1364,"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/posts\/1346\/revisions\/1364"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/media\/1352"}],"wp:attachment":[{"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/media?parent=1346"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/categories?post=1346"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engelias.website\/blog\/wp-json\/wp\/v2\/tags?post=1346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}