<?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: Prince</title>
    <description>The latest articles on DEV Community by Prince (@nguhprince).</description>
    <link>https://dev.to/nguhprince</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%2F724077%2Fb8512551-e6e0-42de-9d94-cffbb3112dba.jpeg</url>
      <title>DEV Community: Prince</title>
      <link>https://dev.to/nguhprince</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nguhprince"/>
    <language>en</language>
    <item>
      <title>How I scraped 70+ Red Dead Redemption 2 wallpapers using Python</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Thu, 11 Apr 2024 19:19:58 +0000</pubDate>
      <link>https://dev.to/nguhprince/how-i-scraped-70-red-dead-redemption-2-wallpapers-using-python-4nk3</link>
      <guid>https://dev.to/nguhprince/how-i-scraped-70-red-dead-redemption-2-wallpapers-using-python-4nk3</guid>
      <description>&lt;p&gt;Earlier today, I was looking at my wallpaper and felt a bit of shame. &lt;br&gt;
So I decided to spice things up with my favorite game, Red Dead Redemption 2.&lt;br&gt;
I found this &lt;a href="https://www.wallpaperflare.com/search?wallpaper=red+dead+redemption+2" rel="noopener noreferrer"&gt;page&lt;/a&gt; with 70+ picturesque photos from the game and I decided to download them.&lt;/p&gt;

&lt;p&gt;Seeing as there are so many, I had a perfect excuse to knock off some hours trying to download those images automatically. Here's how I did it.&lt;/p&gt;

&lt;p&gt;For starters, you'll need the following packages installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;beautifulsoup4&lt;/li&gt;
&lt;li&gt;playwright (there's some setup required for this package, read the documentation)&lt;/li&gt;
&lt;li&gt;requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install them, run &lt;code&gt;pip install beautifulsoup4 playwright requests&lt;/code&gt; in a terminal.&lt;/p&gt;

&lt;p&gt;Now that we have the packages out of the way, let's get to the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: The code is not that much, majority of what occupies the code section is just the html content of the page with the images&lt;/p&gt;

&lt;h1&gt;
  
  
  Imports
&lt;/h1&gt;

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

import os
from bs4 import BeautifulSoup
import requests
from playwright.sync_api import sync_playwright


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

&lt;/div&gt;
&lt;h1&gt;
  
  
  Getting html from the page
&lt;/h1&gt;

&lt;p&gt;We will need to get the html code from the page with the images. There are many ways to go about this, but I chose to simply copy the &lt;strong&gt;entire&lt;/strong&gt; body element from the &lt;a href="https://www.wallpaperflare.com/search?wallpaper=red+dead+redemption+2" rel="noopener noreferrer"&gt;page&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Wait for all the images to load up on the &lt;a href="https://www.wallpaperflare.com/search?wallpaper=red+dead+redemption+2" rel="noopener noreferrer"&gt;page&lt;/a&gt;, open your Dev tools sidebar, go to 'Elements', right click on the body, 'Copy', and then 'Copy element'. It should look like below.&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%2F2suxamtwcykb7tbg799q.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%2F2suxamtwcykb7tbg799q.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Store the html in a variable called html_content (use """""" to be able to store the string in multiple lines). &lt;br&gt;
If you don't feel like copying, I have included the html_content in the final section of the article, where I give the entire code.&lt;/p&gt;
&lt;h1&gt;
  
  
  Selecting data from the HTML
&lt;/h1&gt;

&lt;p&gt;We will use beautifulsoup to get the data we need from the page (images, links, etc.)&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

soup = BeautifulSoup(html_content, "html.parser")

list_of_links_to_images = soup.select("ul")[1]

l = list_of_links_to_images.select("li a")
links_to_images = [ link.get("href") + "/download" for link in l ]


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

&lt;/div&gt;
&lt;h1&gt;
  
  
  Downloading each of the images
&lt;/h1&gt;

&lt;p&gt;Now we get to the fun part, downloading the images. &lt;br&gt;
To download each of the images, we will need to go to another page. In the previous step, we compiled all the links to download the images and stored them in the links_to_images variable.&lt;/p&gt;

&lt;p&gt;In this step, we will use playwright to go to each of these pages and download the images.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

# path to save the wallpapers to.
wallpaper_path = "RDR 2 wallpapers"
def run(playwright):
    # set this to False if you want to see the browser opening the different pages
    browser = playwright.chromium.launch(headless=True) 
    context =  browser.new_context()
    page = context.new_page()

    for url in links_to_images:
        try:
            page.goto(url, timeout=0)

            soup = BeautifulSoup(page.content(), "html.parser")

            # the wallpaper image is stored in a #show_img img element
            image = soup.select_one("#show_img")
            link_to_image = image.get("src")

            response = requests.get(link_to_image)
            response.raise_for_status()

            filename = os.path.basename(link_to_image)
            save_path = os.path.join(wallpaper_path, filename)

            with open(save_path, "wb") as img:
                print(f"Writing {filename[:15]} to disk")
                img.write(response.content)

        except Exception as e:
            raise e

if __name__ == "__main__":
    with sync_playwright() as playwright:
        run(playwright)


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

&lt;/div&gt;

&lt;p&gt;In the end, the file should look like:&lt;/p&gt;

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

import os
from bs4 import BeautifulSoup
import requests
from playwright.sync_api import sync_playwright

html_content = """
&amp;lt;body itemscope="" itemtype="http://schema.org/SearchResultsPage" ontouchstart="" monica-version="5.0.4" monica-id="ofpnmcalabcbjgholdjcjblkibolbppb"&amp;gt;&amp;lt;div role="dialog" aria-live="polite" aria-label="cookieconsent" aria-describedby="cookieconsent:desc" class="cc-window cc-banner cc-type-info cc-theme-edgeless cc-bottom cc-color-override-2132809765 " style=""&amp;gt;&amp;lt;!--googleoff: all--&amp;gt;&amp;lt;span id="cookieconsent:desc" class="cc-message"&amp;gt;This website uses cookies to ensure you get the best experience on our website. &amp;lt;a aria-label="learn more about cookies" role="button" tabindex="0" class="cc-link" href="https://www.wallpaperflare.com/privacy-policy" rel="noopener noreferrer nofollow" target="_blank"&amp;gt;Learn more&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;div class="cc-compliance"&amp;gt;&amp;lt;a aria-label="dismiss cookie message" role="button" tabindex="0" class="cc-btn cc-dismiss"&amp;gt;Got it!&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--googleon: all--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div id="mailtoui-modal" class="mailtoui-modal" style="display: none;" aria-hidden="true"&amp;gt;&amp;lt;div class="mailtoui-modal-content"&amp;gt;&amp;lt;div class="mailtoui-modal-head"&amp;gt;&amp;lt;div id="mailtoui-modal-title" class="mailtoui-modal-title"&amp;gt;Compose new email with&amp;lt;/div&amp;gt;&amp;lt;a id="mailtoui-modal-close" class="mailtoui-modal-close" href="#"&amp;gt;×&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class="mailtoui-modal-body"&amp;gt;&amp;lt;div class="mailtoui-clients"&amp;gt;&amp;lt;a id="mailtoui-button-1" class="mailtoui-button" href="#"&amp;gt;&amp;lt;div class="mailtoui-button-content"&amp;gt;&amp;lt;span id="mailtoui-button-icon-1" class="mailtoui-button-icon"&amp;gt;&amp;lt;svg viewBox="0 0 24 24"&amp;gt;&amp;lt;g class="nc-icon-wrapper" stroke-linecap="square" stroke-linejoin="miter" stroke-width="2" fill="currentColor" stroke="currentColor"&amp;gt;&amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M5.704,2.979 c0.694,0.513,1.257,1.164,1.767,2.02C7.917,5.746,8.908,7.826,8,9c-1.027,1.328-4,1.776-4,3c0,0.921,1.304,1.972,2,3 c1.047,1.546,0.571,3.044,0,4c-0.296,0.496-0.769,0.92-1.293,1.234" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M20.668,5.227 C18.509,6.262,15.542,6.961,15,7c-1.045,0.075-1.2-0.784-2-2c-0.6-0.912-2-2.053-2-3c0-0.371,0.036-0.672,0.131-0.966" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;circle fill="none" stroke="currentColor" stroke-miterlimit="10" cx="12" cy="12" r="11"&amp;gt;&amp;lt;/circle&amp;gt; &amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M19.014,12.903 C19.056,15.987,15.042,19.833,13,19c-1.79-0.73-0.527-2.138-0.986-6.097c-0.191-1.646,1.567-3,3.5-3S18.992,11.247,19.014,12.903z" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span id="mailtoui-button-text-1" class="mailtoui-button-text"&amp;gt;Gmail in browser&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a id="mailtoui-button-2" class="mailtoui-button" href="#"&amp;gt;&amp;lt;div class="mailtoui-button-content"&amp;gt;&amp;lt;span id="mailtoui-button-icon-2" class="mailtoui-button-icon"&amp;gt;&amp;lt;svg viewBox="0 0 24 24"&amp;gt;&amp;lt;g class="nc-icon-wrapper" stroke-linecap="square" stroke-linejoin="miter" stroke-width="2" fill="currentColor" stroke="currentColor"&amp;gt;&amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M5.704,2.979 c0.694,0.513,1.257,1.164,1.767,2.02C7.917,5.746,8.908,7.826,8,9c-1.027,1.328-4,1.776-4,3c0,0.921,1.304,1.972,2,3 c1.047,1.546,0.571,3.044,0,4c-0.296,0.496-0.769,0.92-1.293,1.234" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M20.668,5.227 C18.509,6.262,15.542,6.961,15,7c-1.045,0.075-1.2-0.784-2-2c-0.6-0.912-2-2.053-2-3c0-0.371,0.036-0.672,0.131-0.966" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;circle fill="none" stroke="currentColor" stroke-miterlimit="10" cx="12" cy="12" r="11"&amp;gt;&amp;lt;/circle&amp;gt; &amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M19.014,12.903 C19.056,15.987,15.042,19.833,13,19c-1.79-0.73-0.527-2.138-0.986-6.097c-0.191-1.646,1.567-3,3.5-3S18.992,11.247,19.014,12.903z" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span id="mailtoui-button-text-2" class="mailtoui-button-text"&amp;gt;Outlook in browser&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a id="mailtoui-button-3" class="mailtoui-button" href="#"&amp;gt;&amp;lt;div class="mailtoui-button-content"&amp;gt;&amp;lt;span id="mailtoui-button-icon-3" class="mailtoui-button-icon"&amp;gt;&amp;lt;svg viewBox="0 0 24 24"&amp;gt;&amp;lt;g class="nc-icon-wrapper" stroke-linecap="square" stroke-linejoin="miter" stroke-width="2" fill="currentColor" stroke="currentColor"&amp;gt;&amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M5.704,2.979 c0.694,0.513,1.257,1.164,1.767,2.02C7.917,5.746,8.908,7.826,8,9c-1.027,1.328-4,1.776-4,3c0,0.921,1.304,1.972,2,3 c1.047,1.546,0.571,3.044,0,4c-0.296,0.496-0.769,0.92-1.293,1.234" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M20.668,5.227 C18.509,6.262,15.542,6.961,15,7c-1.045,0.075-1.2-0.784-2-2c-0.6-0.912-2-2.053-2-3c0-0.371,0.036-0.672,0.131-0.966" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;circle fill="none" stroke="currentColor" stroke-miterlimit="10" cx="12" cy="12" r="11"&amp;gt;&amp;lt;/circle&amp;gt; &amp;lt;path data-cap="butt" data-color="color-2" fill="none" stroke-miterlimit="10" d="M19.014,12.903 C19.056,15.987,15.042,19.833,13,19c-1.79-0.73-0.527-2.138-0.986-6.097c-0.191-1.646,1.567-3,3.5-3S18.992,11.247,19.014,12.903z" stroke-linecap="butt"&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span id="mailtoui-button-text-3" class="mailtoui-button-text"&amp;gt;Yahoo in browser&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a id="mailtoui-button-4" class="mailtoui-button" href="#"&amp;gt;&amp;lt;div class="mailtoui-button-content"&amp;gt;&amp;lt;span id="mailtoui-button-icon-4" class="mailtoui-button-icon"&amp;gt;&amp;lt;svg viewBox="0 0 24 24"&amp;gt;&amp;lt;g class="nc-icon-wrapper" stroke-linecap="square" stroke-linejoin="miter" stroke-width="2" fill="currentColor" stroke="currentColor"&amp;gt;&amp;lt;line data-color="color-2" fill="none" stroke-miterlimit="10" x1="5" y1="6" x2="6" y2="6"&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;line data-color="color-2" fill="none" stroke-miterlimit="10" x1="10" y1="6" x2="11" y2="6"&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;line data-color="color-2" fill="none" stroke-miterlimit="10" x1="15" y1="6" x2="19" y2="6"&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;line fill="none" stroke="currentColor" stroke-miterlimit="10" x1="1" y1="10" x2="23" y2="10"&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;rect x="1" y="2" fill="none" stroke="currentColor" stroke-miterlimit="10" width="22" height="20"&amp;gt;&amp;lt;/rect&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span id="mailtoui-button-text-4" class="mailtoui-button-text"&amp;gt;Default email app&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div id="mailtoui-copy" class="mailtoui-copy"&amp;gt;&amp;lt;div id="mailtoui-email-address" class="mailtoui-email-address"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;button id="mailtoui-button-copy" class="mailtoui-button-copy" data-copytargetid="mailtoui-email-address"&amp;gt;&amp;lt;span id="mailtoui-button-icon-copy" class="mailtoui-button-icon"&amp;gt;&amp;lt;svg viewBox="0 0 24 24"&amp;gt;&amp;lt;g class="nc-icon-wrapper" stroke-linecap="square" stroke-linejoin="miter" stroke-width="2" stroke="currentColor"&amp;gt;&amp;lt;polyline fill="none" stroke="currentColor" stroke-miterlimit="10" points="20,4 22,4 22,23 2,23 2,4 4,4 "&amp;gt;&amp;lt;/polyline&amp;gt; &amp;lt;path fill="none" stroke="currentColor" stroke-miterlimit="10" d="M14,3c0-1.105-0.895-2-2-2 s-2,0.895-2,2H7v4h10V3H14z"&amp;gt;&amp;lt;/path&amp;gt; &amp;lt;line data-color="color-2" fill="none" stroke-miterlimit="10" x1="7" y1="11" x2="17" y2="11"&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;line data-color="color-2" fill="none" stroke-miterlimit="10" x1="7" y1="15" x2="17" y2="15"&amp;gt;&amp;lt;/line&amp;gt; &amp;lt;line data-color="color-2" fill="none" stroke-miterlimit="10" x1="7" y1="19" x2="11" y2="19"&amp;gt;&amp;lt;/line&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span id="mailtoui-button-text-copy" class="mailtoui-button-text"&amp;gt;Copy&amp;lt;/span&amp;gt;&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class="mailtoui-brand"&amp;gt;&amp;lt;a href="https://mailtoui.com?ref=ui" target="_blank"&amp;gt;Powered by MailtoUI&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;header class="item_header"&amp;gt;
&amp;lt;div id="navbar" class="navbar"&amp;gt;
&amp;lt;div id="nav_inner"&amp;gt;
&amp;lt;a href="https://www.wallpaperflare.com" class="nav_logo"&amp;gt;
&amp;lt;img src="https://www.wallpaperflare.com/fpublic/css/logo.svg" alt="WallpaperFlare logo"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;div itemscope="" itemtype="http://schema.org/WebSite" id="search"&amp;gt;
&amp;lt;link itemprop="url" href="https://www.wallpaperflare.com"&amp;gt;
&amp;lt;form itemprop="potentialAction" itemscope="" itemtype="http://schema.org/SearchAction" action="https://www.wallpaperflare.com/search" onsubmit="remove_null();" id="search_form" method="get"&amp;gt;
&amp;lt;meta itemprop="target" content="https://www.wallpaperflare.com/search?wallpaper={wallpaper}"&amp;gt;
&amp;lt;input placeholder="Search HD wallpapers" itemprop="query-input" type="search" name="wallpaper" id="search_input" pattern=".*\S+.*" required="required"&amp;gt;
&amp;lt;input type="submit" value="" id="search_sub"&amp;gt;
&amp;lt;fieldset id="photos_field" class="search_genre"&amp;gt;
&amp;lt;div class="checkbox"&amp;gt;
&amp;lt;input type="checkbox" value="ok" id="s_mobile" name="mobile"&amp;gt;
&amp;lt;label for="s_mobile"&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;mobile only&amp;lt;/label&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;input type="number" oninput="input_size()" id="swidth" min="1" pattern="[1-9][0-9]*" step="1" name="width" placeholder="min width"&amp;gt;
&amp;lt;input type="number" oninput="input_size()" name="height" id="sheight" min="1" pattern="[1-9][0-9]*" step="1" placeholder="min height"&amp;gt;
&amp;lt;/fieldset&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class="tag_outer"&amp;gt;
&amp;lt;a href="https://www.wallpaperflare.com/search?wallpaper=red+dead+redemption+2&amp;amp;amp;sort=relevance"&amp;gt;
sort by relevance
&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/header&amp;gt;&amp;lt;main class="respo" id="main"&amp;gt;
&amp;lt;section&amp;gt;
&amp;lt;h1 class="view_h1"&amp;gt;Red dead redemption 2 1080P, 2K, 4K, 5K HD wallpapers free download&amp;lt;/h1&amp;gt;
&amp;lt;div class="mt20 mb20" itemscope="" itemtype="http://schema.org/WPAdBlock" style="text-align: center"&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
                atOptions = {
                    'key' : '369460e707c29298322e481f7781df96',
                    'format' : 'iframe',
                    'height' : 90,
                    'width' : 728,
                    'params' : {}
                };
                document.write('&amp;lt;scr' + 'ipt type="text/javascript" src="//medalguardian.com/369460e707c29298322e481f7781df96/invoke.js"&amp;gt;&amp;lt;/scr' + 'ipt&amp;gt;');
            &amp;lt;/script&amp;gt;&amp;lt;iframe src="https://tricemortal.com/watch.1394490258734?key=369460e707c29298322e481f7781df96&amp;amp;amp;kw=%5B%22red%22%2C%22dead%22%2C%22redemption%22%2C%222%22%2C%221080p%22%2C%222k%22%2C%224k%22%2C%225k%22%2C%22hd%22%2C%22wallpapers%22%2C%22free%22%2C%22download%22%2C%22wallpaper%22%2C%22flare%22%5D&amp;amp;amp;refer=https%3A%2F%2Fwww.wallpaperflare.com%2Fsearch%3Fwallpaper%3Dred%2Bdead%2Bredemption%2B2&amp;amp;amp;tz=1&amp;amp;amp;dev=r&amp;amp;amp;res=14.31&amp;amp;amp;uuid=1fc47648-4f74-4a25-aced-6918c32750f3%3A1%3A1" allowtransparency="true" scrolling="no" frameborder="0" framespacing="0" width="728" height="90"&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;script type="text/javascript" src="//medalguardian.com/369460e707c29298322e481f7781df96/invoke.js" class="atScript369460e707c29298322e481f7781df96_0"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class="toptags_container"&amp;gt;
&amp;lt;span&amp;gt;Related Search: &amp;lt;/span&amp;gt;
&amp;lt;ul class="toptags"&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=Red+Dead+Redemption+2"&amp;gt;Red Dead Redemption 2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=Red+Dead+Redemption"&amp;gt;Red Dead Redemption&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=video+games"&amp;gt;video games&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=Arthur+Morgan"&amp;gt;Arthur Morgan&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=Rockstar+Games"&amp;gt;Rockstar Games&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=Red+Dead"&amp;gt;Red Dead&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=men"&amp;gt;men&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=real+people"&amp;gt;real people&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=plant"&amp;gt;plant&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=tree"&amp;gt;tree&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=people"&amp;gt;people&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=sky"&amp;gt;sky&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=lifestyles"&amp;gt;lifestyles&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=land"&amp;gt;land&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=day"&amp;gt;day&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=cowboys"&amp;gt;cowboys&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=leisure+activity"&amp;gt;leisure activity&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=western"&amp;gt;western&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=adult"&amp;gt;adult&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=standing"&amp;gt;standing&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=beauty+in+nature"&amp;gt;beauty in nature&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=forest"&amp;gt;forest&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=landscape"&amp;gt;landscape&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=clothing"&amp;gt;clothing&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=Video+Game+Art"&amp;gt;Video Game Art&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=sunset"&amp;gt;sunset&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=horse"&amp;gt;horse&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=red"&amp;gt;red&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=motion"&amp;gt;motion&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=togetherness"&amp;gt;togetherness&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=outlaws"&amp;gt;outlaws&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=group+of+people"&amp;gt;group of people&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=hat"&amp;gt;hat&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=John+Marston"&amp;gt;John Marston&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a rel="tag" itemprop="relatedLink" href="https://www.wallpaperflare.com/search?wallpaper=architecture"&amp;gt;architecture&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;

&amp;lt;/ul&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div style="text-align: center; margin: 0px auto; width: 1230px;" id="native_ad" itemscope="" itemtype="http://schema.org/WPAdBlock"&amp;gt;
&amp;lt;script async="async" data-cfasync="false" src="//medalguardian.com/a582e0a4a6da761682748e425a1d9643/invoke.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div id="container-a582e0a4a6da761682748e425a1d9643"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;ul itemscope="" itemtype="http://schema.org/ImageGallery" class="gallery" id="gallery" align="center" style="width: 1230px; height: 7379px;"&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 0px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, red, gamers, Gamer, video games, Rockstar Games, sunset, western, sunrise, simple, Red Dead Redemption 2, group of people, silhouette, orange color, people, men, sky, real people, lifestyles, multi colored, women, togetherness, boys, males, group, motion, medium group of people, nature, leisure activity, fun, yellow, black, digital, wallpaper, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about yellow, red, and black group of men digital wallpaper, Red Dead Redemption, Original wallpaper dimensions is 3840x2160px, file size is 565.27KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="565.27KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/yellow-red-and-black-group-of-men-digital-wallpaper-red-dead-redemption-wallpaper-phtaz" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="yellow, red, and black group of men digital wallpaper, Red Dead Redemption HD wallpaper" title="yellow, red, and black group of men digital wallpaper, Red Dead Redemption HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/819/993/69/red-dead-redemption-red-gamers-gamer-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/819/993/69/red-dead-redemption-red-gamers-gamer-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;yellow, red, and black group of men digital wallpaper, Red Dead Redemption&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 0px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Red Dead Redemption, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 784.47KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="784.47KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-wallpaper-yczzz" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/219/629/87/red-dead-redemption-2-red-dead-redemption-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/219/629/87/red-dead-redemption-2-red-dead-redemption-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 0px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2133px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Games, Red Dead Redemption, Western, blackandwhite, videogame, 2018, reddeadredemption, red, dead, redemption, dark, k, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2 Dark 4K, Games, Western, blackandwhite, Original wallpaper dimensions is 3840x2133px, file size is 311.12KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="311.12KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-dark-4k-games-western-blackandwhite-wallpaper-bgdop" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2 Dark 4K, Games, Western, blackandwhite HD wallpaper" title="Red Dead Redemption 2 Dark 4K, Games, Western, blackandwhite HD wallpaper" width="400" height="222" data-src="https://c4.wallpaperflare.com/wallpaper/75/518/522/red-dead-redemption-2-dark-4k-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/75/518/522/red-dead-redemption-2-dark-4k-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2 Dark 4K, Games, Western, blackandwhite&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 265px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Rockstar Games, video games, Red Dead Redemption, sky, cloud - sky, nature, moon, group of people, land, field, grass, real people, men, beauty in nature, plant, night, togetherness, people, full moon, leisure activity, lifestyles, domestic animals, outdoors, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Rockstar Games, video games, sky, cloud - sky, Original wallpaper dimensions is 1920x1080px, file size is 228.97KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="228.97KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-rockstar-games-video-games-sky-cloud-sky-wallpaper-cszsz" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Rockstar Games, video games, sky, cloud - sky HD wallpaper" title="Red Dead Redemption 2, Rockstar Games, video games, sky, cloud - sky HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/671/330/469/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/671/330/469/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Rockstar Games, video games, sky, cloud - sky&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 268px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Cowboy, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Cowboy, Original wallpaper dimensions is 3840x2160px, file size is 632.02KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="632.02KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-cowboy-wallpaper-gilql" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Cowboy HD wallpaper" title="Red Dead, Red Dead Redemption 2, Cowboy HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/74/17/211/red-dead-red-dead-redemption-2-cowboy-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/74/17/211/red-dead-red-dead-redemption-2-cowboy-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Cowboy&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 288px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 702.49KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="702.49KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-conam" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/724/247/605/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/724/247/605/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 536px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 1920x1080px, file size is 71.13KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="71.13KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-arthur-morgan-wallpaper-gjoxg" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/66/161/194/red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/66/161/194/red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 553px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="video games, cowboys, Red Dead Redemption 2, Rockstar Games, western, Red Dead Redemption, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about video games, cowboys, Red Dead Redemption 2, Rockstar Games, Original wallpaper dimensions is 1920x1080px, file size is 132.18KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="132.18KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-cotfr" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="video games, cowboys, Red Dead Redemption 2, Rockstar Games HD wallpaper" title="video games, cowboys, Red Dead Redemption 2, Rockstar Games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/828/775/677/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/828/775/677/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;video games, cowboys, Red Dead Redemption 2, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 556px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Rockstar Games, Red Dead Redemption 2, video games, Red Dead Redemption, tree, plant, beauty in nature, sky, scenics - nature, tranquil scene, cloud - sky, tranquility, nature, water, non-urban scene, day, no people, growth, mountain, environment, land, outdoors, landscape, pine tree, coniferous tree, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Rockstar Games, Red Dead Redemption 2, video games, tree, plant, Original wallpaper dimensions is 3840x2160px, file size is 764.57KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="764.57KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/rockstar-games-red-dead-redemption-2-video-games-tree-plant-wallpaper-cpkrc" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Rockstar Games, Red Dead Redemption 2, video games, tree, plant HD wallpaper" title="Rockstar Games, Red Dead Redemption 2, video games, tree, plant HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/661/972/1002/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/661/972/1002/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Rockstar Games, Red Dead Redemption 2, video games, tree, plant&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 804px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, landscape, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, landscape, Original wallpaper dimensions is 3840x2160px, file size is 1.68MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.68MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-landscape-wallpaper-ytxsk" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2, landscape HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2, landscape HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/864/316/939/red-dead-redemption-red-dead-redemption-2-landscape-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/864/316/939/red-dead-redemption-red-dead-redemption-2-landscape-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2, landscape&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 821px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="video games, cowboys, Red Dead Redemption 2, Rockstar Games, western, Red Dead Redemption, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about video games, cowboys, Red Dead Redemption 2, Rockstar Games, Original wallpaper dimensions is 1920x1080px, file size is 323.68KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="323.68KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-crzlf" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="video games, cowboys, Red Dead Redemption 2, Rockstar Games HD wallpaper" title="video games, cowboys, Red Dead Redemption 2, Rockstar Games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/155/569/263/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/155/569/263/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;video games, cowboys, Red Dead Redemption 2, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 824px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="digital art, artwork, Red Dead Redemption, Red Dead Redemption 2, Arthur Morgan, video games, video game art, video game characters, red, revolver, men, cowboy hats, horse, Rockstar Games, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about digital art, artwork, Red Dead Redemption, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 1.31MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.31MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/digital-art-artwork-red-dead-redemption-red-dead-redemption-2-wallpaper-gvceq" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="digital art, artwork, Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" title="digital art, artwork, Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/740/918/401/digital-art-artwork-red-dead-redemption-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/740/918/401/digital-art-artwork-red-dead-redemption-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;digital art, artwork, Red Dead Redemption, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1072px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, video games, Arthur Morgan, one person, architecture, clothing, real people, built structure, hat, men, standing, building exterior, day, three quarter length, walking, occupation, holding, nature, front view, uniform, outdoors, government, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 1920x1080px, file size is 114.4KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="114.4KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-pwaby" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/985/775/602/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/985/775/602/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1089px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;2048x1152px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Rockstar Games, Arthur Morgan, screen shot, video games, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Rockstar Games, Arthur Morgan, screen shot, Original wallpaper dimensions is 2048x1152px, file size is 162.89KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="162.89KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-rockstar-games-arthur-morgan-screen-shot-wallpaper-edwqu" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Rockstar Games, Arthur Morgan, screen shot HD wallpaper" title="Red Dead Redemption 2, Rockstar Games, Arthur Morgan, screen shot HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/129/77/124/red-dead-redemption-2-rockstar-games-arthur-morgan-screen-shot-video-games-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/129/77/124/red-dead-redemption-2-rockstar-games-arthur-morgan-screen-shot-video-games-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Rockstar Games, Arthur Morgan, screen shot&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1092px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 1920x1080px, file size is 185.74KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="185.74KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-arthur-morgan-wallpaper-yhuyw" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/5/571/741/red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/5/571/741/red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1340px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="video games, Video Game Art, Red Dead Redemption, Red Dead Redemption 2, weapon, gun, John Marston, dutch van der linde, Arthur Morgan, Bill Williamson, domestic animals, domestic, mammal, pets, hat, one animal, vertebrate, dog, people, real people, canine, clothing, livestock, cowboy hat, adult, cowboy, full length, pet owner, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about video games, Video Game Art, Red Dead Redemption, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 468.55KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="468.55KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/video-games-video-game-art-red-dead-redemption-red-dead-redemption-2-wallpaper-ccron" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="video games, Video Game Art, Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" title="video games, Video Game Art, Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/969/669/152/video-games-video-game-art-red-dead-redemption-red-dead-redemption-2-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/969/669/152/video-games-video-game-art-red-dead-redemption-red-dead-redemption-2-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;video games, Video Game Art, Red Dead Redemption, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1360px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Cowboy, Horse, Silhouette, Western, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Cowboy, Horse, Silhouette, Original wallpaper dimensions is 1920x1080px, file size is 177.83KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="177.83KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-cowboy-horse-silhouette-wallpaper-czevk" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Cowboy, Horse, Silhouette HD wallpaper" title="Red Dead, Red Dead Redemption 2, Cowboy, Horse, Silhouette HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/836/631/683/red-dead-red-dead-redemption-2-cowboy-horse-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/836/631/683/red-dead-red-dead-redemption-2-cowboy-horse-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Cowboy, Horse, Silhouette&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1377px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 396.31KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="396.31KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-cgmre" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/238/328/834/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/238/328/834/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1628px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, landscape, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, landscape, Original wallpaper dimensions is 3840x2160px, file size is 1.17MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.17MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-landscape-wallpaper-ytxhz" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2, landscape HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2, landscape HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/372/405/164/red-dead-redemption-red-dead-redemption-2-landscape-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/372/405/164/red-dead-redemption-red-dead-redemption-2-landscape-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2, landscape&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1628px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 1.2MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.2MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-wallpaper-ytdqs" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/615/985/90/red-dead-redemption-red-dead-redemption-2-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/615/985/90/red-dead-redemption-red-dead-redemption-2-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1645px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;2333x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="hat, art, cigarette, cowboy, Red Dead Redemption 2, RDO, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about hat, art, cigarette, cowboy, Red Dead Redemption 2, RDO, Arthur Morgan, Original wallpaper dimensions is 2333x1080px, file size is 174.47KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="174.47KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/hat-art-cigarette-cowboy-red-dead-redemption-2-rdo-arthur-morgan-wallpaper-ysdox" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="hat, art, cigarette, cowboy, Red Dead Redemption 2, RDO, Arthur Morgan HD wallpaper" title="hat, art, cigarette, cowboy, Red Dead Redemption 2, RDO, Arthur Morgan HD wallpaper" width="400" height="185" data-src="https://c4.wallpaperflare.com/wallpaper/602/225/157/hat-art-cigarette-cowboy-red-dead-redemption-2-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/602/225/157/hat-art-cigarette-cowboy-red-dead-redemption-2-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;hat, art, cigarette, cowboy, Red Dead Redemption 2, RDO, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1893px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="video games, Red Dead Redemption 2, landscape, nature, horse, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about video games, Red Dead Redemption 2, landscape, nature, horse, Original wallpaper dimensions is 1920x1080px, file size is 298.64KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="298.64KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/video-games-red-dead-redemption-2-landscape-nature-horse-wallpaper-yhlad" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="video games, Red Dead Redemption 2, landscape, nature, horse HD wallpaper" title="video games, Red Dead Redemption 2, landscape, nature, horse HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/957/434/358/video-games-red-dead-redemption-2-landscape-nature-horse-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/957/434/358/video-games-red-dead-redemption-2-landscape-nature-horse-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;video games, Red Dead Redemption 2, landscape, nature, horse&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1896px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="4K, screenshot, Red Dead Redemption 2, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about 4K, screenshot, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 1.12MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.12MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/4k-screenshot-red-dead-redemption-2-wallpaper-bilid" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="4K, screenshot, Red Dead Redemption 2 HD wallpaper" title="4K, screenshot, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/385/385/311/4k-screenshot-red-dead-redemption-2-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/385/385/311/4k-screenshot-red-dead-redemption-2-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;4K, screenshot, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 1896px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1072px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Arthur Morgan, outlaws, video games, smoking, snow, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Arthur Morgan, outlaws, video games, Original wallpaper dimensions is 1920x1072px, file size is 107.81KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="107.81KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-arthur-morgan-outlaws-video-games-wallpaper-znlhz" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Arthur Morgan, outlaws, video games HD wallpaper" title="Red Dead Redemption 2, Arthur Morgan, outlaws, video games HD wallpaper" width="400" height="223" data-src="https://c4.wallpaperflare.com/wallpaper/77/526/563/red-dead-redemption-2-arthur-morgan-outlaws-video-games-smoking-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/77/526/563/red-dead-redemption-2-arthur-morgan-outlaws-video-games-smoking-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Arthur Morgan, outlaws, video games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2161px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, hat, clothing, two people, adult, tree, men, portrait, real people, waist up, people, women, plant, leisure activity, nature, standing, lifestyles, looking at camera, day, cowboy, couple - relationship, outdoors, cowboy hat, government, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 831.04KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="831.04KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-cbdmd" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/387/1022/405/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/387/1022/405/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2162px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, video games, Arthur Morgan, sunset, dusk, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, video games, Arthur Morgan, sunset, dusk, Original wallpaper dimensions is 1920x1080px, file size is 39.94KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="39.94KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-video-games-arthur-morgan-sunset-dusk-wallpaper-ymnbi" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, video games, Arthur Morgan, sunset, dusk HD wallpaper" title="Red Dead Redemption 2, video games, Arthur Morgan, sunset, dusk HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/869/353/161/red-dead-redemption-2-video-games-arthur-morgan-sunset-dusk-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/869/353/161/red-dead-redemption-2-video-games-arthur-morgan-sunset-dusk-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, video games, Arthur Morgan, sunset, dusk&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2164px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="4K, Red Dead Redemption 2, poster, artwork, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about 4K, Red Dead Redemption 2, poster, artwork, Original wallpaper dimensions is 3840x2160px, file size is 1.93MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.93MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/4k-red-dead-redemption-2-poster-artwork-wallpaper-qoouz" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="4K, Red Dead Redemption 2, poster, artwork HD wallpaper" title="4K, Red Dead Redemption 2, poster, artwork HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/62/936/896/4k-red-dead-redemption-2-poster-artwork-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/62/936/896/4k-red-dead-redemption-2-poster-artwork-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;4K, Red Dead Redemption 2, poster, artwork&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2429px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, Video Game Art, video games, cowboys, fire, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, Video Game Art, Original wallpaper dimensions is 1920x1080px, file size is 194.64KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="194.64KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-video-game-art-wallpaper-cgtvh" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2, Video Game Art HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2, Video Game Art HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/673/903/748/red-dead-redemption-red-dead-redemption-2-video-game-art-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/673/903/748/red-dead-redemption-red-dead-redemption-2-video-game-art-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2, Video Game Art&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2430px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde, John Marston, Micah Bell, Sadie Adler, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde, Original wallpaper dimensions is 3840x2160px, file size is 1.1MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.1MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-dutch-van-der-linde-wallpaper-cwvmi" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/81/249/300/red-dead-red-dead-redemption-2-arthur-morgan-dutch-van-der-linde-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/81/249/300/red-dead-red-dead-redemption-2-arthur-morgan-dutch-van-der-linde-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2432px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1599x939px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, digital art, cover art, Rockstar Games, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, digital art, cover art, Rockstar Games, Original wallpaper dimensions is 1599x939px, file size is 123.99KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="123.99KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-digital-art-cover-art-rockstar-games-wallpaper-udgkg" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, digital art, cover art, Rockstar Games HD wallpaper" title="Red Dead Redemption 2, digital art, cover art, Rockstar Games HD wallpaper" width="400" height="235" data-src="https://c4.wallpaperflare.com/wallpaper/139/969/201/red-dead-redemption-2-digital-art-cover-art-rockstar-games-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/139/969/201/red-dead-redemption-2-digital-art-cover-art-rockstar-games-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, digital art, cover art, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2697px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, nature, fire, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, nature, fire, Original wallpaper dimensions is 1920x1080px, file size is 400.4KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="400.4KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-nature-fire-wallpaper-ysunj" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, nature, fire HD wallpaper" title="Red Dead Redemption 2, nature, fire HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/304/417/128/red-dead-redemption-2-nature-fire-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/304/417/128/red-dead-redemption-2-nature-fire-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, nature, fire&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2710px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Rockstar Games, Red Dead Redemption 2, video games, Red Dead Redemption, full length, real people, group of people, tree, standing, lifestyles, leisure activity, men, people, adult, building exterior, front view, plant, young adult, nature, architecture, built structure, casual clothing, young men, togetherness, outdoors, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Rockstar Games, Red Dead Redemption 2, video games, full length, Original wallpaper dimensions is 3840x2160px, file size is 1.01MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.01MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/rockstar-games-red-dead-redemption-2-video-games-full-length-wallpaper-cpvew" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Rockstar Games, Red Dead Redemption 2, video games, full length HD wallpaper" title="Rockstar Games, Red Dead Redemption 2, video games, full length HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/676/270/454/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/676/270/454/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Rockstar Games, Red Dead Redemption 2, video games, full length&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2718px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, video games, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, video games, Original wallpaper dimensions is 1920x1080px, file size is 232.45KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="232.45KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-video-games-wallpaper-gjrvd" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, video games HD wallpaper" title="Red Dead Redemption 2, video games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/218/527/624/red-dead-redemption-2-video-games-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/218/527/624/red-dead-redemption-2-video-games-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, video games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2965px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="art, Red Dead Redemption 2, Red Dead, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about art, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 1.03MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.03MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/art-red-dead-redemption-2-arthur-morgan-wallpaper-ysfby" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="art, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="art, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/129/67/686/art-red-dead-redemption-2-red-dead-arthur-morgan-arthur-morgan-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/129/67/686/art-red-dead-redemption-2-red-dead-arthur-morgan-arthur-morgan-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;art, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2978px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Rockstar Games, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Rockstar Games, Original wallpaper dimensions is 1920x1080px, file size is 89.84KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="89.84KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-rockstar-games-wallpaper-yhlks" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Rockstar Games HD wallpaper" title="Red Dead Redemption 2, Rockstar Games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/761/732/1018/red-dead-redemption-2-rockstar-games-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/761/732/1018/red-dead-redemption-2-rockstar-games-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 2986px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, video games, domestic, mammal, domestic animals, livestock, mountain, riding, cloud - sky, ride, horse, animal wildlife, land, vertebrate, one person, pets, activity, sky, horseback riding, men, mountain range, outdoors, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 782.2KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="782.2KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-pumnt" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/526/456/884/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/526/456/884/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3233px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, screen shot, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, screen shot, Original wallpaper dimensions is 1920x1080px, file size is 302.48KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="302.48KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-screen-shot-wallpaper-gruah" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, screen shot HD wallpaper" title="Red Dead Redemption 2, screen shot HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/466/57/99/red-dead-redemption-2-screen-shot-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/466/57/99/red-dead-redemption-2-screen-shot-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, screen shot&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3246px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Rockstar Games, Red Dead Redemption 2, video games, Red Dead Redemption, tree, plant, land, forest, fog, nature, beauty in nature, tranquility, growth, trunk, tree trunk, woodland, non-urban scene, tranquil scene, day, sky, no people, scenics - nature, landscape, outdoors, hazy, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Rockstar Games, Red Dead Redemption 2, video games, tree, plant, Original wallpaper dimensions is 3840x2160px, file size is 637.62KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="637.62KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/rockstar-games-red-dead-redemption-2-video-games-tree-plant-wallpaper-cbvwz" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Rockstar Games, Red Dead Redemption 2, video games, tree, plant HD wallpaper" title="Rockstar Games, Red Dead Redemption 2, video games, tree, plant HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/241/432/901/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/241/432/901/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Rockstar Games, Red Dead Redemption 2, video games, tree, plant&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3254px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1745x2500px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Ismail Inceoglu, fan art, Red Dead Redemption 2, Red Dead Redemption, video games, digital, concept art, western, Arthur Morgan, cowboys, outlaws, town, revolver, Duel, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Ismail Inceoglu, fan art, Red Dead Redemption 2, video games, Original wallpaper dimensions is 1745x2500px, file size is 943KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="943KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/ismail-inceoglu-fan-art-red-dead-redemption-2-video-games-wallpaper-cyhva" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Ismail Inceoglu, fan art, Red Dead Redemption 2, video games HD wallpaper" title="Ismail Inceoglu, fan art, Red Dead Redemption 2, video games HD wallpaper" width="400" height="573" data-src="https://c4.wallpaperflare.com/wallpaper/706/432/926/ismail-inceoglu-fan-art-red-dead-redemption-2-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/706/432/926/ismail-inceoglu-fan-art-red-dead-redemption-2-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Ismail Inceoglu, fan art, Red Dead Redemption 2, video games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3501px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 1.48MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.48MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-cxnze" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/267/47/595/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/267/47/595/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3514px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 489.07KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="489.07KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-gdyep" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/810/485/84/red-dead-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/810/485/84/red-dead-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3769px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Game, Rockstar Games, Red Dead Redemption 2, Gang, RDR, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Game, Rockstar Games, Red Dead Redemption 2, Gang, RDR, Original wallpaper dimensions is 3840x2160px, file size is 652.42KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="652.42KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/game-rockstar-games-red-dead-redemption-2-gang-rdr-wallpaper-ysopf" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Game, Rockstar Games, Red Dead Redemption 2, Gang, RDR HD wallpaper" title="Game, Rockstar Games, Red Dead Redemption 2, Gang, RDR HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/388/910/381/game-rockstar-games-red-dead-redemption-2-gang-rdr-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/388/910/381/game-rockstar-games-red-dead-redemption-2-gang-rdr-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Game, Rockstar Games, Red Dead Redemption 2, Gang, RDR&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3782px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, video games, Video Game Art, western, dark, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, video games, Video Game Art, western, Original wallpaper dimensions is 3840x2160px, file size is 578.48KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="578.48KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-video-games-video-game-art-western-wallpaper-udysf" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, video games, Video Game Art, western HD wallpaper" title="Red Dead Redemption 2, video games, Video Game Art, western HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/5/861/99/red-dead-redemption-2-video-games-video-game-art-western-dark-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/5/861/99/red-dead-redemption-2-video-games-video-game-art-western-dark-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, video games, Video Game Art, western&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 3870px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 304.41KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="304.41KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-ynanq" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/921/777/168/red-dead-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/921/777/168/red-dead-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4037px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 548.15KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="548.15KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-cfbox" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/321/594/530/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/321/594/530/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4050px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Rockstar Games, Red Dead Redemption, Red Dead Redemption 2, video games, western, cowboys, Arthur Morgan, beard, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Rockstar Games, Red Dead Redemption, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 670.66KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="670.66KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/rockstar-games-red-dead-redemption-red-dead-redemption-2-wallpaper-cgzgj" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Rockstar Games, Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" title="Rockstar Games, Red Dead Redemption, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/717/685/68/rockstar-games-red-dead-redemption-red-dead-redemption-2-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/717/685/68/rockstar-games-red-dead-redemption-red-dead-redemption-2-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Rockstar Games, Red Dead Redemption, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4138px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1124px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 1920x1124px, file size is 298.66KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="298.66KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-crdpw" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="234" data-src="https://c4.wallpaperflare.com/wallpaper/562/164/960/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/562/164/960/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4305px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1072px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Arthur Morgan, outlaws, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Arthur Morgan, outlaws, Original wallpaper dimensions is 1920x1072px, file size is 256.51KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="256.51KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-arthur-morgan-outlaws-wallpaper-znlhb" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Arthur Morgan, outlaws HD wallpaper" title="Red Dead Redemption 2, Arthur Morgan, outlaws HD wallpaper" width="400" height="223" data-src="https://c4.wallpaperflare.com/wallpaper/768/892/874/red-dead-redemption-2-arthur-morgan-outlaws-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/768/892/874/red-dead-redemption-2-arthur-morgan-outlaws-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Arthur Morgan, outlaws&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4318px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 444KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="444KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-pbqbt" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/45/598/362/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/45/598/362/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4415px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="video games, cowboys, Red Dead Redemption 2, Rockstar Games, western, Red Dead Redemption, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about video games, cowboys, Red Dead Redemption 2, Rockstar Games, Original wallpaper dimensions is 1920x1080px, file size is 225.9KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="225.9KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-cofsk" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="video games, cowboys, Red Dead Redemption 2, Rockstar Games HD wallpaper" title="video games, cowboys, Red Dead Redemption 2, Rockstar Games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/400/983/660/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/400/983/660/video-games-cowboys-red-dead-redemption-2-rockstar-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;video games, cowboys, Red Dead Redemption 2, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4571px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead 3, Rockstar Games, Red Dead Redemption 2, Red Dead Redemption, group of people, silhouette, sky, night, people, nature, crowd, men, real people, sunset, walking, celebration, adult, red, motion, heat - temperature, landscape, unrecognizable person, land, illustration, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about silhouette of people during sunset illustration, Red Dead 3, Rockstar Games, Original wallpaper dimensions is 1920x1080px, file size is 153.43KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="153.43KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/silhouette-of-people-during-sunset-illustration-red-dead-3-rockstar-games-wallpaper-ptqza" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="silhouette of people during sunset illustration, Red Dead 3, Rockstar Games HD wallpaper" title="silhouette of people during sunset illustration, Red Dead 3, Rockstar Games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/589/37/106/red-dead-3-rockstar-games-red-dead-redemption-2-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/589/37/106/red-dead-3-rockstar-games-red-dead-redemption-2-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;silhouette of people during sunset illustration, Red Dead 3, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4586px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Rockstar Games, video games, Red Dead Redemption, water, tree, beauty in nature, waterfall, scenics - nature, nature, plant, sky, motion, travel, flowing water, long exposure, architecture, travel destinations, environment, no people, rock, day, tourism, outdoors, flowing, power in nature, falling water, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Rockstar Games, video games, water, tree, Original wallpaper dimensions is 3840x2160px, file size is 940.67KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="940.67KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-rockstar-games-video-games-water-tree-wallpaper-cpdsv" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Rockstar Games, video games, water, tree HD wallpaper" title="Red Dead Redemption 2, Rockstar Games, video games, water, tree HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/359/663/644/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/359/663/644/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Rockstar Games, video games, water, tree&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4683px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, video games, real people, leisure activity, focus on foreground, people, nature, men, day, tree, three quarter length, front view, land, standing, mature adult, clothing, lifestyles, activity, outdoors, mature men, hunter, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 542.96KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="542.96KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-pbqam" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/858/187/637/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/858/187/637/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4854px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1072px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, Rockstar Games, horse, John Marston, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, Rockstar Games, Original wallpaper dimensions is 1920x1072px, file size is 85.05KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="85.05KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-rockstar-games-wallpaper-yerqp" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2, Rockstar Games HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2, Rockstar Games HD wallpaper" width="400" height="223" data-src="https://c4.wallpaperflare.com/wallpaper/90/697/244/red-dead-redemption-red-dead-redemption-2-rockstar-games-horse-john-marston-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/90/697/244/red-dead-redemption-red-dead-redemption-2-rockstar-games-horse-john-marston-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4859px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Arthur Morgan, _3d, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Arthur Morgan, _3d, Original wallpaper dimensions is 3840x2160px, file size is 342.08KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="342.08KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-arthur-morgan-3d-wallpaper-ytbct" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Arthur Morgan, _3d HD wallpaper" title="Red Dead Redemption 2, Arthur Morgan, _3d HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/414/785/77/red-dead-redemption-2-arthur-morgan-3d-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/414/785/77/red-dead-redemption-2-arthur-morgan-3d-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Arthur Morgan, _3d&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 4951px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, video games, one person, real people, men, three quarter length, day, hat, clothing, leisure activity, front view, holding, lifestyles, tree, nature, casual clothing, occupation, mid adult, outdoors, plant, sitting, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 671.19KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="671.19KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-mfvni" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/169/295/615/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/169/295/615/red-dead-redemption-rockstar-games-red-dead-redemption-2-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5120px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Video Game, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Video Game, Original wallpaper dimensions is 1920x1080px, file size is 124.47KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="124.47KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-video-game-wallpaper-costc" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Video Game HD wallpaper" title="Red Dead, Red Dead Redemption 2, Video Game HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/391/317/125/red-dead-red-dead-redemption-2-video-game-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/391/317/125/red-dead-red-dead-redemption-2-video-game-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Video Game&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5127px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="video games, Red Dead Redemption 2, sunlight, sky, Video Game Art, 2017 (Year), sunset, women, nature, cloud - sky, beauty in nature, orange color, adult, people, sunbeam, land, standing, sun, lens flare, real people, lifestyles, outdoors, tranquility, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about video games, Red Dead Redemption 2, sunlight, sky, Video Game Art, Original wallpaper dimensions is 1920x1080px, file size is 276.41KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="276.41KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/video-games-red-dead-redemption-2-sunlight-sky-video-game-art-wallpaper-pgfqr" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="video games, Red Dead Redemption 2, sunlight, sky, Video Game Art HD wallpaper" title="video games, Red Dead Redemption 2, sunlight, sky, Video Game Art HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/870/812/854/video-games-red-dead-redemption-2-sunlight-sky-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/870/812/854/video-games-red-dead-redemption-2-sunlight-sky-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;video games, Red Dead Redemption 2, sunlight, sky, Video Game Art&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5219px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="night, the moon, cowboys, Red Dead Redemption 2, wild West, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about night, the moon, cowboys, Red Dead Redemption 2, wild West, Original wallpaper dimensions is 1920x1080px, file size is 250.9KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="250.9KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/night-the-moon-cowboys-red-dead-redemption-2-wild-west-wallpaper-srnup" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="night, the moon, cowboys, Red Dead Redemption 2, wild West HD wallpaper" title="night, the moon, cowboys, Red Dead Redemption 2, wild West HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/59/622/486/night-the-moon-cowboys-red-dead-redemption-2-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/59/622/486/night-the-moon-cowboys-red-dead-redemption-2-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;night, the moon, cowboys, Red Dead Redemption 2, wild West&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5388px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde, John Marston, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde, Original wallpaper dimensions is 3840x2160px, file size is 468.55KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="468.55KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-dutch-van-der-linde-wallpaper-cfbon" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/969/669/152/red-dead-red-dead-redemption-2-arthur-morgan-dutch-van-der-linde-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/969/669/152/red-dead-red-dead-redemption-2-arthur-morgan-dutch-van-der-linde-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan, Dutch van der Linde&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5415px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1072px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Arthur Morgan, outlaws, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Arthur Morgan, outlaws, Original wallpaper dimensions is 1920x1072px, file size is 131.77KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="131.77KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-arthur-morgan-outlaws-wallpaper-znlhu" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Arthur Morgan, outlaws HD wallpaper" title="Red Dead Redemption 2, Arthur Morgan, outlaws HD wallpaper" width="400" height="223" data-src="https://c4.wallpaperflare.com/wallpaper/972/801/200/red-dead-redemption-2-arthur-morgan-outlaws-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/972/801/200/red-dead-redemption-2-arthur-morgan-outlaws-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Arthur Morgan, outlaws&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5487px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 612.69KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="612.69KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-cfbou" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/658/1012/984/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/658/1012/984/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5676px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Rockstar Games, video games, Red Dead Redemption, tree, smoke - physical structure, plant, steam train, train, rail transportation, nature, fog, train - vehicle, no people, architecture, steam, environment, day, transportation, emitting, sky, mode of transportation, motion, pollution, outdoors, air pollution, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Rockstar Games, video games, tree, smoke - physical structure, Original wallpaper dimensions is 1920x1080px, file size is 235.01KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="235.01KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-rockstar-games-video-games-tree-smoke-physical-structure-wallpaper-csucv" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Rockstar Games, video games, tree, smoke - physical structure HD wallpaper" title="Red Dead Redemption 2, Rockstar Games, video games, tree, smoke - physical structure HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/910/969/149/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/910/969/149/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Rockstar Games, video games, tree, smoke - physical structure&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5681px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, Video Game Art, video games, cowboys, horse, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, Video Game Art, Original wallpaper dimensions is 3840x2160px, file size is 751.1KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="751.1KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-video-game-art-wallpaper-cjbcy" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2, Video Game Art HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2, Video Game Art HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/4/605/224/red-dead-redemption-red-dead-redemption-2-video-game-art-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/4/605/224/red-dead-redemption-red-dead-redemption-2-video-game-art-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2, Video Game Art&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5755px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1072px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Arthur Morgan, outlaws, Sadie Adler, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Arthur Morgan, outlaws, Sadie Adler, Original wallpaper dimensions is 1920x1072px, file size is 240.3KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="240.3KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-arthur-morgan-outlaws-sadie-adler-wallpaper-znlhw" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Arthur Morgan, outlaws, Sadie Adler HD wallpaper" title="Red Dead Redemption 2, Arthur Morgan, outlaws, Sadie Adler HD wallpaper" width="400" height="223" data-src="https://c4.wallpaperflare.com/wallpaper/615/563/616/red-dead-redemption-2-arthur-morgan-outlaws-sadie-adler-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/615/563/616/red-dead-redemption-2-arthur-morgan-outlaws-sadie-adler-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Arthur Morgan, outlaws, Sadie Adler&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5949px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;2560x1440px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Red Dead Redemption II, video games, sunset, forest, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, Red Dead Redemption II, video games, Original wallpaper dimensions is 2560x1440px, file size is 386.81KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="386.81KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-red-dead-redemption-ii-video-games-wallpaper-ymyix" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, Red Dead Redemption II, video games HD wallpaper" title="Red Dead Redemption 2, Red Dead Redemption II, video games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/408/431/669/red-dead-redemption-2-red-dead-redemption-ii-video-games-sunset-forest-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/408/431/669/red-dead-redemption-2-red-dead-redemption-ii-video-games-sunset-forest-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, Red Dead Redemption II, video games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 5964px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, Rockstar Games, video games, Red Dead Redemption, tree, plant, land, forest, nature, growth, mammal, woodland, one animal, beauty in nature, animal, day, pets, sunlight, tranquility, dog, domestic, canine, animal themes, domestic animals, no people, outdoors, brown, black, painting, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about brown and black tree painting, Red Dead Redemption 2, Rockstar Games, Original wallpaper dimensions is 1920x1080px, file size is 387.3KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="387.3KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/brown-and-black-tree-painting-red-dead-redemption-2-rockstar-games-wallpaper-pepmf" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="brown and black tree painting, Red Dead Redemption 2, Rockstar Games HD wallpaper" title="brown and black tree painting, Red Dead Redemption 2, Rockstar Games HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/656/459/587/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/656/459/587/red-dead-redemption-2-rockstar-games-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;brown and black tree painting, Red Dead Redemption 2, Rockstar Games&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6021px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Poker, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Poker, Original wallpaper dimensions is 3840x2160px, file size is 1.3MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.3MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-poker-wallpaper-gkixt" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Poker HD wallpaper" title="Red Dead, Red Dead Redemption 2, Poker HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/703/690/440/red-dead-red-dead-redemption-2-poker-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/703/690/440/red-dead-red-dead-redemption-2-poker-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Poker&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6217px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 3840x2160px, file size is 204.33KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="204.33KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-gxaud" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/301/608/929/red-dead-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/301/608/929/red-dead-red-dead-redemption-2-arthur-morgan-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6252px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption 2, train, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption 2, train, Original wallpaper dimensions is 1920x1080px, file size is 170.33KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="170.33KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-2-train-wallpaper-ysuno" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption 2, train HD wallpaper" title="Red Dead Redemption 2, train HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/769/340/850/red-dead-redemption-2-train-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/769/340/850/red-dead-redemption-2-train-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption 2, train&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6289px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x810px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Rockstar Games, Red Dead Redemption 2, forest, in-game, star trails, night sky, campfire, stars, Red Dead Redemption, night, tree, plant, nature, burning, fire, land, fire - natural phenomenon, star - space, sky, flame, no people, heat - temperature, illuminated, motion, outdoors, bonfire, dusk, beauty in nature, milky, way, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about forest under milky way, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 1920x810px, file size is 156.83KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="156.83KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/forest-under-milky-way-rockstar-games-red-dead-redemption-2-wallpaper-pbmir" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="forest under milky way, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="forest under milky way, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="169" data-src="https://c4.wallpaperflare.com/wallpaper/49/891/746/rockstar-games-red-dead-redemption-2-forest-in-game-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/49/891/746/rockstar-games-red-dead-redemption-2-forest-in-game-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;forest under milky way, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6485px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, Arthur Morgan, John Marston, Rockstar Games, Xbox, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, Arthur Morgan, John Marston, Original wallpaper dimensions is 3840x2160px, file size is 1.1MB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="1.1MB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-arthur-morgan-john-marston-wallpaper-yttum" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2, Arthur Morgan, John Marston HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2, Arthur Morgan, John Marston HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/404/248/62/red-dead-redemption-red-dead-redemption-2-arthur-morgan-john-marston-rockstar-games-hd-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/404/248/62/red-dead-redemption-red-dead-redemption-2-arthur-morgan-john-marston-rockstar-games-hd-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2, Arthur Morgan, John Marston&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6501px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="4K, Red Dead Redemption 2, screenshot, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about 4K, Red Dead Redemption 2, screenshot, Original wallpaper dimensions is 3840x2160px, file size is 747.02KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="747.02KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/4k-red-dead-redemption-2-screenshot-wallpaper-bkzch" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="4K, Red Dead Redemption 2, screenshot HD wallpaper" title="4K, Red Dead Redemption 2, screenshot HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/790/823/632/4k-red-dead-redemption-2-screenshot-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/790/823/632/4k-red-dead-redemption-2-screenshot-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;4K, Red Dead Redemption 2, screenshot&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6520px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Rockstar Games, Red Dead Redemption 2, video games, Red Dead Redemption, text, western script, black background, communication, studio shot, red, capital letter, no people, cut out, single word, close-up, copy space, black color, night, sign, indoors, white color, dark, illuminated, architecture, message, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Rockstar Games, Red Dead Redemption 2, video games, text, western script, Original wallpaper dimensions is 3840x2160px, file size is 161.02KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="161.02KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/rockstar-games-red-dead-redemption-2-video-games-text-western-script-wallpaper-puoet" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Rockstar Games, Red Dead Redemption 2, video games, text, western script HD wallpaper" title="Rockstar Games, Red Dead Redemption 2, video games, text, western script HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/154/827/792/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/154/827/792/rockstar-games-red-dead-redemption-2-video-games-red-dead-redemption-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Rockstar Games, Red Dead Redemption 2, video games, text, western script&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6769px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, tree, real people, plant, men, two people, silhouette, nature, rear view, lifestyles, people, walking, full length, water, forest, the way forward, leisure activity, togetherness, standing, direction, outdoors, rain, rainy season, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Rockstar Games, Red Dead Redemption 2, Original wallpaper dimensions is 3840x2160px, file size is 637.81KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="637.81KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-pmffy" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" title="Red Dead Redemption, Rockstar Games, Red Dead Redemption 2 HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/101/884/1024/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/101/884/1024/red-dead-redemption-rockstar-games-red-dead-redemption-2-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Rockstar Games, Red Dead Redemption 2&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6773px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1090px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 1920x1090px, file size is 226.87KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="226.87KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-cfuyu" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="227" data-src="https://c4.wallpaperflare.com/wallpaper/817/731/610/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/817/731/610/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 6808px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, gamers, video games, Gamer, red, sunset, sunrise, western, Rockstar Games, Red Dead Redemption 2, group of people, people, men, silhouette, real people, orange color, nature, full length, lifestyles, leisure activity, medium group of people, group, women, sky, standing, togetherness, adult, males, art and craft, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, gamers, video games, sunset, sunrise, western, Original wallpaper dimensions is 1920x1080px, file size is 269.81KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="269.81KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-gamers-video-games-sunset-sunrise-western-wallpaper-chgrm" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, gamers, video games, sunset, sunrise, western HD wallpaper" title="Red Dead Redemption, gamers, video games, sunset, sunrise, western HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/1006/232/885/red-dead-redemption-gamers-video-games-gamer-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/1006/232/885/red-dead-redemption-gamers-video-games-gamer-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, gamers, video games, sunset, sunrise, western&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 7037px; left: 415px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead, Red Dead Redemption 2, Arthur Morgan, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead, Red Dead Redemption 2, Arthur Morgan, Original wallpaper dimensions is 1920x1080px, file size is 140.09KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="140.09KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-cwfjk" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" title="Red Dead, Red Dead Redemption 2, Arthur Morgan HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/940/605/208/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/940/605/208/red-dead-red-dead-redemption-2-arthur-morgan-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead, Red Dead Redemption 2, Arthur Morgan&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 7043px; left: 830px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;3840x2160px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Red Dead Redemption, Red Dead Redemption 2, Video Game Art, video games, horse, cowboys, tree, real people, men, people, lifestyles, plant, sitting, clothing, forest, leisure activity, day, fog, nature, transportation, three quarter length, land, adult, rear view, ride, outdoors, riding, warm clothing, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Red Dead Redemption, Red Dead Redemption 2, Video Game Art, Original wallpaper dimensions is 3840x2160px, file size is 649.38KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="649.38KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/red-dead-redemption-red-dead-redemption-2-video-game-art-wallpaper-pwmca" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Red Dead Redemption, Red Dead Redemption 2, Video Game Art HD wallpaper" title="Red Dead Redemption, Red Dead Redemption 2, Video Game Art HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/316/855/778/red-dead-redemption-red-dead-redemption-2-video-game-art-video-games-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/316/855/778/red-dead-redemption-red-dead-redemption-2-video-game-art-video-games-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Red Dead Redemption, Red Dead Redemption 2, Video Game Art&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li itemprop="associatedMedia" itemscope="" itemtype="http://schema.org/ImageObject" style="position: absolute; margin: 0px; top: 7096px; left: 0px;"&amp;gt;
&amp;lt;span class="res"&amp;gt;1920x1080px&amp;lt;/span&amp;gt;
&amp;lt;figure&amp;gt;
&amp;lt;meta itemprop="fileFormat" content="image/jpeg"&amp;gt;
&amp;lt;meta itemprop="keywords" content="Sunset, The game, Art, Rockstar, Concept Art, Cowboy, Western, Game Art, Red Dead Redemption 2, Environments, West, Dani Haynes, by Dani Haynes, RDR, RDR 2, Red Dead Redemption 2 - Fan art, HD wallpapers, PC wallpapers, mobile wallpapers, tablet wallpapers, HD desktop, free download, 1080P, 2K, 4K, 5K"&amp;gt;
&amp;lt;meta itemprop="description" content="This HD wallpaper is about Sunset, The game, Art, Rockstar, Concept Art, Cowboy, Western, Original wallpaper dimensions is 1920x1080px, file size is 314.19KB"&amp;gt;
&amp;lt;meta itemprop="contentSize" content="314.19KB"&amp;gt;
&amp;lt;a itemprop="url" href="https://www.wallpaperflare.com/sunset-the-game-art-rockstar-concept-art-cowboy-western-wallpaper-uesyw" target="_blank"&amp;gt;
&amp;lt;img class="lazy loaded" itemprop="contentUrl" alt="Sunset, The game, Art, Rockstar, Concept Art, Cowboy, Western HD wallpaper" title="Sunset, The game, Art, Rockstar, Concept Art, Cowboy, Western HD wallpaper" width="400" height="225" data-src="https://c4.wallpaperflare.com/wallpaper/194/985/89/sunset-the-game-art-rockstar-wallpaper-preview.jpg" src="https://c4.wallpaperflare.com/wallpaper/194/985/89/sunset-the-game-art-rockstar-wallpaper-preview.jpg" data-was-processed="true"&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;figcaption itemprop="caption description"&amp;gt;Sunset, The game, Art, Rockstar, Concept Art, Cowboy, Western&amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;div class="prevnext"&amp;gt;
&amp;lt;a class="nolink left"&amp;gt;Prev Page&amp;lt;/a&amp;gt;
&amp;lt;a href="https://www.wallpaperflare.com/search?wallpaper=red+dead+redemption+2&amp;amp;amp;page=2" class="nextpage bgcolor right"&amp;gt;Next Page&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&amp;lt;/main&amp;gt;
&amp;lt;footer&amp;gt;
&amp;lt;script&amp;gt;var site='https://www.wallpaperflare.com';&amp;lt;/script&amp;gt;
&amp;lt;script src="https://www.wallpaperflare.com/public/wo.js?2023"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;span id="elevator" title="back to top" onclick="scrollToTop()"&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;script src="https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.js" data-cfasync="false"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
        window.cookieconsent.initialise({
          "palette": {
            "popup": {
              "background": "#343c66",
              "text": "#cfcfe8"
            },
            "button": {
              "background": "#f71559"
            }
          },
          "theme": "edgeless",
          "content": {
            "href": "https://www.wallpaperflare.com/privacy-policy"
          }
        });
        &amp;lt;/script&amp;gt;
&amp;lt;/footer&amp;gt;


&amp;lt;scribe-shadow id="crxjs-ext" style="position: fixed; width: 0px; height: 0px; top: 0px; left: 0px; z-index: 2147483647; overflow: visible;"&amp;gt;&amp;lt;/scribe-shadow&amp;gt;&amp;lt;div id="monica-content-root" class="monica-widget"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div id="wpjbud2" style="position: fixed; inset: 0px; z-index: 2147483647; background: black; opacity: 0.01; height: 929px; width: 1680px;"&amp;gt;&amp;lt;a id="lkxvo" href="http://happenemerged.com/d1phghk7e?plpdu=87&amp;amp;amp;refer=https%3A%2F%2Fwww.wallpaperflare.com%2Fsearch%3Fwallpaper%3Dred%2Bdead%2Bredemption%2B2&amp;amp;amp;kw=%5B%22red%22%2C%22dead%22%2C%22redemption%22%2C%222%22%2C%221080p%22%2C%222k%22%2C%224k%22%2C%225k%22%2C%22hd%22%2C%22wallpapers%22%2C%22free%22%2C%22download%22%2C%22wallpaper%22%2C%22flare%22%5D&amp;amp;amp;key=c8841ecd07aa9bacf489f5b6ac2d7b79&amp;amp;amp;scrWidth=1680&amp;amp;amp;scrHeight=1050&amp;amp;amp;tz=1&amp;amp;amp;v=24.4.2370&amp;amp;amp;ship=&amp;amp;amp;psid=CF-3405_1&amp;amp;amp;sub3=invoke_layer&amp;amp;amp;res=14.31&amp;amp;amp;dev=r&amp;amp;amp;adb=n&amp;amp;amp;uuid=1fc47648-4f74-4a25-aced-6918c32750f3%3A1%3A1&amp;amp;amp;adb=n&amp;amp;amp;adb=n" target="_blank" style="display: block; height: inherit;"&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;
"""

soup = BeautifulSoup(html_content, "html.parser")

list_of_links_to_images = soup.select("ul")[1]

l = list_of_links_to_images.select("li a")
links_to_images = [ link.get("href") + "/download" for link in l ]

# path to save the wallpapers to.
wallpaper_path = "RDR 2 wallpapers"
def run(playwright):
    # set this to False if you want to see the browser opening the different pages
    browser = playwright.chromium.launch(headless=True) 
    context =  browser.new_context()
    page = context.new_page()

    for url in links_to_images:
        try:
            page.goto(url, timeout=0)

            soup = BeautifulSoup(page.content(), "html.parser")

            # the wallpaper image is stored in a #show_img img element
            image = soup.select_one("#show_img")
            link_to_image = image.get("src")

            response = requests.get(link_to_image)
            response.raise_for_status()

            filename = os.path.basename(link_to_image)
            save_path = os.path.join(wallpaper_path, filename)

            with open(save_path, "wb") as img:
                print(f"Writing {filename[:15]} to disk")
                img.write(response.content)

        except Exception as e:
            raise e

if __name__ == "__main__":
    with sync_playwright() as playwright:
        run(playwright)     


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

&lt;/div&gt;

&lt;p&gt;I hope you found the article informative (and possibly entertaining), we'll meet again next time.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>Process and data isolation strategies pt. 1 - Sandboxes and Process imprisonment</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Sun, 07 Apr 2024 17:29:52 +0000</pubDate>
      <link>https://dev.to/nguhprince/process-and-data-isolation-strategies-pt-1-sandboxes-and-process-imprisonment-10o2</link>
      <guid>https://dev.to/nguhprince/process-and-data-isolation-strategies-pt-1-sandboxes-and-process-imprisonment-10o2</guid>
      <description>&lt;p&gt;This is the first article in a 3 part series on &lt;strong&gt;Process and data isolation strategies&lt;/strong&gt;. In this article we will look at sandboxes and process imprisonment.&lt;/p&gt;

&lt;p&gt;Before we get into it, we need to understand why processes should be isolated in the first place.&lt;br&gt;
Wait a minute, what's a process? Aren't they technically isolated already?&lt;br&gt;
We'll answer all of these shortly.&lt;/p&gt;

&lt;p&gt;A process is a program that is being executed, to which is associated a processor and memory environment (known as process context).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A processor environment is simply execution time of the process by the CPU&lt;/li&gt;
&lt;li&gt;The memory environment refers to the memory allocated to the process, memory for the executable code and the data created by the program&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In general, a process cannot directly access the process context of another process. This is because processes are isolated from each other for security and stability reasons. Each process has its own address space, which means that the memory and resources allocated to one process are not directly accessible by another process.&lt;/p&gt;

&lt;p&gt;However, operating systems provide mechanisms for inter-process communication (IPC) that allow processes to exchange data and synchronize their actions.&lt;/p&gt;

&lt;p&gt;These mechanisms of IPC are what necessitate the use of process isolation techniques to ensure that processes are completely isolated from each other.&lt;/p&gt;

&lt;p&gt;Another reason to employ process isolation techniques is to minimize exposure of the OS to danger. If we execute potentially malicious programs in isolated environments, they cannot access critical system files or replicate uncontrollably.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sandbox isolation
&lt;/h1&gt;

&lt;p&gt;A sandbox is a sealed environment in which a process can run without affecting the OS. &lt;/p&gt;

&lt;p&gt;This environment is temporary, once the environment is closed, all the software, files and their states are deleted.&lt;/p&gt;

&lt;p&gt;If a process runs in a sandbox, its child processes will too.&lt;/p&gt;

&lt;p&gt;This can be used to execute potentially malicious applications to eliminate the risk of infecting the OS.&lt;/p&gt;

&lt;p&gt;Windows 10 (Pro and Enterprise) and Windows 11 come with a sandbox. Firejail is a sandbox for Linux&lt;/p&gt;

&lt;p&gt;The drawback of this method is that there is no persistence of data (although it could be seen as an advantage too). This isn't ideal to be used in cases where we want to isolate the process but also want it to function with data it stores.&lt;/p&gt;

&lt;h1&gt;
  
  
  Process imprisonment
&lt;/h1&gt;

&lt;p&gt;These techniques are an improvement of the sandbox technique, allowing the process to store data and access files. &lt;br&gt;
The basic principle behind these techniques is to keep a process restricted to a particular subtree in the system's directory tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  chroot (change root)
&lt;/h2&gt;

&lt;p&gt;In Unix systems, the root directory (/) is the highest point in the directory tree. From this point, a process can access all the users, applications, services, etc. of the system which can be catastrophic.&lt;/p&gt;

&lt;p&gt;This technique involves creating a "fake" root directory with a similar structure to that of the real root. This way, the process will not be able to go above this one into the real root directory.&lt;/p&gt;

&lt;p&gt;This reduces the extent to which a malware can cause harm, as they don't have access to the real directories in which sensitive data is stored.&lt;/p&gt;

&lt;p&gt;This technique is only available on Unix OSs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmz7ejnhcnztnii20oq9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmz7ejnhcnztnii20oq9.png" alt="Image description" width="501" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  freeBSD jails
&lt;/h2&gt;

&lt;p&gt;Jails are an improvement of the chroot imprisonment mechanism.&lt;/p&gt;

&lt;p&gt;They give the processes a complete environment with users, user groups, network resources, etc.&lt;/p&gt;

&lt;p&gt;These jails are characterized by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A directory tree in the file system (like in chroot). The root of this directory tree is the jail's root directory.&lt;/li&gt;
&lt;li&gt;A hostname&lt;/li&gt;
&lt;li&gt;An IP address&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solaris zones
&lt;/h2&gt;

&lt;p&gt;They increase the functionalities of BSD jails. The extras they provide are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The zones can also be assigned a physical network interface.&lt;/li&gt;
&lt;li&gt;The zones can have their own file system different from that of the OS (the file system must be supported by the OS though)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwl9svcdbyyg1np0mq54s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwl9svcdbyyg1np0mq54s.png" alt="Image description" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use process imprisonment techniques?
&lt;/h2&gt;

&lt;p&gt;It is important to note that process imprisonment techniques are not meant only to execute malicious programs (truth be told, if you are dealing with a malicious program you probably should use a sandbox). We will look at some reasons why they are used&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Isolation: these techniques confine processes to a restricted environment, limiting their access to the rest of the system. &lt;br&gt;
If a process is compromised, the potential damage it can cause is reduced, preventing unauthorized access to critical system files and resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security: they help to reduce the attack surface of the system. Process isolation minimizes the impact of vulnerabilities or exploits within individual processes. Even if an attack gains control over a jailed process, they are confined to the restricted environment and cannot access sensitive system resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testing and Development: Process imprisonment techniques are valuable in testing and development environments where you need to replicate production environments. They allow you to create isolated environments for testing applications without affecting the rest of the system. This helps in identifying and fixing issues without risking the stability or security of the production environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-tenancy: In an environment where multiple users or applications share the same infrastructure, process imprisonment techniques provide a way to ensure that each tenant remains isolated from others. This helps prevent one tenant from interfering with or accessing the data of another tenant.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can download the slides to this explanation from this &lt;a href="https://www.linkedin.com/posts/nguh-prince_sandboxes-and-process-imprisonment-isolation-activity-7182794252773392386-eJWC?utm_source=share&amp;amp;utm_medium=member_desktop"&gt;LinkedIn post&lt;/a&gt;&lt;br&gt;
Cover image credits to &lt;a href="https://www.freepik.com/author/kues1"&gt;kues1&lt;/a&gt; on freepik&lt;/p&gt;

</description>
      <category>security</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Scraping 1000 Python questions and answers using Python, playwright and beautifulsoup</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Mon, 26 Feb 2024 21:26:37 +0000</pubDate>
      <link>https://dev.to/nguhprince/scraping-1000-python-questions-and-answers-using-python-playwright-and-beautifulsoup-34fg</link>
      <guid>https://dev.to/nguhprince/scraping-1000-python-questions-and-answers-using-python-playwright-and-beautifulsoup-34fg</guid>
      <description>&lt;p&gt;In this post we will be scraping questions and answers from this &lt;a href="https://www.sanfoundry.com/1000-python-questions-answers/"&gt;site&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The site contains 1000 Python questions seperated by topics.&lt;/li&gt;
&lt;li&gt;Each topic is on its own page but links to all the topics are on this &lt;a href="https://www.sanfoundry.com/1000-python-questions-answers/"&gt;page&lt;/a&gt;. This page will be referred to as the index page in this article.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PS&lt;/strong&gt;: This code is just a file in a project I'm currently working on. The project is a desktop app that generates MCQ questions for a Python course I'm teaching. &lt;br&gt;
The code for this article is found in the &lt;strong&gt;scrape_sanfoundry_questions&lt;/strong&gt; file in this &lt;a href="https://github.com/Nguh-Prince/Questions-Generator"&gt;GitHub repo&lt;/a&gt;. The code in this article is not exactly like that in the repo (I've made some modifications here to ease comprehension).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;: Look in the comments and multiline comments (triple-quoted strings &lt;code&gt;"""&lt;/code&gt;) for explanations of the different code sections. I thought this approach would be more intuitive as this site doesn't include line numbers in the code sections.&lt;/p&gt;
&lt;h1&gt;
  
  
  Requirements
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;playwright: &lt;code&gt;pip install playwright&lt;/code&gt; and then &lt;code&gt;playwright install chromium&lt;/code&gt; (weighs about 150MB). You can also look at how to make playwright work with your browser in your computer. Read the &lt;a href="https://playwright.dev/docs/browsers"&gt;documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;beautifulsoup: &lt;code&gt;pip install beautifulsoup&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;
  
  
  Workflow
&lt;/h1&gt;

&lt;p&gt;The basic algorithm for this is as follows&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the 'index' page, scrape the questions and answers from it and save to a text file.&lt;/li&gt;
&lt;li&gt;Get all the links to the other topics' questions.&lt;/li&gt;
&lt;li&gt;For each link; open the page, scrape the questions and answers and save them to a text file.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;
  
  
  Code Walkthrough
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1. Initialization
&lt;/h2&gt;


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

from playwright.sync_api import Playwright, sync_playwright, expect
from bs4 import BeautifulSoup

# used to check if a particular text is a question
question_regex = re.compile("^(\d+\.)((\s*\w*\s*)*) (?&amp;lt;![\r])")

questions_directory_path = os.path.join(
    os.path.dirname(__file__), "questions"
)

if not os.path.exists(questions_directory_path):
    os.makedirs(questions_directory_path)

already_downloaded_questions = set([
    f.strip(".txt") for f in os.listdir(questions_directory_path)
])

url = "https://www.sanfoundry.com/1000-python-questions-answers/"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  2. Functions
&lt;/h2&gt;

&lt;p&gt;Our code will have 3 functions: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;get_questions_from_page: takes a page object (more on that later), a url, and a topic name. It creates a soup object (used for selecting html elements from the page), generates a path to store the scraped QAs (questions and answers) and calls the get_questions_from_soup function.&lt;/li&gt;
&lt;li&gt;get_questions_from_soup: takes a soup object, a topic string, and a file_path. It then selects all the paragraphs using the soup object, scrapes QAs from the questions paragraphs and saves the results to file_path.&lt;/li&gt;
&lt;li&gt;run: takes a playwright instance. Think of it as our main function. Opens a browser to the url, scrapes the content of the first page, loops through all the links on the page and scrapes their content as well (by calling the get_questions_from_page function)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  3. Code walkthrough.
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. get_questions_from_page
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def get_questions_from_page(page, url, topic="Basics"):
    page.goto(url, timeout=0)
    try:
        # create a soup of the page's content
        soup = BeautifulSoup(page.content(), "html.parser")

        file_path = os.path.join(questions_directory_path, f"{topic}.txt")
        # get the questions and save to file_path
        get_questions_from_soup(soup, topic, file_path=file_path)

        # get the questions and save to a text file (questions.txt)
    except Exception as e:
        print("Error in get_questions_from_page")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The soup created here allows us to access HTML elements on the page (can also work with xml)&lt;/p&gt;
&lt;h3&gt;
  
  
  2. get_questions_from_soup
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def get_questions_from_soup(soup, topic="Basics", file_path="questions.txt"):
    paragraphs = soup.select(".entry-content&amp;gt;p")
    answers = soup.select(".entry-content&amp;gt;.collapseomatic_content")
    code_blocks = soup.select(".entry-content .hk1_style pre")

    paragraph_index, answer_index, code_block_index = 0, 0, 0
    """
    Not all paragraphs on the page are questions
    some questions span multiple paragraphs and not every question 
    has a code block
    So we need to use the above variables to keep track of where we're at
    and increment as we advance (see code below to understand 
    better) 
    """

    # list to keep track of all the QAs scraped
    texts = []
    """
    We're using answers as our condition because it is the only 
    constant thing.
    Each question has one and only one answer element so we can 
    reliably use the answers to know which question number we're on
    """
    while answer_index &amp;lt; len(answers):
        paragraph = paragraphs[paragraph_index].text.replace('\r', '')
        paragraph_index += 1

        if not question_regex.search(paragraph):
            print(f"paragraph: {paragraph} did not match test, continuing")
            continue

        # getting the answer for that particular question
        answer = answers[answer_index].text.replace('\r', '')

        answer_index += 1

        text =  f"({topic}) {paragraph}"
        """
        The questions with their answers in them have at least 2 lines
        1 for the question, a line for each answer and a line for the View Answer button

        The questions with code blocks have just one paragraph for the question itself. 
        The other attributes (code and answers) are stored in different paragraphs
        """
        if len(paragraph.split('\n')) &amp;gt;= 2:
            print(f"The question has the options in it, setting text to the question")
            paragraph_text = paragraph.strip('View Answer')
            text = f"({topic}) {paragraph_text}\n\n{answer}"
        else:
            print(f"This question has a code block, code_blocks_index: {code_block_index}")
            answer_paragraph = paragraphs[paragraph_index].text.strip('View Answer').replace('\r', '') # this is now the paragraph with the answers
            """
            Remember that the paragraph_index was incremented after the initial paragraph was stored in a variable.
            The paragraph_index is now pointing to an answer paragraph.
            """
            try:
                code_block = code_blocks[code_block_index].text
            except IndexError as e:
                raise e

            print("This question has a code block, the block is: ")
            print(code_block)

            text = f"{text}\n\n{code_block}\n\n{answer_paragraph}\n\n{answer}"

            code_block_index += 1
            paragraph_index += 1

        texts.append(text)

    # writing the texts list to the file_path passed as an argument
    with open(file_path, "w", encoding="utf-8") as file:
        file.write(
            '\n\n\n\n'.join(texts)
        )

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

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. run
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def run(playwright: Playwright) -&amp;gt; None:
    try:
        # set headless to True if you want this script to run 
        # without opening the browser.
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()
        page.goto(url, timeout=0)

        # Scrape the questions from the index page
        soup = BeautifulSoup(page.content(), "html.parser")

        basics_file_name = os.path.join(questions_directory_path, "Basics.txt")
        get_questions_from_soup(soup, file_path=basics_file_name)

        # Get the links to the other topics' questions
        links = soup.select(".sf-2col-tbl li a")
        number_of_links = len(links)
        for index, link in enumerate(links):
            print(f"Getting questions from link #{index+1} of {number_of_links}")
            text = link.text

            if text in already_downloaded_questions:
                print(f"Already downloaded the {text} questions, continuing")
                continue
            href = link.get("href") # get the url from the link

            # get the questions from the page
            get_questions_from_page(page, href, topic=text)

        context.close()
        browser.close()
    except Exception as e:
        breakpoint()
        raise e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;: Add the following code to the end of the file to call the run function when the file is run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if __name__ == "__main__":
    with sync_playwright() as playwright:
        run(playwright)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Final code
&lt;/h3&gt;



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

from playwright.sync_api import Playwright, sync_playwright, expect
from bs4 import BeautifulSoup

question_regex = re.compile("^(\d+\.)((\s*\w*\s*)*) (?&amp;lt;![\r])")

questions_directory_path = os.path.join(
    os.path.dirname(__file__), "questions"
)

if not os.path.exists(questions_directory_path):
    os.makedirs(questions_directory_path)

already_downloaded_questions = set([
    f.strip(".txt") for f in os.listdir(questions_directory_path)
])

url = "https://www.sanfoundry.com/1000-python-questions-answers/"

def get_questions_from_page(page, url, topic="Basics"):
    page.goto(url, timeout=0)
    try:
        soup = BeautifulSoup(page.content(), "html.parser")

        file_path = os.path.join(questions_directory_path, f"{topic}.txt")

        # get the questions and save to a text file at file_path
        get_questions_from_soup(soup, topic, file_path=file_path)

    except Exception as e:
        print("Error in get_questions_from_page")

def get_questions_from_soup(soup, topic="Basics", file_path="questions.txt"):
    paragraphs = soup.select(".entry-content&amp;gt;p")
    answers = soup.select(".entry-content&amp;gt;.collapseomatic_content")
    code_blocks = soup.select(".entry-content .hk1_style pre")

    paragraph_index, answer_index, code_block_index = 0, 0, 0
    """
    Not all paragraphs on the page are questions
    some questions span multiple paragraphs and not every question has a code block
    So we need to use the above variables to keep track of where we're at
    and increment as we advance (see code below to understand better) 
    """

    texts = []

    while answer_index &amp;lt; len(answers):
        paragraph = paragraphs[paragraph_index].text.replace('\r', '')
        paragraph_index += 1

        if not question_regex.search(paragraph):
            print(f"paragraph: {paragraph} did not match test, continuing")
            continue

        answer = answers[answer_index].text.replace('\r', '')

        answer_index += 1

        text =  f"({topic}) {paragraph}"

        if len(paragraph.split('\n')) &amp;gt;= 2:
            print(f"The question has the options in it, setting text to the question")
            text = f"{paragraph.strip('View Answer')}\n\n{answer}"
        else:
            print(f"This question has a code block, code_blocks_index: {code_block_index}")
            # The paragraph is a code block
            answer_paragraph = paragraphs[paragraph_index].text.strip('View Answer').replace('\r', '') # this is now the paragraph with the answers
            try:
                code_block = code_blocks[code_block_index].text
            except IndexError as e:
                raise e

            print("This question has a code block, the block is: ")
            print(code_block)

            text = f"{text}\n\n{code_block}\n\n{answer_paragraph}\n\n{answer}"

            code_block_index += 1
            paragraph_index += 1

        texts.append(text)

    with open(file_path, "w", encoding="utf-8") as file:
        file.write(
            '\n\n\n\n'.join(texts)
        )


def run(playwright: Playwright) -&amp;gt; None:
    try:
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()
        page.goto(url, timeout=0)

        soup = BeautifulSoup(page.content(), "html.parser")

        basics_file_name = os.path.join(questions_directory_path, "Basics.txt")
        get_questions_from_soup(soup, file_path=basics_file_name)

        links = soup.select(".sf-2col-tbl li a")
        number_of_links = len(links)
        for index, link in enumerate(links):
            print(f"Getting questions from link #{index+1} of {number_of_links}")
            text = link.text

            if text in already_downloaded_questions:
                print(f"Already downloaded the {text} questions, continuing")
                continue
            href = link.get("href")

            get_questions_from_page(page, href, topic=text)

        context.close()
        browser.close()
    except Exception as e:
        breakpoint()
        raise e

if __name__ == "__main__":
    with sync_playwright() as playwright:
        run(playwright)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We hope this article has been informative, please in case of any issues or suggestions feel free to contact me.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Flask tutorial: A student project recorder</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Mon, 22 Jan 2024 17:46:00 +0000</pubDate>
      <link>https://dev.to/nguhprince/flask-tutorial-a-student-project-recorder-1bd</link>
      <guid>https://dev.to/nguhprince/flask-tutorial-a-student-project-recorder-1bd</guid>
      <description>&lt;p&gt;This project is one of many that my students and I have worked on in class to improve their knowledge of Flask and web development in Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Pip&lt;/li&gt;
&lt;li&gt;Basic Python knowledge&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this project, we are going to create a website that can save a student's name as well as their project details, and can display the list of already registered projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB: If you already got the starter_files directory during class, don't bother downloading it from the repository. Just skip to the TODO section.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To begin, download the code from the &lt;a href="https://github.com/Nguh-Prince/Introduction-to-Flask-and-Django"&gt;repository&lt;/a&gt;. The starter files for this lesson are in the &lt;em&gt;code/Lesson #1/starter_files&lt;/em&gt; directory, you can copy it to another location or modify it in place.&lt;br&gt;
Here is the directory structure&lt;br&gt;
.&lt;br&gt;
└── Introduction to Flask and Django/&lt;br&gt;
    └── code/&lt;br&gt;
        ├── Lesson #1 student-projects/&lt;br&gt;
        │   ├── starter_files/&lt;br&gt;
        │   ├── static/&lt;br&gt;
        │   ├── templates/&lt;br&gt;
        │   ├── app.py&lt;br&gt;
        │   ├── create_db.py&lt;br&gt;
        │   └── README.md&lt;br&gt;
        ├── Flask notes&lt;br&gt;
        └── README.md&lt;/p&gt;

&lt;p&gt;Now that we have our code in place, we need to install flask. Open a terminal and run the following&lt;br&gt;
&lt;code&gt;pip install flask&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  TODO
&lt;/h1&gt;

&lt;p&gt;Here's what we are to do in our app&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create our sqlite database.&lt;/li&gt;
&lt;li&gt;Complete the &lt;code&gt;index()&lt;/code&gt; function such that it can save a new student and project to the database&lt;/li&gt;
&lt;li&gt;Get the list of projects in our &lt;code&gt;projects()&lt;/code&gt; function and return an HTML page with a table containing those projects&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ok let's start coding, open up the starter_files/ directory (or the copy you made) in a text editor.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create our sqlite database.&lt;/strong&gt;&lt;br&gt;
In the &lt;code&gt;starter_files&lt;/code&gt; directory, run the &lt;code&gt;create_db.py&lt;/code&gt; script to create the &lt;code&gt;db.sqlite&lt;/code&gt; database and tables. Open a shell in this directory and type &lt;code&gt;python create_db.py&lt;/code&gt; to run the script, after running you should see a db.sqlite file in your directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complete the index() function such that it can save a new student and project to the database.&lt;/strong&gt;&lt;br&gt;
Open the app.py file in the starter_files directory. Initially, it looks like this:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import sqlite3 # For sqlite database connection

from flask import Flask # used to create the app

# used to render HTML files to the browser
from flask import render_template

# used to access request information like form data, cookies, etc.
from flask import request

from create_db import get_path_to_sqlite_database

app = Flask(__name__) # create a Flask app

# gets the absolute path to this app's database, 
# the db.sqlite file created after running the create_db.py 
# script
path_to_db = get_path_to_sqlite_database(file_path=__file__)

@app.route('/', methods=["GET", "POST"])
def index():
    #TODO
    # add functionality to add a new project and student
    # to the database 
    return render_template("index.html")

@app.route('/projects')
def projects():
    #TODO
    # get list of projects from the database
    # return a dictionary of those projects to the browser
    # replace simple json output with an HTML page, containing 
    # a table of the projects
    # add styles and JavaScript to this page 
    return "Display list of projects to this page"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To run the app, open a terminal in the starter_files directory and type &lt;code&gt;flask run --debug&lt;/code&gt; or &lt;code&gt;python -m flask run --debug&lt;/code&gt;. Flask runs on port 5000, so to see the app in action, open your browser to (localhost:5000)[&lt;a href="http://localhost:5000"&gt;http://localhost:5000&lt;/a&gt;]. It should display a simple HTML form like below:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrf9ct9ius52pf64cc53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrf9ct9ius52pf64cc53.png" alt="localhost:5000" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we want to only display this HTML page for GET requests, and for POST requests (i.e. when the user submits this form) we want to get the data from the form and create a new student and project.&lt;/p&gt;

&lt;p&gt;To display the page only for GET requests, copy and paste this code to replace the index() function above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template("index.html")
    elif request.method == "POST":
        return "Underway..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now this HTML page is only displayed for GET requests, if we submit this form though, the browser will display &lt;code&gt;Underway...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When we get a POST request we have to do the following&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the data from the form
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if request.method == 'POST'
        student_name = request.form['name']
        project_name = request.form['project-name']
        project_description = request.form['project-description']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Execute a query to insert the student into the database
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        with sqlite3.connect(path_to_db) as connection:
            # save the student to the database
            cursor = connection.cursor()
            insert_into_student_table_query = "INSERT INTO Students (name) VALUES(?)"        
            cursor.execute(insert_into_student_table_query, (student_name, ))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Get the id of the newly added student
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            select_last_student_query = "SELECT id FROM Students ORDER BY id DESC LIMIT 1"
            result = cursor.execute(select_last_student_query).fetchone()

            latest_student_id = result[0]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Execute a query to insert the project into the database
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            inset_into_projects_table_query = "INSERT INTO Projects (student, name, description) VALUES (?,?,?)"

            cursor.execute(inset_into_projects_table_query, (latest_student_id, project_name, project_description))
            connection.commit()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Return a success message (in class, we returned the form but it's still the same idea)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return "Successfully registered the project and student"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the end, our index() function should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        return render_template("index.html")
    elif request.method == 'POST':
        student_name = request.form['name']
        project_name = request.form['project-name']
        project_description = request.form['project-description']

        with sqlite3.connect(path_to_db) as connection:
            # save the student to the database
            cursor = connection.cursor()
            insert_into_student_table_query = "INSERT INTO Students (name) VALUES(?)"        
            cursor.execute(insert_into_student_table_query, (student_name, ))

            connection.commit()

            select_last_student_query = "SELECT id FROM Students ORDER BY id DESC LIMIT 1"
            result = cursor.execute(select_last_student_query).fetchone()

            latest_student_id = result[0]

            inset_into_projects_table_query = "INSERT INTO Projects (student, name, description) VALUES (?,?,?)"

            cursor.execute(inset_into_projects_table_query, (latest_student_id, project_name, project_description))
            connection.commit()

        return "&amp;lt;p&amp;gt;Project saved successfully. Go back to &amp;lt;a href="/"&amp;gt;index page&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fill this form&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get the list of projects in our projects() function and return an HTML page with a table containing these projects.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Execute the query to select project details (student name, student id, project name, project description, project id) from the database.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def projects():
    with sqlite3.connect(path_to_db) as connection:
        cursor = connection.cursor()

        result = cursor.execute(
            """
                SELECT p.id, p.name, p.description, s.name as student, s.id as student_id 
                FROM Projects as p LEFT JOIN Students AS s ON p.student=s.id 
            """
        ).fetchall()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Get the results from the query above and transform it into a dictionary
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        result_dictionary = [
            { 
                "project": {
                    "name": f[1],
                    "id": f[0],
                    "description": f[2]
                },
                "student": {
                    "name": f[3],
                    "id": f[4]
                }
            } for f in result
        ]
        return result_dictionary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this juncture, save the file and open your browser to (/projects)[&lt;a href="http://localhost/projects"&gt;http://localhost/projects&lt;/a&gt;] to see the list of projects you have created, returned as a JSON string.&lt;br&gt;
Your app.py file should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import sqlite3 # For sqlite database connection

from flask import Flask # used to create the app

# used to render HTML files to the browser
from flask import render_template

# used to access request information like form data, cookies, etc.
from flask import request

from create_db import get_path_to_sqlite_database

app = Flask(__name__) # create a Flask app

# gets the absolute path to this app's database, 
# the db.sqlite file created after running the create_db.py 
# script
path_to_db = get_path_to_sqlite_database(file_path=__file__)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        # TODO send the list of students to the template and display a select 
        # instead of the input text
        return render_template("index.html")
    elif request.method == 'POST':
        student_name = request.form['name']
        project_name = request.form['project-name']
        project_description = request.form['project-description']

        with sqlite3.connect(path_to_db) as connection:
            # save the student to the database
            cursor = connection.cursor()
            insert_into_student_table_query = "INSERT INTO Students (name) VALUES(?)"        
            cursor.execute(insert_into_student_table_query, (student_name, ))

            connection.commit()

            select_last_student_query = "SELECT id FROM Students ORDER BY id DESC LIMIT 1"
            result = cursor.execute(select_last_student_query).fetchone()

            latest_student_id = result[0]

            inset_into_projects_table_query = "INSERT INTO Projects (student, name, description) VALUES (?,?,?)"

            cursor.execute(inset_into_projects_table_query, (latest_student_id, project_name, project_description))
            connection.commit()

        return "&amp;lt;p&amp;gt;Project saved successfully. Go back to &amp;lt;a href='/'&amp;gt;index page&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;"

@app.route('/projects')
def projects():
    with sqlite3.connect(path_to_db) as connection:
        cursor = connection.cursor()

        result = cursor.execute(
            """
                SELECT p.id, p.name, p.description, s.name as student, s.id as student_id 
                FROM Projects as p LEFT JOIN Students AS s ON p.student=s.id 
            """
        ).fetchall()

        result_dictionary = [
            { 
                "project": {
                    "name": f[1],
                    "id": f[0],
                    "description": f[2]
                },
                "student": {
                    "name": f[3],
                    "id": f[4]
                }
            } for f in result
        ]
        return result_dictionary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Render an HTML template with a table displaying these projects
Now we want an HTML table instead of a JSON string, so we should replace the &lt;code&gt;return result_dictionary&lt;/code&gt; statement with a &lt;code&gt;return render_template('projects.html', projects=result_dictionary)&lt;/code&gt;. This new statement renders our projects.html file in the templates directory and passes a variable called projects to it. 
We'll see how to access this variable in our template later.
Now if you open the (/projects)[&lt;a href="http://localhost/projects"&gt;http://localhost/projects&lt;/a&gt;] link, it will display an HTML page with a paragraph &lt;code&gt;Display projects here&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open the projects.html page in the templates/ directory in a text editor.&lt;/li&gt;
&lt;li&gt;In the head section of the page, we have to include some CSS and JS files, copy and paste the code below to include those files:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;link
      rel="stylesheet"
      href="{{ url_for('static', filename='css/jquery.dataTables.min.css') }}"
    /&amp;gt;
    &amp;lt;script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="{{ url_for('static', filename='js/jquery.min.js') }}"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="{{ url_for('static', filename='js/jquery.dataTables.min.js') }}"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an example of Python code execution in a template. The url_for function is a function in Flask used to get the url for specific resources e.g. web pages, images, etc. and in our case, we are using it to get the url for our static files (CSS &amp;amp; JavaScript).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the div in body of the page, copy and paste the following code
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;table id="projects-table"&amp;gt;
        &amp;lt;thead&amp;gt;
          &amp;lt;th&amp;gt;Student&amp;lt;/th&amp;gt;
          &amp;lt;th&amp;gt;Project&amp;lt;/th&amp;gt;
          &amp;lt;th&amp;gt;Project Description&amp;lt;/th&amp;gt;
        &amp;lt;/thead&amp;gt;
        {% for project in projects %}
        &amp;lt;tr&amp;gt;
          &amp;lt;td&amp;gt;{{ project.student.name }}&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;{{ project.project.name }}&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;{{ project.project.description }}&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        {% endfor %}
&amp;lt;/table&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code creates a table, loops through the list of projects passed to it (from the function in the app) and displays a row with the project's details for each project. &lt;br&gt;
To access a variable in the template, use double enclosed curly braces e.g. &lt;code&gt;{{ project.student.name }}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Going back to our (/projects)[&lt;a href="http://localhost/projects"&gt;http://localhost/projects&lt;/a&gt;] link, we should see a table displaying the list of projects that have been saved.&lt;br&gt;
This table currently has no styling, to make it look better we will make use of the (DataTables for jQuery plugin)[&lt;a href="https://datatables.net/"&gt;https://datatables.net/&lt;/a&gt;] that will automatically style the table and add sorting and searching.&lt;br&gt;
We have included the necessary files for the datatables, all that's left is to initialize the table. To do so copy this code and paste after the closing body tag (but before the closing HTML tag).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;script&amp;gt;
    $("#projects-table").DataTable();
  &amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your projects.html file should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8" /&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&amp;gt;
    &amp;lt;title&amp;gt;Projects&amp;lt;/title&amp;gt;
    &amp;lt;link
      rel="stylesheet"
      href="{{ url_for('static', filename='css/bootstrap.min.css') }}"
    /&amp;gt;
    &amp;lt;link
      rel="stylesheet"
      href="{{ url_for('static', filename='css/jquery.dataTables.min.css') }}"
    /&amp;gt;
    &amp;lt;script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="{{ url_for('static', filename='js/jquery.min.js') }}"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="{{ url_for('static', filename='js/jquery.dataTables.min.js') }}"&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div class="container mt-3"&amp;gt;
      &amp;lt;table id="projects-table"&amp;gt;
        &amp;lt;thead&amp;gt;
          &amp;lt;th&amp;gt;Student&amp;lt;/th&amp;gt;
          &amp;lt;th&amp;gt;Project&amp;lt;/th&amp;gt;
          &amp;lt;th&amp;gt;Project Description&amp;lt;/th&amp;gt;
        &amp;lt;/thead&amp;gt;
        {% for project in projects %}
        &amp;lt;tr&amp;gt;
          &amp;lt;td&amp;gt;{{ project.student.name }}&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;{{ project.project.name }}&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;{{ project.project.description }}&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        {% endfor %}
      &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;

  &amp;lt;script&amp;gt;
    $("#projects-table").DataTable();
  &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The (/projects)[&lt;a href="http://localhost/projects"&gt;http://localhost/projects&lt;/a&gt;] page now displays the list of students and projects in a more stylish table.&lt;/p&gt;

&lt;p&gt;You can extend this project by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding a page solely for students, where you can create, update or delete a student.&lt;/li&gt;
&lt;li&gt;Adding update and delete functionality to our table in /projects&lt;/li&gt;
&lt;li&gt;Which ever other way you can think of&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this post was informative. Feel free to leave a comment or suggestion, I'll be more than happy to help.&lt;/p&gt;

</description>
      <category>flask</category>
      <category>pyth</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Web Scraping with Python, getting the table of countries and country codes from countrycode.org</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Sun, 04 Jun 2023 14:20:07 +0000</pubDate>
      <link>https://dev.to/nguhprince/web-scraping-with-python-getting-the-table-of-countries-and-country-codes-from-countrycodeorg-47fj</link>
      <guid>https://dev.to/nguhprince/web-scraping-with-python-getting-the-table-of-countries-and-country-codes-from-countrycodeorg-47fj</guid>
      <description>&lt;p&gt;Ever needed some data that is sitting on a webpage you cannot easily copy and paste from? &lt;br&gt;
I'm going to show you how to get data from webpages (webscraping, essentially) with Python. Specifically we'll be getting the countries, iso codes and phone number codes in the table found on this &lt;a href="https://countrycode.org/"&gt;page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we get into the code proper, we need to install some Python packages first (requests and beautifulsoup4)&lt;br&gt;
&lt;code&gt;pip install requests beautifulsoup4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Follow the following steps.&lt;/p&gt;

&lt;p&gt;Import required packages&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from bs4 import BeautifulSoup
import json
import requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the webpages content using the requests package&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url = "https://countrycode.org/"
r = requests.get(url)
r.raise_for_status()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last line raises an exception if the request's response code is not a successful one, thus stopping the program.&lt;/p&gt;

&lt;p&gt;Create the 'soup' and select all the rows found in the table's body. This 'soup' object helps us to get particular elements from the HTML page's content.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;soup = BeautifulSoup(r.content, 'html.parser')
rows = soup.select("tbody&amp;gt;row") # select all the rows that are direct descendants of a tbody element
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the countries from the table&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;list_of_countries = []
for row in rows:
    keys = ["name", "country_code", "iso_codes", "population", "area/km2", "gdp $USD"] # the different columns in the table
    country_object = {}
    for key in keys:
        country_object[key] = '' # creating a dictionary for the row

    for index, cell in enumerate(row.find_all('td')): # looping through the different td elements found in this row
        if index &amp;lt; len(keys):
            if index ==  0:
                # get the text found in the hyperlink in the cell
                country_object[keys[index]] = cell.find('a').text
            else:
                # get the text found in the cell
                country_object[keys[index]] = cell.text
    list_of_countries.append(country_object)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the list to a json file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;with open("countries.json", "w") as _: # replace countries.json with whatever you want
    json.dump(list_of_countries, _)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VOILA! You have successfully gotten the list of countries, their ISO and area codes, surface areas and gdp.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>python</category>
    </item>
    <item>
      <title>Creating a chess game with Python, pygame and chess (Pt. 2)</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Wed, 23 Nov 2022 13:55:28 +0000</pubDate>
      <link>https://dev.to/nguhprince/creating-a-chess-game-with-python-pygame-and-chess-pt-2-539b</link>
      <guid>https://dev.to/nguhprince/creating-a-chess-game-with-python-pygame-and-chess-pt-2-539b</guid>
      <description>&lt;p&gt;Hey there, I hope you're having a nice day so far. We will be continuing from where we left off in &lt;a href="https://dev.to/nguhprince/creating-a-chess-game-with-python-pygame-and-chess-2451"&gt;part 1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this article we will be looking at how to create the AI part of the game and how we will plug that in with our existing code base.&lt;/p&gt;

&lt;p&gt;We will break the article into the following sections: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a parent AIPlayer class&lt;/li&gt;
&lt;li&gt;Plugging the AIPlayer class into our existing code&lt;/li&gt;
&lt;li&gt;Creating a player that selects the best move available&lt;/li&gt;
&lt;li&gt;Creating a player that looks ahead a couple of moves and selects the move that gives the best outcome using the minmax algorithm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before we get started, please create a folder called ai in your project's root directory and in that folder add the following files: &lt;code&gt;__init__.py&lt;/code&gt; and &lt;code&gt;players.py&lt;/code&gt;.&lt;br&gt;
Your project should look similar to this now:&lt;br&gt;
chess-game/&lt;br&gt;
---|ai&lt;br&gt;
------|&lt;code&gt;__init__.py&lt;/code&gt;&lt;br&gt;
------|&lt;code&gt;players.py&lt;/code&gt;&lt;br&gt;
---|gui_components&lt;br&gt;
---|skins&lt;br&gt;
&lt;code&gt;main.py&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a parent AIPlayer class
&lt;/h3&gt;

&lt;p&gt;Seeing as we will be creating multiple ai players, it is important that we create a parent class, that way they all have some common behavior inherited from this class and can be used interchangeably in our application. We will see this later. &lt;/p&gt;

&lt;p&gt;We need our AIPlayer to be able to do the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the legal moves in the game&lt;/li&gt;
&lt;li&gt;Choose a move from the legal moves&lt;/li&gt;
&lt;li&gt;Make a move without affecting the board (in order to evaluate possible future states of the board)&lt;/li&gt;
&lt;li&gt;Make a move on a ChessBoard object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In your players.py file type the following code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AIPlayer:
    def __init__(self, board: chess.Board, color: str) -&amp;gt; None:
        self.board = board
        self.color = color

    def get_legal_moves(self, board: chess.Board=None) -&amp;gt; list:
        if not board:
            board = self.board

        return list(board.legal_moves)

    def choose_move(self, board: chess.Board=None):
        legal_moves = self.get_legal_moves()

        random.shuffle(legal_moves)

        chosen_move = None

        for move in legal_moves:
            evaluation_before = self.evaluate_board()
            fake_board = self.false_move(move)
            evaluation_after = self.evaluate_board(fake_board)

            if chosen_move is None:
                chosen_move = move
            else:
                # if the player is white and the move results in a higher material for white
                if evaluation_after &amp;gt; evaluation_before and self.color == "w":
                    chosen_move = move
                # if the player is black and the move results in higher material for black
                elif evaluation_before &amp;gt; evaluation_after and self.color == "b":
                    chosen_move = move

        return chosen_move


    def false_move(self, move: chess.Move=None, board: chess.Board=None) -&amp;gt; chess.Board:
        # make a move without affecting the game's current state

        # make a copy of the board for move testing
        if not board:
            board_copy = copy.deepcopy(self.board)
        else:
            board_copy = board

        if not move:
            move = self.play(board_copy)

        board_copy.push(move)

        return board_copy


    def make_move(self, chess_board: ChessBoard):
        # make a move an a ChessBoard object
        move = self.choose_move()
        chess_board._play(move=move)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This player doesn't implement any sophisticated techniques, it simply selects a random move from the list of available moves.&lt;/p&gt;

&lt;p&gt;After writing this, we simply have to modify the main.py file so that our AI plays as black instead of the user. &lt;br&gt;
Now in your main.py file add the following line at the top with the other imports &lt;code&gt;from ai import players ai_players&lt;/code&gt;. &lt;br&gt;
Where you have&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;players = {
    True: "user",
    False: "user"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change it to&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;players = {
    True: "user",
    False: ai_players.AIPlayer(board, "b")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And towards the bottom of your main.py file in the while loop after the call to draw_chessboard function add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if not isinstance(players[TURN], str) and IS_FIRST_MOVE:
    # the first move is an AI so it plays automatically
    play()
elif not isinstance(players[TURN], str) and not turns_taken[TURN]:
    play()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the end your main.py should look like&lt;br&gt;
&lt;/p&gt;

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

import pygame

from pygame import mixer

mixer.init()

from gui_components.board import ChessBoard
from gui_components.components import BorderedRectangle

from ai import players as ai_players

pygame.init()

screen = pygame.display.set_mode([500, 500])

board = chess.Board()

players = {
    True: "user",
    False: ai_players.AIPlayer(board, "b")
}

turns_taken = {
    True: False, # set 
    False: False
}

move_sound = mixer.Sound("sound_effects/piece_move.mp3")
check_sound = mixer.Sound("sound_effects/check.mp3")
checkmate_sound = mixer.Sound("sound_effects/checkmate.mp3")

SOURCE_POSITION = None
DESTINATION_POSITION = None
PREVIOUSLY_CLICKED_POSITION = None
POSSIBLE_MOVES = []
TURN = True
IS_FIRST_MOVE = True

running = True

LIGHT_COLOR = (245, 245, 245)
DARK_COLOR = ( 100, 100, 100 )
WHITE_COLOR = (255, 255, 255)
BLACK_COLOR = (0, 0, 0)

chess_board = ChessBoard(
    50, 50, 400, 400, 0, 0, board=board
)

def draw_bordered_rectangle(rectangle: BorderedRectangle, screen):
    pygame.draw.rect( screen, rectangle.border_color, rectangle.outer_rectangle, width=rectangle.outer_rectangle_border_width )
    pygame.draw.rect( screen, rectangle.background_color, rectangle.inner_rectangle, width=rectangle.inner_rectangle_border_width )

def draw_chessboard(board: ChessBoard):
    ranks = board.squares

    bordered_rectangle = BorderedRectangle(10, 10, 480, 480, (255, 255, 255), DARK_COLOR, 10)

    # draw_bordered_rectangle(bordered_rectangle, screen)

    # board_border_rect = pygame.Rect( 40, 40, 400, 400 )
    # pygame.draw.rect(screen, DARK_COLOR, board_border_rect, width=1)

    board_bordered_rectangle = BorderedRectangle(25, 25, 450, 450, WHITE_COLOR, DARK_COLOR, 48)
    draw_bordered_rectangle(board_bordered_rectangle, screen)

    pygame.draw.rect( 
        screen, board_bordered_rectangle.border_color, board_bordered_rectangle.inner_rectangle, 
        width=1
    )

    board_top_left = board.rect.topleft
    board_top_right = board.rect.topright
    board_bottom_left = board.rect.bottomleft

    for i, rank in enumerate(ranks):
        rank_number = ChessBoard.RANKS[ 7 - i ]
        file_letter = ChessBoard.RANKS[i]

        font_size = 15 # font size for the ranks and files

        # add the text rectangle on the left and right of the board
        font = pygame.font.SysFont('helvetica', font_size)

        # render the ranks (1-8)
        for _i in range(1):
            if _i == 0:
                _rect = pygame.Rect(
                    board_top_left[0] - font_size, board_top_left[1] + (i*board.square_size), 
                    font_size, board.square_size
                )
            else:
                _rect = pygame.Rect(
                    board_top_right[0], board_top_right[1] + (i*board.square_size),
                    font_size, board.square_size
                )

            text = font.render(f"{rank_number}", True, DARK_COLOR)
            text_rect = text.get_rect()
            text_rect.center = _rect.center

            screen.blit(text, text_rect)

        # render the files A-H
        for _i in range(1):
            if _i == 0:
                _rect = pygame.Rect(
                    board_top_left[0] + (i*board.square_size), board_top_left[1] - font_size, 
                    board.square_size, font_size
                )
            else:
                _rect = pygame.Rect(
                    board_top_left[0] + (i*board.square_size), board_bottom_left[1], 
                    board.square_size, font_size
                )

            text = font.render(f"{file_letter}", True, DARK_COLOR)
            text_rect = text.get_rect()
            text_rect.center = _rect.center

            screen.blit(text, text_rect)

        for j, square in enumerate(rank):
            if square is board.previous_move_square:
                pygame.draw.rect( screen, board.previous_square_highlight_color, square )
            elif square is board.current_move_square:
                pygame.draw.rect( screen, board.current_square_highlight_color, square )
            else:
                pygame.draw.rect( screen, square.background_color, square )

            if square.piece:
                try:
                    image = square.piece.get_image()
                    image_rect = image.get_rect()
                    image_rect.center = square.center

                    screen.blit( image, image_rect )
                except TypeError as e:
                    raise e
                except FileNotFoundError as e:
                    print(f"Error on the square on the {i}th rank and the {j}th rank")
                    raise e

            if square.is_possible_move and board.move_hints:
                # draw a circle in the center of the square
                pygame.draw.circle( 
                    screen, (50, 50, 50), 
                    square.center,
                    board.square_size*0.25
                )

def play_sound(board):
    if board.is_checkmate():
        mixer.Sound.play(checkmate_sound)

    elif board.is_check():
        mixer.Sound.play(check_sound)

    elif board.is_stalemate():
        pass

    else:
        mixer.Sound.play(move_sound)

def play(source_coordinates: tuple=None, destination_coordinates: tuple=None):
    global board, TURN, IS_FIRST_MOVE, chess_board

    turn = board.turn

    player = players[turn]
    turns_taken[turn] = not turns_taken[turn]
    print(f"Setting {turns_taken[turn]} to {not turns_taken[turn]}")

    if not isinstance(player, str):
        # AI model to play
        player.make_move(chess_board)
        play_sound(board)

        TURN = not TURN

        if isinstance(players[TURN], ai_players.AIPlayer):
            # if the next player is an AI, automatically play
            print("Next player is AI, making a move for them automaically")
            # sleep(5)
    else:
        if source_coordinates and destination_coordinates:
            # user to play
            print("User is making move")
            chess_board.play(source_coordinates, destination_coordinates)
            play_sound(board)
            TURN = not TURN

    if IS_FIRST_MOVE:
        IS_FIRST_MOVE = False

    turns_taken[turn] = not turns_taken[turn]
    print(f"Setting {turns_taken[turn]} to {not turns_taken[turn]}")


def click_handler(position):
    global SOURCE_POSITION, POSSIBLE_MOVES, TURN

    current_player = players[TURN]

    if isinstance(current_player, str):
        if SOURCE_POSITION is None:
            POSSIBLE_MOVES = chess_board.get_possible_moves(position)
            SOURCE_POSITION = position if POSSIBLE_MOVES else None
        else:
            # getting the squares in the possible destinations that correspond to the clicked point
            destination_square = [ square for square in POSSIBLE_MOVES if square.collidepoint(position) ]

            if not destination_square:
                chess_board.get_possible_moves(SOURCE_POSITION, remove_hints=True)
                SOURCE_POSITION = None
            else:
                destination_square = destination_square[0]
                print(f"In main.py, about to play, the source and destination are {SOURCE_POSITION} and {position} respectively")
                chess_board.get_possible_moves(SOURCE_POSITION, remove_hints=True)

                # chess_board.play( SOURCE_POSITION, position )
                play(SOURCE_POSITION, position)
                SOURCE_POSITION = None

                current_player = players[TURN]

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN:
            MOUSE_CLICKED_POSITION = pygame.mouse.get_pos()
            click_handler(MOUSE_CLICKED_POSITION)

    screen.fill( (255, 255, 255) )

    draw_chessboard(chess_board)

    if not isinstance(players[TURN], str) and IS_FIRST_MOVE:
        print("It is the first move and there is no human player")
        play()
    elif not isinstance(players[TURN], str) and not turns_taken[TURN]:
        play()

    pygame.display.flip()

pygame.quit()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if you run the &lt;code&gt;main.py&lt;/code&gt; file you should be able to play with the AI that randomly selects moves. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy1uwu7e2a8p8dyuvcm9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiy1uwu7e2a8p8dyuvcm9.gif" alt="User vs Random AI player" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a player that selects the best move available
&lt;/h3&gt;

&lt;p&gt;The base AIPlayer class selected a random move from the list of possible moves. We will now create a player that can analyze all the possible moves on the board and select the best one, to do this we will need to use some algorithm that can evaluate the board, this algorithm will take into account the pieces on the board and the positions of those pieces. We will need to go and modify our pieces.py file. &lt;br&gt;
In your pieces.py file, add the following code in your Piece class after the colors_and_notations_and_values dictionary definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    # Gives a score based on the position of the piece on the board 
    # this score is then added to the piece's value 
    # to give its value relative to its position
    piece_square_tables = {
        "k": [
            [-3.0, -4.0, -4.0, -5.0, -5.0, -4.0, -4.0, -3.0],
            [-3.0, -4.0, -4.0, -5.0, -5.0, -4.0, -4.0, -3.0],
            [-3.0, -4.0, -4.0, -5.0, -5.0, -4.0, -4.0, -3.0],
            [-3.0, -4.0, -4.0, -5.0, -5.0, -4.0, -4.0, -3.0],
            [-2.0, -3.0, -3.0, -4.0, -4.0, -3.0, -3.0, -2.0],
            [-1.0, -2.0, -2.0, -2.0, -2.0, -2.0, -2.0, -1.0],
            [2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0],
            [2.0, 3.0, 1.0, 0.0, 0.0, 1.0, 3.0, 2.0]
        ],
        "q": [
            [-2.0, -1.0, -1.0, -0.5, -0.5, -1.0, -1.0, -2.0],
            [-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0],
            [-1.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, -1.0],
            [-0.5, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, -0.5],
            [0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 0.0, -0.5],
            [-1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0, -1.0],
            [-1.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, -1.0],
            [-2.0, -1.0, -1.0, -0.5, -0.5, -1.0, -1.0, -2.0]
        ],
        "r": [
            [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
            [0.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5],
            [-0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5],
            [-0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5],
            [-0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5],
            [-0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5],
            [-0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5],
            [0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0]
        ],
        "b": [
            [-2.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -2.0],
            [-1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0],
            [-1.0, 0.0, 0.5, 1.0, 1.0, 1.0, 0.5, 0.0, -1.0],
            [-1.0, 0.5, 0.5, 1.0, 1.0, 0.5, 0.5, -1.0],
            [-1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0],
            [-1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0],
            [-1.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, -1.0],
            [-2.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -2.0]
        ],
        "n": [
            [-5.0, -4.0, -3.0, -3.0, -3.0, -3.0, -4.0, -5.0],
            [-4.0, -2.0, 0.0, 0.0, 0.0, 0.0, -2.0, -4.0],
            [-3.0, 0.0, 1.0, 1.5, 1.5, 1.0, 0.0, -3.0],
            [-3.0, 0.5, 1.5, 2.0, 2.0, 1.5, 0.5, -3.0],
            [-3.0, 0.0, 1.5, 2.0, 2.0, 1.5, 0.0, -3.0],
            [-3.0, 0.5, 1.0, 1.5, 1.5, 1.0, 0.5, -3.0],
            [-4.0, -2.0, 0.0, 0.5, 0.5, 0.0, -2.0, -4.0],
            [-5.0, -4.0, -3.0, -3.0, -3.0, -3.0, -4.0, -5.0]
        ],
        "p": [
            [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
            [5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0],
            [1.0, 1.0, 2.0, 3.0, 3.0, 2.0, 1.0, 1.0],
            [0.5, 0.5, 1.0, 2.5, 2.5, 1.0, 0.5, 0.5],
            [0.0, 0.0, 0.0, 2.0, 2.0, 0.0, 0.0, 0.0],
            [0.5, -0.5, -1.0, 0.0, 0.0, -1.0, -0.5, 0.5],
            [0.5, 1.0, 1.0, -2.0, -2.0, 1.0, 1.0, 0.5],
            [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
        ]
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a dictionary that contains the points to be added to a piece's value based on its position on the board. The positions start from the 8th rank (ranks are rows in chess, starting from white's side) to the 1st rank (i.e. &lt;code&gt;piece_square_tables['k'][0]&lt;/code&gt; contains the positional value of the white king on the 8th rank and &lt;code&gt;piece_square_tables['k'][7]&lt;/code&gt; contains those for the 1st rank). This dictionary shows only the positional values of white pieces, to get that for black we have to reverse the lists and negate the values of the elements.&lt;/p&gt;

&lt;p&gt;Put this code beneath the one above to get the complete piece_square_tables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    piece_square_tables = {
        "w": piece_square_tables,
        "b": { 
            key: value[::-1] # reversing the previous lists
            for key, value in piece_square_tables.items() 
        } 
    }

    # negating the values in black's list
    for key, value in piece_square_tables["b"].items():
        piece_square_tables["b"][key] = [ [ -j for j in rank ] for rank in value ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we will be evaluating a chess.Board object it is important that we can easily get the different pieces on the board without having to loop through all the squares in our gui board. Let's take a look at a board, open a python shell and type in the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import chess
board = chess.Board()
print(board)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should give you an output similar to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r n b q k b n r
p p p p p p p p
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
P P P P P P P P
R N B Q K B N R
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The black pieces are at the top and the whites down. It is important to note that the black pieces are written in lowercase and the white in upper. From this representation we can easily get the colors of the pieces and their positions on the board. &lt;/p&gt;

&lt;p&gt;In our Piece class we will add a static method that gets the piece's color based on a notation passed. Add the following to the Piece class&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    def get_piece_color_based_on_notation(notation) -&amp;gt; str:
        return "w" if notation.isupper() else "b"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also need to add a method that gets a piece's value when given its notation, color, rank_number and file_number&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def get_piece_value_from_notation_and_position(notation: str, color: str, rank_number, file_number):
        """
        Gets a piece's value relative to its color, notation, rank_number and file_number 
        rank_number ranges from 0-7 with 0 =&amp;gt; rank 8 and 7 =&amp;gt; rank 1
        file_number ranges from 0-7 with 0 =&amp;gt; file A and 7 =&amp;gt; file H
        """
        position_value = Piece.piece_square_tables[color][notation.lower()][rank_number][file_number]

        # negating the value obtained from the piece squares table if the piece is black
        # position_value = -position_value if color == "b" else position_value

        piece_value = Piece.colors_notations_and_values[color][notation.lower()]

        return position_value + piece_value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After laying the groundwork in out Piece class, we will create an &lt;code&gt;evaluate_board&lt;/code&gt; method in our new Player class that actually does the board evaluation. Open the ai/players.py file and type the following code under the AIPlayer class&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class PlayerWithEvaluation(AIPlayer):
    def evaluate_board(self, board: chess.Board=None) -&amp;gt; int:
        if board is None: 
            board = self.board

        regex = re.compile("\w")
        string = board.__str__()

        material_sum = 0

        ranks = [ row.split(' ') for row in string.split('\n')]

        for i, rank in enumerate(ranks):
            for j, notation in enumerate(rank):
                if regex.search(notation):
                    piece_color = Piece.get_piece_color_based_on_notation(notation)
                    piece_positional_value = Piece.get_piece_value_from_notation_and_position(notation, piece_color, i, j)

                    material_sum += piece_positional_value

        return material_sum

    def choose_move(self, board: chess.Board=None):
        """
        Chooses the move that results in the highest material gain for the player
        """
        legal_moves = self.get_legal_moves()

        chosen_move = None
        minimum_evaluation = None
        maximum_evaluation = None

        for move in legal_moves:
            # make a move on the board without affecting it
            fake_board = self.false_move(move)
            evaluation_after = self.evaluate_board(fake_board)

            if chosen_move is None:
                chosen_move = move
            if minimum_evaluation is None:
                minimum_evaluation = evaluation_after
            if maximum_evaluation is None: 
                maximum_evaluation = evaluation_after

            else:
                # if the player is white and the move results in a more positive score
                if evaluation_after &amp;gt; maximum_evaluation and self.color == "w":
                    chosen_move = move
                # if the player is black and the move results in a more negative score
                elif evaluation_after &amp;lt; minimum_evaluation and self.color == "b":
                    chosen_move = move

        return chosen_move
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is important to note that a positive score is favorable for white whereas a negative score is favorable for black. So the player will always go for the move that tilts the evaluation in its favor.&lt;/p&gt;

&lt;p&gt;Now to test out this new player, simply go to the main.py file and change the line that contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;players = {
    True: "user",
    False: ai_players.AIPlayer(board, "b")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;players = {
    True: "user",
    False: ai_players.PlayerWithEvaluation(board, "b")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should be able to play with this new model after running the &lt;code&gt;main.py&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz4bwvd5e00jyilpomte.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz4bwvd5e00jyilpomte.gif" alt="Player with evaluation" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although this player is an improvement to the previous one it still falls short in one very important aspect of the game of chess, anticipating your opponent's moves. Even from the short illustration we see that the player is losing pieces because it only plays the best move in front of it not taking into account the opponent's move. &lt;/p&gt;

&lt;p&gt;We will solve this problem in the next article, where we will build a player using the minmax algorithm.&lt;/p&gt;

</description>
      <category>python</category>
      <category>gamedev</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Creating a chess game with Python, pygame and chess (Pt. 1)</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Mon, 21 Nov 2022 10:45:39 +0000</pubDate>
      <link>https://dev.to/nguhprince/creating-a-chess-game-with-python-pygame-and-chess-2451</link>
      <guid>https://dev.to/nguhprince/creating-a-chess-game-with-python-pygame-and-chess-2451</guid>
      <description>&lt;p&gt;Hey, I'm Prince and I'm going to be walking you through my process of creating a chess game with Python (this is my first project with pygame). &lt;br&gt;
DISCLAIMER: This article is not for beginners but I will make an effort to make it accessible to those with just a little bit of Python knowledge. Some concepts involved here include; OOP and data structures.&lt;/p&gt;

&lt;p&gt;The objectives of this program are to create a chess game that can be played with 2 players or against an AI. &lt;/p&gt;

&lt;p&gt;Here's a link to the &lt;a href="https://github.com/Nguh-Prince/Chess-Pygame"&gt;project&lt;/a&gt; on Github, feel free to play around with it or contribute.&lt;/p&gt;

&lt;p&gt;I relied heavily on the techniques covered in this &lt;a href="https://www.freecodecamp.org/news/simple-chess-ai-step-by-step-1d55a9266977/"&gt;article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So firstly create a new folder (for the purposes of this article we will call it chess-game) where you want to store the code and in that folder create a virtual environment (if you are not familiar with virtual environments take a look at &lt;a href="https://www.freecodecamp.org/news/how-to-setup-virtual-environments-in-python/"&gt;this&lt;/a&gt; ), activate the virtual environment and install the following packages: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;chess&lt;/li&gt;
&lt;li&gt;pygame&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We need the chess module to handle the chess rules and validations and pygame to make the actual game.&lt;/p&gt;

&lt;p&gt;Ok, we are going to split this walkthrough into 3 sections: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The pieces, squares and the boards&lt;/li&gt;
&lt;li&gt;Displaying the board and pieces on the pygame window and &lt;/li&gt;
&lt;li&gt;Creating an AI player&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The pieces, squares and the board
&lt;/h3&gt;

&lt;p&gt;We will create a new package in our code, gui_components. To create a package just create a new folder (in this case gui_components) and in that new folder create a new file &lt;code&gt;__init__.py&lt;/code&gt;)&lt;br&gt;
We will also create a new folder in our project directory (chess-game) called skins. This is where we will store the images for our pieces. Feel free to copy the skins directory from the &lt;a href="https://github.com/Nguh-Prince/Chess-Pygame"&gt;repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project should have the following structure: &lt;br&gt;
chess-game/&lt;br&gt;
---|gui_components/&lt;br&gt;
---|skins/&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The pieces
We will create a &lt;code&gt;pieces.py&lt;/code&gt; file in our gui_components folder. In this file we will create a Piece class. For now the objects of this class will simply be used to display the image and get the value of the piece based on its notation (in chess the different pieces have notations k for King, q for Queen, r for Rook, b for bishop, n for Knight and p for Pawn) and whether or not it has been captured.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import os
import pygame

class Piece:
    colors_notations_and_values = {
        "w": {
            "p": 1,
            "n": 3,
            "b": 3,
            "r": 5,
            "q": 9,
            "k": 90
        }, 
        "b": {
            "p": -1,
            "n": -3,
            "b": -3,
            "r": -5,
            "q": -9,
            "k": -90
        }
    }

    def __init__(self, name, notation, color, skin_directory="skins/default", is_captured=False) -&amp;gt; None:
        self.name = name
        self.__notation = notation
        self.color = color
        self.skin_directory = skin_directory
        self.set_is_captured(is_captured)

        self.value = self.get_piece_value()

    def get_piece_value(self):
        return Piece.colors_notations_and_values[self.color][self.__notation.lower()]

    def get_piece_color_based_on_notation(notation) -&amp;gt; str:
        """
        The chess module displays black pieces' notations in lowercase and white in uppercase, so we can get the color based on this
        """
        return "w" if notation.isupper() else "b"

    def get_value_from_notation(notation: str, color: str) -&amp;gt; int:
        """
        A class method that gets the corresponding value for a particular notation and color
        """
        return Piece.colors_notations_and_values[color][notation.lower()]

    def set_is_captured(self, is_captured: bool):
        self.__is_captured = bool(is_captured)

    def get_image_path(self):
        """
        Gets the path to the image of the piece based on its notation and 
        whether or not it has been captured
        """
        if not self.__is_captured:
            path = os.path.join(self.skin_directory, self.color, f"{self.__notation.lower()}.png")
        else:
            path = os.path.join(self.skin_directory, self.color, "captured", f"{self.__notation.lower()}.png")

        return path

    def get_image(self):
        """
        Returns a pygame image object from the piece's corresponding image path
        """
        image_path = self.get_image_path()

        if os.path.exists(image_path):
            return pygame.image.load(image_path)
        else:
            raise FileNotFoundError(f"The image was not found in the {image_path}")

    def __str__(self):
        return f"{self.__notation} {self.color}"

    def get_notation(self) -&amp;gt; str:
        """
        Returns the notation of the piece, (pawns' notations are empty strings)
        """
        if self.__notation != 'p':
            return self.__notation.upper()

        return ''

    def __set_notation(self, notation):
        self.__notation = notation

    def promote(self, notation: str):
        """
        Promotes this piece to a piece with the notation notation.
        It is important to note that promotion does not increase the piece's value, 
        just its capabilities
        """
        if self.__notation.lower() != "p":
            raise ValueError("Cannot promote a piece other than a pawn")

        if notation not in ["q", "r", "n", "b"]:
            raise ValueError("Can only promote to queen, rook, bishop or knight pieces")
        self.__set_notation(notation)

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

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;The squares and board
When creating this game I thought about being able to have a checkers game with it, so the classes in this section kind of reflect that vision. First and foremost, create a new file &lt;code&gt;boards.py&lt;/code&gt;. In this file create a Square class (a generic class for squares checkers or chess)
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import chess

import pygame

from gui_components.pieces import Piece

class Square(pygame.Rect):
    def __init__(self, left: float, top: float, width: float, height: float, background_color: str, border_color: str, piece: Piece = None) -&amp;gt; None:
        super().__init__(left, top, width, height)
        self.background_color = background_color
        self.border_color = border_color
        self.piece = piece
        self.is_possible_move = False

    def toggle_is_possible_move(self):
        self.is_possible_move = not self.is_possible_move
        return self

    def empty(self):
        self.piece = None

        return self

    def set_is_possible_move(self, value: bool):
        self.is_possible_move = bool(value)
        return self
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now a square for chess pieces&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class ChessSquare(Square):
    def __init__(self, left: float, top: float, width: float, height: float, background_color: str, border_color: str, file_number, rank_number, piece: Piece = None) -&amp;gt; None:
        super().__init__(left, top, width, height, background_color, border_color, piece)
        self.file_number = file_number
        self.rank_number = rank_number
        self.ranks = list( str(i) for i in range(1, 9) )
        self.files = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

    def get_chess_square(self) -&amp;gt; chess.Square:
        """
        Returns a chess.Square object that corresponds to this one
        """
        return chess.square(self.file_number, self.rank_number)

    def is_identical_to_chess_square(self, square: chess.Square) -&amp;gt; bool:
        """
        Checks if this object corresponds to a chess.Square object
        """
        return (
            self.file_number == chess.square_file(square) and 
            self.rank_number == chess.square_rank(square)
        )

    def get_rank(self) -&amp;gt; str:
        """
        Gets the rank of the object. Ranks are the rows of the board and they range from 1 to 8
        """
        return self.ranks[ self.rank_number ]

    def get_file(self) -&amp;gt; str:
        """
        Gets the file of the object. Files are the columns of the board and range from A to H
        """
        return self.files[ self.file_number ]

    def get_notation(self) -&amp;gt; str:
        """
        Gets the notation of the square object. A squares notation is simply its file and rank
        """
        return f'{self.get_file()}{self.get_rank()}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now for the board. Same as the square we will create 2 board classes although the parent board class doesn't do much for now. This class will help us keep track of the pieces on our squares, highlight a move made, display the possible moves, get a square that corresponds to particular coordinates and make a move.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Board(pygame.sprite.Sprite):
    RANKS = [ i+1 for i in range(0, 8) ]
    FILES = [ chr(i) for i in range(65, 65+9) ]

    def __init__(self, number_of_rows, number_of_columns, left, top, width, height, horizontal_padding, vertical_padding, **kwargs) -&amp;gt; None:
        self.left = left
        self.top = top
        self.number_of_rows = number_of_rows
        self.number_of_columns = number_of_columns
        self.width = width
        self.height = height
        self.horizontal_padding = horizontal_padding
        self.vertical_padding = vertical_padding
        self.squares = []

    def create_squares(self):
        pass

class ChessBoard(Board):
    def __init__(
        self, left, top, width, height, 
        horizontal_padding=None, vertical_padding=None, 
        light_square_color: str=(245, 245, 245), dark_square_color: str=(100, 100, 100), 
        previous_square_highlight_color=(186, 202, 43),
        current_square_highlight_color=(246, 246, 105),
        board: chess.Board=None, move_hints=True, **kwargs
    ) -&amp;gt; None:
        super().__init__(
            8, 8, left, top, width, height, 
            horizontal_padding, vertical_padding, **kwargs
        )
        self.__set_square_size()
        self.light_square_color = light_square_color
        self.dark_square_color = dark_square_color
        self.board = board
        self.move_hints = move_hints
        print('The current board is')
        print(self.board)
        self.rect = pygame.Rect(left, top, width, height)

        self.create_squares()

        self.captured_pieces = {
            "w": [],
            "b": []
        }

        # the square the piece that made the latest move came from
        self.previous_move_square = None 
        self.current_move_square = None 

        self.previous_square_highlight_color = previous_square_highlight_color
        self.current_square_highlight_color = current_square_highlight_color

        self.is_flipped = bool(kwargs["flipped"]) if "flipped" in kwargs else False

        # set to True if a pawn has the right to promote and has to choose which piece it wants to promote to
        self.awaiting_promotion = False

        # self.flip()

    def __set_square_size(self):
        self.__square_size = self.height // 8

    @property
    def square_size(self) -&amp;gt; int:
        return self.__square_size


    def get_piece_from_notation(self, notation):
        """
        Returns a piece object based on a particular notation
        """
        if notation != '.':
            piece_color = "b" if notation.islower() else "w"
            notation = notation.lower()
            piece = Piece(name=notation, notation=notation, color=piece_color)

            return piece

        return None

    def get_square_from_chess_square(self, square: chess.Square) -&amp;gt; ChessSquare:
        """
        Returns a Square object that corresponds to a particular chess.Square object
        """
        square_file = chess.square_file(square)
        square_rank = chess.square_rank(square)

        rank = self.squares[ 7 - square_rank ]

        return rank[ square_file ]

    def create_squares(self):
        """
        Creates the squares oon the board and places pieces on them based on the state of the chess.Board object
        """
        string = self.board.__str__()
        ranks_inverted = string.split('\n')#[::-1]

        for i in range(self.number_of_rows):
            self.squares.append( [] )

            rank = ranks_inverted[i].split(' ')

            for j in range(self.number_of_columns):
                square = rank[j]

                piece = self.get_piece_from_notation(square)

                color = self.light_square_color if (i+j) % 2 == 0 else self.dark_square_color

                board_square = ChessSquare( 
                    self.left + (j*self.square_size), self.top + (i*self.square_size), self.square_size, 
                    self.square_size, color, self.dark_square_color, j, 7 - i, piece=piece
                )

                self.squares[i].append( board_square )

    def flip(self):
        """
        Changes the coordinates of the squares in essence flipping them
        """
        board_rect = pygame.Rect(self.left, self.top, self.width, self.height)

        for (i, rank) in enumerate(self.squares):
            print(f"Flipping the squares on rank: {8 - i}")
            for (j, square) in enumerate(rank):
                square: ChessSquare = square
                _old = square.__repr__()

                square.x += (7 - j) * self.square_size
                square.y += (7 - i) * self.square_size

                if not square.colliderect(board_rect):
                    print("Square is out of bounds of the board")
                    print(f"The board rectangle is: {board_rect}. The square rectangle is: {square}")

                else:
                    print(f"Square was flipped successfully. Old coordinates: {_old}, new: {square}")

        self.is_flipped = not self.is_flipped

    def place_pieces(self):
        """
        places pieces on the board based on the progress of the board attribute 
        different from create_squares in that it doesn't create squares it instead 
        clears all the squares of existing pieces and positions the pieces on the board
        """
        string = self.board.__str__()
        ranks_inverted = string.split('\n')#[::-1]

        for i in range( self.number_of_rows ):
            rank = ranks_inverted[i].split(' ')

            for j in range( self.number_of_columns ):
                self.squares[i][j].empty()
                board_square = rank[j]

                piece = self.get_piece_from_notation(board_square)

                self.squares[i][j].piece = piece

    def get_possible_moves(self, source_coordinates, remove_hints=False):
        """
        Gets the possible moves from some coordinates and marks the squares as possible moves if move_hints are enabled
        """
        # source_square = [ square.get_chess_square() for square in self.iter_squares() if square.collidepoint(source_coordinates) ]
        source_square = self.get_square_from_coordinates(source_coordinates)

        if source_square:
            destination_chess_squares = [ move.to_square for move in self.board.legal_moves if move.from_square == source_square ]
            destination_squares = [ square.set_is_possible_move(not remove_hints) for square in self.iter_squares() if square.get_chess_square() in destination_chess_squares ]

            return destination_squares

        return []

    def get_possible_moves_without_hint(self, source_coordinates):
        """
        Gets the possible moves from some coordinates
        """
        source_square = self.get_square_from_coordinates(source_coordinates)

        if source_square:
            destination_chess_squares = [ move.to_square for move in self.board.legal_moves if move.from_square == source_square ]
            destination_squares = [ square for square in self.iter_squares() if square.get_chess_square() in destination_chess_squares ]

            return destination_squares

        return []

    def hide_hints(self):
        """
        Hides the hints on the squares
        """
        [square.set_is_possible_move(False) for square in self.iter_squares()]

    def get_square_from_coordinates(self, coordinates, return_chess_square=True) -&amp;gt; ChessSquare:
        """
        Returns a square that corresponds to the coordinates passed
        """
        square = [ (square.get_chess_square() if return_chess_square else square) for square in self.iter_squares() if square.collidepoint(coordinates) ]

        if len(square) &amp;gt; 0:
            square = square[0]

            return square
        print(f"There is no square at the {coordinates} coordinates")
        return None

    def get_move_notation(self, source_square: ChessSquare, destination_square: ChessSquare):
        """
        Gets the notation for a particular move made from source_square to destination_square
        """
        move = ''

        if source_square.piece:
            other_pieces_of_the_same_type_that_can_make_move = self.get_pieces_that_can_make_move( [source_square.piece.get_notation()], source_square.piece.color, destination_square, [source_square] )
            same_rank = False
            same_file = False

            if source_square.piece.get_notation() != '':
                for square in other_pieces_of_the_same_type_that_can_make_move:
                    if square.rank_number == source_square.rank_number:
                        same_rank = True
                    if square.file_number == source_square.file_number:
                        same_file = True

                move = move + source_square.piece.get_notation()

                if same_file or same_rank:
                    if not same_file:
                        move = move + f"{source_square.get_file()}"
                    elif same_file and not same_rank:
                        move = move + f"{source_square.get_rank()}"
                    else:
                        move = move + f"{source_square.get_notation()}"

        if destination_square.piece:
            move = move + 'x'

            if source_square.piece and source_square.piece.get_notation() == '':
                move = source_square.get_file() + move


        move = move + f'{destination_square.get_notation()}'

        if source_square.piece.get_notation() == 'K' and source_square.get_file() == 'e' and destination_square.get_file() in [ 'c', 'g' ]:
            # castling
            if destination_square.get_file() == 'c':
                return '0-0-0'
            else:
                return '0-0'

        move = chess.Move(
            from_square=source_square.get_chess_square(), to_square=destination_square.get_chess_square()
        )

        return move

    def get_pieces_that_can_make_move(self, piece_notations: list, color, square: ChessSquare, squares_to_exclude: list):
        """
        Returns the pieces with notations in &amp;lt;piece_notations&amp;gt; list and of color &amp;lt;color&amp;gt; that can make a move the &amp;lt;square&amp;gt; square 
        while excluding the pieces on the &amp;lt;squares_to_exclude&amp;gt; list
        """
        squares_with_pieces_of_specified_types = [ _square for _square in self.iter_squares() if _square.piece and _square.piece.get_notation() in piece_notations and _square.piece.color == color and _square not in squares_to_exclude ]
        squares_that_can_make_move = [ _square for _square in squares_with_pieces_of_specified_types if square in self.get_possible_moves_without_hint(_square.center) ]

        return squares_that_can_make_move

    def play(self, source_coordinates, destination_coordinates):
        """
        Makes a move from source_coordinates to destination_coordinates
        """
        source_square = self.get_square_from_coordinates(source_coordinates, return_chess_square=False)
        destination_square = self.get_square_from_coordinates(destination_coordinates, return_chess_square=False)

        self._play(source_square, destination_square)

    def _play(self, source_square: ChessSquare=None, destination_square: ChessSquare=None, 
        source_chess_square: chess.Square=None, destination_chess_square: chess.Square=None,
        move: chess.Move=None
    ):
        """
        Makes a move based on the arguments.
        """
        if move:
            self.make_move(move)
            self.previous_move_square = self.get_square_from_chess_square(move.from_square)
            self.current_move_square = self.get_square_from_chess_square(move.to_square)

        elif source_square and destination_square:
            move = self.get_move_notation(source_square, destination_square)
            self.make_move(move)
            self.previous_move_square = source_square
            self.current_move_square = destination_square

        elif source_chess_square and destination_chess_square:
            move = chess.Move(from_square=source_chess_square, to_square=destination_chess_square)
            self.make_move(move)
            self.previous_move_square = self.get_square_from_chess_square(source_chess_square)
            self.current_move_square = self.get_square_from_chess_square(destination_chess_square)

        else:
            print("None of the conditions were fulfilled. No move is currently being made")

        self.place_pieces()

        print('The current board is')
        print(self.board)

    def make_move(self, move):
        """
        Makes a move either with an str object or a chess.Move object
        """
        if isinstance(move, str):
            self.board.push_san(move)
        elif isinstance(move, chess.Move):

            if self.board.is_capture(move):
                destination_square: ChessSquare = self.get_square_from_chess_square(move.to_square)
                piece: Piece = destination_square.piece

                print("The move was a capture")

                if piece is not None:
                    piece.set_is_captured(True)
                    color = piece.color

                    self.captured_pieces[color].append(piece)

            self.board.push(move)

    def iter_squares(self):
        """
        A generator that returns the different squares on the board
        """
        for rank in self.squares:
            for square in rank:
                yield square

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Displaying the board in a pygame window
&lt;/h3&gt;

&lt;p&gt;Before we move forward with this, let's firstly create some classes we will use in this file. In our gui_components folder we will create a new file &lt;code&gt;components.py&lt;/code&gt;. Put this code inside that file&lt;br&gt;
&lt;/p&gt;

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

class BorderedRectangle():
    """
    An object that contains 2 pygame.Rect object, one put inside the other
    """
    def __init__(
        self, left: float, top: float, width: float, height: float, 
        background_color: str, border_color: str, border_width: int,
        outer_rectangle_border_width=2, inner_rectangle_border_width=2
    ) -&amp;gt; None:
        self.background_color = background_color
        self.border_color = border_color
        self.is_possible_move = False
        self.outer_rectangle_border_width = outer_rectangle_border_width
        self.inner_rectangle_border_width = inner_rectangle_border_width

        self.outer_rectangle = pygame.Rect(left, top, width, height)

        self.inner_rectangle = pygame.Rect(
            left+(border_width / 2), top+(border_width/2), 
            width - border_width, height - border_width
        )

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

&lt;/div&gt;



&lt;p&gt;Now in our root directory (chess-game), create a new file &lt;code&gt;main.py&lt;/code&gt;. In this file we will write the code to display our board in a pygame window and even to play the game without AI and board flips.&lt;br&gt;
&lt;/p&gt;

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

import pygame

from pygame import mixer

mixer.init()

from gui_components.board import ChessBoard
from gui_components.components import BorderedRectangle

from ai import players as ai_players

pygame.init()

screen = pygame.display.set_mode([500, 500])

board = chess.Board()

# A dictionary of the different players in the game. True corresponds to white and 
# False to black
players = { 
    True: "user",
    False: "user"
}

turns_taken = {
    True: False, # set to True if white has already started playing 
    False: False # set to True if black has already started playing
}

# the different sounds for the moves
move_sound = mixer.Sound("sound_effects/piece_move.mp3")
check_sound = mixer.Sound("sound_effects/check.mp3")
checkmate_sound = mixer.Sound("sound_effects/checkmate.mp3")

SOURCE_POSITION = None
DESTINATION_POSITION = None
PREVIOUSLY_CLICKED_POSITION = None
POSSIBLE_MOVES = []
TURN = True
IS_FIRST_MOVE = True

running = True

LIGHT_COLOR = (245, 245, 245) # color of the light squares
DARK_COLOR = ( 100, 100, 100 ) # color of the dark squares
WHITE_COLOR = (255, 255, 255) # white
BLACK_COLOR = (0, 0, 0) # black

chess_board = ChessBoard(  # creating a new ChessBoard object
    50, 50, 400, 400, 0, 0, board=board
)

def draw_bordered_rectangle(rectangle: BorderedRectangle, screen):
    pygame.draw.rect( screen, rectangle.border_color, rectangle.outer_rectangle, width=rectangle.outer_rectangle_border_width )
    pygame.draw.rect( screen, rectangle.background_color, rectangle.inner_rectangle, width=rectangle.inner_rectangle_border_width )

def draw_chessboard(board: ChessBoard):
    """
    Draw the chess board on the pygame window
    """
    ranks = board.squares # get the rows of the board

    # a rectangle enclosing the board and the files and ranks labels
    board_bordered_rectangle = BorderedRectangle(25, 25, 450, 450, WHITE_COLOR, DARK_COLOR, 48)
    draw_bordered_rectangle(board_bordered_rectangle, screen)

    # draw the inner rectangle of the bordered rectangle with the same color 
    # as that of the dark squares
    pygame.draw.rect( 
        screen, board_bordered_rectangle.border_color, board_bordered_rectangle.inner_rectangle, 
        width=1
    )

    board_top_left = board.rect.topleft
    board_top_right = board.rect.topright
    board_bottom_left = board.rect.bottomleft

    for i, rank in enumerate(ranks):
        rank_number = ChessBoard.RANKS[ 7 - i ]
        file_letter = ChessBoard.RANKS[i]

        font_size = 15 # font size for the ranks and files

        # add the text rectangle on the left and right of the board
        font = pygame.font.SysFont('helvetica', font_size)

        # render the ranks (1-8)
        for _i in range(1):
            if _i == 0:
                _rect = pygame.Rect(
                    board_top_left[0] - font_size, board_top_left[1] + (i*board.square_size), 
                    font_size, board.square_size
                )
            else:
                _rect = pygame.Rect(
                    board_top_right[0], board_top_right[1] + (i*board.square_size),
                    font_size, board.square_size
                )

            text = font.render(f"{rank_number}", True, DARK_COLOR)
            text_rect = text.get_rect()
            text_rect.center = _rect.center

            screen.blit(text, text_rect)

        # render the files A-H
        for _i in range(1):
            if _i == 0:
                _rect = pygame.Rect(
                    board_top_left[0] + (i*board.square_size), board_top_left[1] - font_size, 
                    board.square_size, font_size
                )
            else:
                _rect = pygame.Rect(
                    board_top_left[0] + (i*board.square_size), board_bottom_left[1], 
                    board.square_size, font_size
                )

            text = font.render(f"{file_letter}", True, DARK_COLOR)
            text_rect = text.get_rect()
            text_rect.center = _rect.center

            screen.blit(text, text_rect)

        for j, square in enumerate(rank):
            if square is board.previous_move_square:
                # highlight source square of the latest move
                pygame.draw.rect( screen, board.previous_square_highlight_color, square )
            elif square is board.current_move_square:
                # highlight the destination square of the latest move
                pygame.draw.rect( screen, board.current_square_highlight_color, square )
            else:
                pygame.draw.rect( screen, square.background_color, square )

            if square.piece:
                # draw the piece on the square
                try:
                    image = square.piece.get_image()
                    image_rect = image.get_rect()
                    image_rect.center = square.center

                    screen.blit( image, image_rect )
                except TypeError as e:
                    raise e
                except FileNotFoundError as e:
                    print(f"Error on the square on the {i}th rank and the {j}th rank")
                    raise e

            if square.is_possible_move and board.move_hints:
                # draw a circle in the center of the square to highlight is as a possible move
                pygame.draw.circle( 
                    screen, (50, 50, 50), 
                    square.center,
                    board.square_size*0.25
                )

def play_sound(board):
    """
    Play sound after move based on move type
    """
    if board.is_checkmate():
        mixer.Sound.play(checkmate_sound)

    elif board.is_check():
        mixer.Sound.play(check_sound)

    elif board.is_stalemate():
        pass

    else:
        mixer.Sound.play(move_sound)

def play(source_coordinates: tuple=None, destination_coordinates: tuple=None):
    """
    Make a move on the board based on the source and destination coordinates if a user is playing
    """
    global board, TURN, IS_FIRST_MOVE, chess_board

    turn = board.turn

    player = players[turn]
    turns_taken[turn] = not turns_taken[turn]
    print(f"Setting {turns_taken[turn]} to {not turns_taken[turn]}")

    if not isinstance(player, str):
        # AI model to play
        player.make_move(chess_board)
        play_sound(board)

        TURN = not TURN

        if isinstance(players[TURN], ai_players.AIPlayer):
            # if the next player is an AI, automatically play
            print("Next player is AI, making a move for them automaically")
            # sleep(5)
    else:
        if source_coordinates and destination_coordinates:
            # user to play
            print("User is making move")
            chess_board.play(source_coordinates, destination_coordinates)
            play_sound(board)
            TURN = not TURN

    if IS_FIRST_MOVE:
        IS_FIRST_MOVE = False

    turns_taken[turn] = not turns_taken[turn]
    print(f"Setting {turns_taken[turn]} to {not turns_taken[turn]}")


def click_handler(position):
    """
    Handle the click events of the game
    """
    global SOURCE_POSITION, POSSIBLE_MOVES, TURN

    if chess_board.rect.collidepoint(position): # if position is in the board
        current_player = players[TURN]

        if isinstance(current_player, str):
            if SOURCE_POSITION is None:
                POSSIBLE_MOVES = chess_board.get_possible_moves(position)
                SOURCE_POSITION = position if POSSIBLE_MOVES else None
            else:
                # getting the squares in the possible destinations that correspond to the clicked point
                destination_square = [ square for square in POSSIBLE_MOVES if square.collidepoint(position) ]

                if not destination_square:
                    chess_board.get_possible_moves(SOURCE_POSITION, remove_hints=True)
                    SOURCE_POSITION = None
                else:
                    destination_square = destination_square[0]
                    print(f"In main.py, about to play, the source and destination are {SOURCE_POSITION} and {position} respectively")
                    chess_board.get_possible_moves(SOURCE_POSITION, remove_hints=True)

                    # chess_board.play( SOURCE_POSITION, position )
                    play(SOURCE_POSITION, position)
                    SOURCE_POSITION = None

                    current_player = players[TURN]

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN:
            MOUSE_CLICKED_POSITION = pygame.mouse.get_pos()
            click_handler(MOUSE_CLICKED_POSITION)

    screen.fill( (255, 255, 255) )

    draw_chessboard(chess_board, True)

    pygame.display.flip()

pygame.quit()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if you activate your virtual environment and run the main.py file &lt;code&gt;python main.py&lt;/code&gt; a GUI chess game should be displayed: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7dtub2dx7olkm0e09qo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7dtub2dx7olkm0e09qo.png" alt="A new game GUI" width="506" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a gif of a game between two users &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgc1qgz83lg9u87koxq0.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgc1qgz83lg9u87koxq0.gif" alt="User v User" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/nguhprince/creating-a-chess-game-with-python-pygame-and-chess-pt-2-539b"&gt;next&lt;/a&gt; article, we are going to look at the creation of an AI player and how to integrate that with our existing code.&lt;/p&gt;

</description>
      <category>python</category>
      <category>gamedev</category>
      <category>ai</category>
    </item>
    <item>
      <title>My portfolio journey #1</title>
      <dc:creator>Prince</dc:creator>
      <pubDate>Tue, 12 Oct 2021 09:25:42 +0000</pubDate>
      <link>https://dev.to/nguhprince/my-portfolio-journey-1-3eh</link>
      <guid>https://dev.to/nguhprince/my-portfolio-journey-1-3eh</guid>
      <description>&lt;p&gt;Hi, I'm Prince. I'm in the final year of my 3 year CS program and very soon I'll be out looking for a job. To prepare for that I thought it wise to begin creating a portfolio site and at the time of writing I am looking at some example portfolios. &lt;/p&gt;

&lt;p&gt;Being someone who is not very comfortable with design, UI/UX (pretty much anything that is supposed to be visually compelling) it was a pretty daunting task. I thought looking at some example sites was going to help, it did, but then I realized those sites had loads of great visual content and animations which I don't think I could implement successfully. &lt;/p&gt;

&lt;p&gt;This realization put me down a bit but the truth is your first portfolio doesn't have to be some out-of-earth looking thingamajig, it just has to exist. So I decided to go simple and start by making a simple wireframe of a site I was able to build from the ground up. I am going to be documenting my journey as I am advancing. I will include tips / tutorials on how I created my website and since I have no clients (yet) I will also talk about the pet projects I put on my site and what motivated my choice of them.&lt;/p&gt;

&lt;p&gt;Wish me luck. &lt;/p&gt;

&lt;p&gt;PS: here are links to some resources that helped me along the way&lt;br&gt;
&lt;a href="https://www.freecodecamp.org/news/coding-projects-to-include-in-your-frontend-portfolio/"&gt;https://www.freecodecamp.org/news/coding-projects-to-include-in-your-frontend-portfolio/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.seanhalpin.design/"&gt;https://www.seanhalpin.design/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://blog.jemimaabu.com/how-i-built-my-perfect-score-portfolio-website#how-to-get-a-perfect-lighthouse-score-on-your-website"&gt;https://blog.jemimaabu.com/how-i-built-my-perfect-score-portfolio-website#how-to-get-a-perfect-lighthouse-score-on-your-website&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>career</category>
      <category>css</category>
    </item>
  </channel>
</rss>
