AutomationFlowsWeb Scraping › Scraping Articles Dev.to Prod

Scraping Articles Dev.to Prod

Scraping Articles Dev.to Prod. Uses itemLists, stickyNote, nocoDb, scheduleTrigger. Scheduled trigger; 44 nodes.

Cron / scheduled trigger★★★★★ complexityAI-powered44 nodesItem ListsNoco DbHttp RequestChain LlmLm Chat Groq
Web Scraping Trigger: Cron / scheduled Nodes: 44 Complexity: ★★★★★ AI nodes: yes

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Scraping Articles Dev.to Prod",
  "nodes": [
    {
      "parameters": {
        "fieldToSplitOut": "data",
        "options": {
          "destinationFieldName": "Date"
        }
      },
      "id": "1bdc5dd4-723b-42ed-b06a-e493b890cdd4",
      "name": "Create single date items",
      "type": "n8n-nodes-base.itemLists",
      "position": [
        -380,
        100
      ],
      "typeVersion": 3
    },
    {
      "parameters": {
        "fieldToSplitOut": "data",
        "options": {
          "destinationFieldName": "Link"
        }
      },
      "id": "b6253f5b-4a90-46fb-b62c-c056ef8a4abe",
      "name": "Create single link items",
      "type": "n8n-nodes-base.itemLists",
      "position": [
        -380,
        260
      ],
      "typeVersion": 3
    },
    {
      "parameters": {
        "content": "",
        "height": 268.56781146309544,
        "width": 262.99083066277313
      },
      "id": "17e31829-b826-40f8-85b6-faa46ee34104",
      "name": "Sticky Note18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        740
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "## News summaries and keywords → database\n\n[NocoDB](https://nocodb.com/) is an SQL database, here we store the news summaries and keywords for further processing. Any other output target can be chosen here, e.g. e-mail, Excel etc.\n\nYou need first have that database structured before appending the news summaries and additional fields. The you can shape this node.\n\nSome fields may be edited in the database itself (e.g. relevance of the news to you) and may be filled therefore with a default value or not at all",
        "height": 268.5678114630957,
        "width": 483.95825869942666
      },
      "id": "c39951ac-0fe4-41f0-9983-eed797848bd9",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        460,
        740
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "authentication": "nocoDbApiToken",
        "operation": "create",
        "projectId": "pppjmqbs176xvhs",
        "table": "m9sc2e7bk2hxaab",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldName": "=News_Source",
              "fieldValue": "=Dev.to"
            },
            {
              "fieldName": "Title",
              "fieldValue": "={{ $json.title }}"
            },
            {
              "fieldName": "Date",
              "fieldValue": "={{ $json.Date }}"
            },
            {
              "fieldName": "Link",
              "fieldValue": "={{ $json.Link }}"
            },
            {
              "fieldName": "Summary",
              "fieldValue": "={{ $json.summary }}"
            },
            {
              "fieldName": "Keywords",
              "fieldValue": "={{ $json.keywords }}"
            },
            {
              "fieldName": "image_link",
              "fieldValue": "={{ $json.image_link }}"
            },
            {
              "fieldName": "Reactions",
              "fieldValue": "={{ $json.Reactions }}"
            }
          ]
        }
      },
      "id": "b3a241a4-e0e3-4d24-90a5-b4d46d3c8f59",
      "name": "NocoDB news database",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        280,
        820
      ],
      "typeVersion": 2,
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "Add title, link and date to summary and keywords of each news post",
        "height": 260.5279202647822,
        "width": 180.1723775015045
      },
      "id": "6103713a-c31c-469f-8bb9-157f71204900",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -40,
        740
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "id": "97d594a3-8dc3-46c8-b573-ed47c2cff4b0",
      "name": "Schedule Trigger each week",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -980,
        260
      ],
      "typeVersion": 1.1
    },
    {
      "parameters": {
        "content": "Merge summary and keywords of each news post",
        "height": 254.94383570413422,
        "width": 169.7675735887227
      },
      "id": "6e9c6f16-1306-43e5-b145-1e4e7628f18f",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -340,
        740
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "Just a renaming of data fields and eliminating unnecessary ones",
        "height": 489.05192374172555,
        "width": 182.7735784797001
      },
      "id": "b8552c7e-b417-473f-9734-690d2e968143",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -560,
        600
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\nGet the 3 keywords of each news post",
        "height": 219,
        "width": 313
      },
      "id": "8217ea2f-a8cb-4002-8ad2-a8d4daf27ed4",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -900,
        980
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "Create a summary of each news post with ChatGPT. You need a ChatGPT API account for this",
        "height": 256.2444361932317,
        "width": 150
      },
      "id": "b6d46974-8943-4a7b-ad84-8f5c36bcb09e",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -720,
        580
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "Merge link to url, date with content (text) and title of each news psot",
        "height": 234.13422787857044,
        "width": 191.87778190338406
      },
      "id": "5b20473d-d47e-4524-aeef-e2aadf0204f6",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        440
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "Extracting the title & content (text) of each individual news post with the right CSS selector",
        "height": 269.2504410842093,
        "width": 184.07417896879767
      },
      "id": "972c0bc7-b154-45ec-a791-a6abc7fc9fe6",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        160
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "Get the html of each individual **newest** post",
        "height": 272.1479798256519,
        "width": 155.0036363426638
      },
      "id": "e87b3aab-0c5a-4362-805a-1e9db8765f92",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        160
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "url": "https://dev.to/top/month",
        "options": {
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "id": "de2b1ac6-8e84-4ae5-b25b-95492f78c2b4",
      "name": "Retrieve the web page for further processsing",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -800,
        260
      ],
      "typeVersion": 4.1
    },
    {
      "parameters": {
        "content": "The links of the individual posts and the dates of the posts ",
        "height": 274.50898992724416,
        "width": 150
      },
      "id": "5b4bb873-56ee-4871-a155-fd03fc5146d0",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -200,
        160
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "As the extraction are returned as arrays, they transformed into individual JSON items to enable looping with other nodes",
        "height": 469.2923233086395,
        "width": 187.3613302133812
      },
      "id": "d090744c-9635-4bd4-ab3a-60e934639ba3",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -420,
        -60
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "The html of the news site is being retrieved: https://www.colt.net/resources/type/news/",
        "height": 241.454848504947,
        "width": 185.41515152389002
      },
      "id": "6820db6a-aaa6-4cec-809b-fe097668eb6f",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -840,
        180
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "Weekly cron job",
        "height": 237.91333335255808,
        "width": 153.90180146729315
      },
      "id": "754b2a47-d3c9-4dd1-8ede-5f20f2325653",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1000,
        180
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "# Scraping posts of a news site without RSS feed\n\n\nThe [News Site](https://www.colt.net/resources/type/news/) from Colt, a telecom company, does not offer an RSS feed, therefore web scraping is the \nchoice to extract and process the news.\n\nThe goal is to get only the newest posts, a summary of each post and their respective (technical) keywords.\n\nNote that the news site offers the links to each news post, but not the individual news. We collect first the links and dates of each post before extracting the newest ones.\n\nThe result is sent to a SQL database, in this case a NocoDB database.\n\nThis process happens each week thru a cron job.\n\n**Requirements**:\n- Basic understanding of CSS selectors and how to get them via browser (usually: right click &rarr; inspect)\n- ChatGPT API account - normal account is not sufficient\n- A NocoDB database - of course you may choose any type of output target\n\n**Assumptions**:\n- CSS selectors work on the news site\n- The post has a date with own CSS selector - meaning date is not part of the news content\n\n**\"Warnings\"**\n- Not every site likes to be scraped, especially not in high frequency\n- Each website is structured in different ways, the workflow may then need several adaptations.\n\n\nHappy about any suggestion to improve. You may contact me on **Mastodon**: https://bonn.social/@askans",
        "height": 1127.2017245821128,
        "width": 334.4404040637068
      },
      "id": "1a9f8e56-3409-4539-956e-a2d5c9f0989f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1380,
        -20
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "Extracting the dates of the posts of the press release page.\nThe right CSS selector has to be chosen.\n[More info on datagrab.io](https://datagrab.io/blog/guide-to-css-selectors-for-web-scraping/)",
        "height": 289.463147786618,
        "width": 178.75185894039254
      },
      "id": "e0b1666a-de2a-4fa8-91d7-007ab9ec7ff3",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -620,
        -60
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nExtracting the individual links of the press release page in order to retrieve the individual posts on their respective **url**",
        "height": 304.2550759710132,
        "width": 182.2748213508401
      },
      "id": "52ad8299-8d2f-438e-8ca8-6f6a56dd966b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -620,
        260
      ],
      "typeVersion": 1,
      "disabled": true
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "7b6207e3-9fa2-4c58-b780-fdb6ffe57cb6",
      "name": "Merge ChatGPT output with Date & Link",
      "type": "n8n-nodes-base.merge",
      "position": [
        0,
        820
      ],
      "typeVersion": 2.1
    },
    {
      "parameters": {
        "content": "Select only the newest news: todays date going back xy days",
        "height": 276.31054308676767,
        "width": 180.9747474601832
      },
      "id": "c02f8b81-233c-439b-a26e-2c6eecf0c460",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -40,
        160
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "title",
              "cssSelector": ".crayons-article__header__meta > h1"
            },
            {
              "key": "content",
              "cssSelector": ".crayons-article__main"
            },
            {
              "key": "image_link",
              "cssSelector": ".crayons-article__cover > img",
              "returnValue": "attribute",
              "attribute": "src"
            }
          ]
        },
        "options": {}
      },
      "id": "f6f2b78a-3e4b-40ba-96c8-fda088c4dac6",
      "name": "Extract individual posts",
      "type": "n8n-nodes-base.html",
      "position": [
        800,
        260
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {
          "fuzzyCompare": false
        }
      },
      "id": "de94a0ed-7f4f-4a3c-b9cb-33981001bf83",
      "name": "Merge Content with Date & Link",
      "type": "n8n-nodes-base.merge",
      "position": [
        800,
        540
      ],
      "typeVersion": 2.1
    },
    {
      "parameters": {
        "url": "={{ $json[\"Link\"] }}",
        "options": {}
      },
      "id": "ed02c8ad-4825-425c-8c65-840a9614aa16",
      "name": "HTTP Request1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        620,
        260
      ],
      "typeVersion": 4.1
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "data",
              "cssSelector": ".crayons-story__tertiary.fs-xs > time",
              "returnValue": "attribute",
              "attribute": "datetime",
              "returnArray": true
            }
          ]
        },
        "options": {}
      },
      "id": "ffb6ff69-d1bd-4e3a-92b5-a654015ba773",
      "name": "Extract date",
      "type": "n8n-nodes-base.html",
      "position": [
        -580,
        100
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "df84f04f-9c2c-45b7-bd31-67981f198747",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        -320,
        820
      ],
      "typeVersion": 2.1
    },
    {
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "keywords",
              "stringValue": "={{ $json.text }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "id": "265c1ce0-9a92-4afc-ba34-1a24ccfcd479",
      "name": "Rename keywords",
      "type": "n8n-nodes-base.set",
      "position": [
        -520,
        880
      ],
      "typeVersion": 3.1
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "data",
              "cssSelector": "=.crayons-story > a",
              "returnValue": "attribute",
              "attribute": "href",
              "returnArray": true
            }
          ]
        },
        "options": {
          "trimValues": true
        }
      },
      "id": "7f47cdf5-1790-4686-80fb-f067e1848ca0",
      "name": "Extract the HTML with the right css class",
      "type": "n8n-nodes-base.html",
      "position": [
        -580,
        260
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=name the 3 most important technical keywords in {{ $json[\"content\"] }} ? just name them without any explanations or other sentences"
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        -840,
        860
      ],
      "id": "77b30172-a68d-491e-ae11-efec412a0c81",
      "name": "Basic LLM Chain"
    },
    {
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "=summary",
              "stringValue": "={{ $('Merge Content with Date & Link').item.json.content }}"
            }
          ]
        },
        "include": "none",
        "options": {}
      },
      "id": "12cfbd7d-8005-42a9-8867-c5bcdf8398f3",
      "name": "Rename Summary",
      "type": "n8n-nodes-base.set",
      "position": [
        -520,
        700
      ],
      "typeVersion": 3.1
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Create a summary in less than 70 words {{ $json[\"content\"] }}"
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        -840,
        720
      ],
      "id": "ac436ec7-2058-465f-ac8b-399ec2eb9bfa",
      "name": "Basic LLM Chain1"
    },
    {
      "parameters": {
        "authentication": "nocoDbApiToken",
        "operation": "getAll",
        "projectId": "pppjmqbs176xvhs",
        "table": "m9sc2e7bk2hxaab",
        "returnAll": true,
        "options": {}
      },
      "type": "n8n-nodes-base.nocoDb",
      "typeVersion": 3,
      "position": [
        -180,
        0
      ],
      "id": "fe978fda-0a9f-4689-9c74-a1aa97b7e835",
      "name": "NocoDB",
      "alwaysOutputData": true,
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Obtener los datos del nodo 'Select posts of last 7 days' (Node A)\nconst nodeAData = $input.all().map(item => ({\n  link: item.json.Link.trim().toLowerCase(), // Normalizamos el enlace\n  date: new Date(item.json.Date), // Convertimos la fecha a un objeto Date para ordenar\n  reactions: parseInt(item.json.Reactions) // Convertimos las reacciones a n\u00famero\n}));\n\n// Obtener los datos del nodo 'NocoDB' (Node B)\nconst nodeBData = $input.all()[1]?.json; // Suponemos que Node B est\u00e1 conectado correctamente\n\n// Normalizamos los datos de Node B en un conjunto de enlaces \u00fanicos\nconst nodeBLinks = new Set(\n  Array.isArray(nodeBData) \n    ? nodeBData.map(item => item.Link.trim().toLowerCase())\n    : [nodeBData?.Link?.trim().toLowerCase()] // Si es un solo objeto\n);\n\n// Filtrar los datos de Node A para excluir enlaces presentes en Node B\nconst filteredData = nodeAData.filter(item => !nodeBLinks.has(item.link));\n\n// Encontrar el post con m\u00e1s reacciones\nconst topPost = filteredData.reduce((max, current) => {\n  return current.reactions > max.reactions ? current : max;\n}, filteredData[0]); // Comenzamos con el primer elemento como el m\u00e1ximo\n\n// Crear el resultado final para el post con m\u00e1s reacciones\nconst result = [{\n  json: {\n    Link: topPost.link,\n    Date: topPost.date.toISOString(), // Convertimos la fecha nuevamente a formato string\n    Reactions: topPost.reactions\n  }\n}];\n\n// Retornar el post con m\u00e1s reacciones\nreturn result;\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        400,
        280
      ],
      "id": "5aa4a4a3-5cf2-4450-a31b-ad90c125c75a",
      "name": "Code"
    },
    {
      "parameters": {
        "mode": "combine",
        "fieldsToMatchString": "Link",
        "joinMode": "keepNonMatches",
        "outputDataFrom": "input2",
        "options": {}
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        220,
        260
      ],
      "id": "ad2c2b0e-26d7-4193-84d2-2aeab634f193",
      "name": "Merge1"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "reactions",
              "cssSelector": ".crayons-story__bottom > div > a > div:nth-child(1)",
              "returnArray": true
            }
          ]
        },
        "options": {
          "trimValues": true
        }
      },
      "id": "46ea2c39-2c33-4c0c-a800-62a44dc92d1b",
      "name": "Extract the HTML with the right css class1",
      "type": "n8n-nodes-base.html",
      "position": [
        -580,
        420
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "fieldToSplitOut": "reactions",
        "include": "allOtherFields",
        "options": {
          "destinationFieldName": "Reactions"
        }
      },
      "id": "106e7364-e251-44fc-8d4f-c467c5f442e3",
      "name": "Create single reaction",
      "type": "n8n-nodes-base.itemLists",
      "position": [
        -420,
        440
      ],
      "typeVersion": 3
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "numberInputs": 3,
        "options": {}
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        -160,
        260
      ],
      "id": "c9c6d331-2b9d-4a8f-8c8f-b9a64ca85f15",
      "name": "Merge2"
    },
    {
      "parameters": {
        "jsCode": "function extraerNumeros(str) {\n  return str.replace(/\\D/g, '');\n}\n\n// Obtener todos los items de entrada\nconst items = $input.all();\n\n// Procesar cada item\nconst resultado = items.map(item => {\n  const textoOriginal = item.json.Reactions || '';\n  const soloNumeros = extraerNumeros(textoOriginal);\n  \n  return {\n    json: {\n      Reactions: soloNumeros\n    }\n  };\n});\n\nreturn resultado;\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -280,
        440
      ],
      "id": "21a9c931-fd9f-43b2-b9c2-ca0ae7ee6d98",
      "name": "Code1"
    },
    {
      "parameters": {
        "model": "gemma2-9b-it",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        -860,
        1040
      ],
      "id": "fe45f070-4c91-4313-8165-68368f5e0e8e",
      "name": "Groq Chat Model",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": "gemma2-9b-it",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        -720,
        1040
      ],
      "id": "8505a41c-43e0-4a7c-aa31-c8c065e9e27f",
      "name": "Groq Chat Model1",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Filtrar los 10 elementos m\u00e1s recientes primero\nconst topTenRecentItems = items\n    .sort((a, b) => new Date(b.json[\"Date\"].trim()) - new Date(a.json[\"Date\"].trim())) // Ordenar por fecha (m\u00e1s reciente primero)\n    .slice(0, 20); // Tomar los primeros 10 elementos m\u00e1s recientes\n\n// Ahora ordenar los 10 elementos por n\u00famero de reacciones (de mayor a menor)\nconst lastTenPopularAndRecentItems = topTenRecentItems\n    .sort((a, b) => {\n        // Primero, ordenar por n\u00famero de reacciones (de mayor a menor)\n        const reactionsA = parseInt(a.json[\"Reactions\"].split(' ')[0]) || 0;\n        const reactionsB = parseInt(b.json[\"Reactions\"].split(' ')[0]) || 0;\n        return reactionsB - reactionsA; // Ordenar de mayor a menor en reacciones\n    });\n\nreturn lastTenPopularAndRecentItems;\n"
      },
      "id": "5b4e45bd-6063-4be4-9dcb-4ca02e3c95e0",
      "name": "Most reacted las 10 days",
      "type": "n8n-nodes-base.code",
      "position": [
        0,
        260
      ],
      "typeVersion": 2
    }
  ],
  "connections": {
    "Create single date items": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger each week": {
      "main": [
        [
          {
            "node": "Retrieve the web page for further processsing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve the web page for further processsing": {
      "main": [
        [
          {
            "node": "Extract date",
            "type": "main",
            "index": 0
          },
          {
            "node": "Extract the HTML with the right css class",
            "type": "main",
            "index": 0
          },
          {
            "node": "Extract the HTML with the right css class1",
            "type": "main",
            "index": 0
          },
          {
            "node": "NocoDB",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge ChatGPT output with Date & Link": {
      "main": [
        [
          {
            "node": "NocoDB news database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract individual posts": {
      "main": [
        [
          {
            "node": "Merge Content with Date & Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Content with Date & Link": {
      "main": [
        [
          {
            "node": "Merge ChatGPT output with Date & Link",
            "type": "main",
            "index": 0
          },
          {
            "node": "Basic LLM Chain1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request1": {
      "main": [
        [
          {
            "node": "Extract individual posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create single link items": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract date": {
      "main": [
        [
          {
            "node": "Create single date items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Merge ChatGPT output with Date & Link",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Rename keywords": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract the HTML with the right css class": {
      "main": [
        [
          {
            "node": "Create single link items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "Rename keywords",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rename Summary": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain1": {
      "main": [
        [
          {
            "node": "Rename Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "NocoDB": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "HTTP Request1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Content with Date & Link",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract the HTML with the right css class1": {
      "main": [
        [
          {
            "node": "Create single reaction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create single reaction": {
      "main": [
        [
          {
            "node": "Code1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge2": {
      "main": [
        [
          {
            "node": "Most reacted las 10 days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code1": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Groq Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Most reacted las 10 days": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "timezone": "Europe/Madrid",
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": "sjcQU9AfIJohlBkS"
  },
  "versionId": "54681eab-8125-451f-a3d4-7492475bd620",
  "id": "UydVtvbhllq18SyG",
  "tags": []
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

About this workflow

Scraping Articles Dev.to Prod. Uses itemLists, stickyNote, nocoDb, scheduleTrigger. Scheduled trigger; 44 nodes.

Source: https://gitlab.com/rmadolell/n8n-free-workflows/-/blob/main/dev.to-post-scraper.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →