<?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: Jerrod Kim</title>
    <description>The latest articles on DEV Community by Jerrod Kim (@jerrod_kim_3809262f7f2543).</description>
    <link>https://dev.to/jerrod_kim_3809262f7f2543</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%2F3518415%2Fd7315855-362d-4979-b49e-74f110cfd018.png</url>
      <title>DEV Community: Jerrod Kim</title>
      <link>https://dev.to/jerrod_kim_3809262f7f2543</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jerrod_kim_3809262f7f2543"/>
    <language>en</language>
    <item>
      <title>Scraping Social Media with Gemini for sentiment analysis</title>
      <dc:creator>Jerrod Kim</dc:creator>
      <pubDate>Mon, 16 Mar 2026 18:09:35 +0000</pubDate>
      <link>https://dev.to/jerrod_kim_3809262f7f2543/scraping-social-media-with-gemini-for-sentiment-analysis-1ab7</link>
      <guid>https://dev.to/jerrod_kim_3809262f7f2543/scraping-social-media-with-gemini-for-sentiment-analysis-1ab7</guid>
      <description>&lt;h1&gt;
  
  
  Scraping Social Media with Gemini for Sentiment Analysis
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Hackathon project: using &lt;strong&gt;Gemini + a user's browser&lt;/strong&gt; to analyze real sentiment hidden inside social media comment sections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;If you want to understand how people &lt;em&gt;actually&lt;/em&gt; feel about a product, brand, or topic, the best data source is often &lt;strong&gt;comment sections&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem: scraping social platforms is getting harder every year.&lt;/p&gt;

&lt;p&gt;Platforms now deploy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expensive APIs and paywalls (e.g. Reddit's API changes)&lt;/li&gt;
&lt;li&gt;aggressive bot detection&lt;/li&gt;
&lt;li&gt;rate limits and scraping prevention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Running scrapers from servers or headless browsers usually gets blocked almost immediately.&lt;/p&gt;

&lt;p&gt;So we asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if the scraper &lt;strong&gt;wasn't a bot at all — but a real user's browser?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Modern browser automation combined with &lt;strong&gt;Gemini's computer-use capabilities&lt;/strong&gt; makes that possible.&lt;/p&gt;

&lt;p&gt;A real browser session comes with some powerful advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ already authenticated to social platforms
&lt;/li&gt;
&lt;li&gt;✅ trusted by anti-bot systems
&lt;/li&gt;
&lt;li&gt;✅ capable of normal browsing behavior
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: the &lt;strong&gt;ultimate scraping environment already exists — the user's browser&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Textpot&lt;/strong&gt; leverages a user's browser to explore social media and collect comments for sentiment analysis.&lt;/p&gt;

&lt;p&gt;The architecture separates &lt;strong&gt;browser control&lt;/strong&gt; from &lt;strong&gt;AI decision making&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The system runs a loop (up to 3 turns) to navigate a page and analyze comments:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extension captures screenshot&lt;/li&gt;
&lt;li&gt;Screenshot POSTed to Cloud Run&lt;/li&gt;
&lt;li&gt;Gemini analyzes the screen and returns the next action&lt;/li&gt;
&lt;li&gt;Extension executes the action via CDP&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a feedback loop where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;browser acts&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Gemini &lt;strong&gt;decides what to do next&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows Textpot to automatically explore comment sections and extract sentiment insights.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The system is split into two parts.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Chrome Extension (User Machine)
&lt;/h3&gt;

&lt;p&gt;The extension &lt;strong&gt;owns the browser&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opens the extension popup&lt;/li&gt;
&lt;li&gt;attaches to the page via &lt;strong&gt;Chrome DevTools Protocol (CDP)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;performs actions (click, scroll, keypress)&lt;/li&gt;
&lt;li&gt;captures screenshots of the page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs directly inside the &lt;strong&gt;user's local Chrome session&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Cloud Run Backend
&lt;/h3&gt;

&lt;p&gt;The backend &lt;strong&gt;owns the AI logic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;receives screenshots from the extension&lt;/li&gt;
&lt;li&gt;sends them to &lt;strong&gt;Gemini&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;stores conversation history across turns&lt;/li&gt;
&lt;li&gt;returns the next action to perform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Importantly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The backend &lt;strong&gt;never directly touches the browser.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It only tells the extension &lt;strong&gt;what action to perform next&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Architecture Works
&lt;/h2&gt;

&lt;p&gt;Splitting responsibilities between &lt;strong&gt;browser&lt;/strong&gt; and &lt;strong&gt;AI backend&lt;/strong&gt; solves a major scraping problem.&lt;/p&gt;

&lt;p&gt;The browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;has &lt;strong&gt;real authentication&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;has &lt;strong&gt;real cookies&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;behaves like a &lt;strong&gt;normal user&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloud Run simply tells it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Click here."&lt;br&gt;&lt;br&gt;
"Scroll down."&lt;br&gt;&lt;br&gt;
"Open this comment thread."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This approach bypasses many of the traditional scraping roadblocks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges We Ran Into
&lt;/h2&gt;

&lt;p&gt;The first version of Textpot looked very different.&lt;/p&gt;

&lt;p&gt;Initially we built it as a &lt;strong&gt;web app running a headless browser on Cloud Run&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That approach quickly failed.&lt;/p&gt;

&lt;p&gt;Problems included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bot detection blocking the browser&lt;/li&gt;
&lt;li&gt;authentication failures&lt;/li&gt;
&lt;li&gt;restricted access to social media pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix was simple but important:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Move the browser to the user.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once we pivoted to a &lt;strong&gt;Chrome extension&lt;/strong&gt;, the system could use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real user sessions&lt;/li&gt;
&lt;li&gt;real cookies&lt;/li&gt;
&lt;li&gt;normal browsing behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That solved most of the blocking issues immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next for Textpot
&lt;/h2&gt;

&lt;p&gt;Next steps include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;polishing the extension UX&lt;/li&gt;
&lt;li&gt;improving comment extraction&lt;/li&gt;
&lt;li&gt;adding deeper sentiment analysis&lt;/li&gt;
&lt;li&gt;launching on the &lt;strong&gt;Chrome Web Store&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because part of the system runs on &lt;strong&gt;Google Cloud Run&lt;/strong&gt;, we'll also need to figure out a sustainable &lt;strong&gt;pricing model&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AI-powered browser automation opens up a new way to interact with the web.&lt;/p&gt;

&lt;p&gt;Instead of fighting platform restrictions with bigger scrapers, we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use &lt;strong&gt;real browsers&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;keep &lt;strong&gt;AI in the backend&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;let models like &lt;strong&gt;Gemini decide how to navigate&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For sentiment analysis and market research, this could unlock data sources that are otherwise extremely difficult to access.&lt;/p&gt;




&lt;p&gt;If you're experimenting with &lt;strong&gt;Gemini computer use&lt;/strong&gt;, &lt;strong&gt;browser automation&lt;/strong&gt;, or &lt;strong&gt;AI agents&lt;/strong&gt;, I'd love to hear how you're approaching it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gemini</category>
      <category>socialmedia</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>My First GKE Experience - GKE Turns 10 Hackathon.</title>
      <dc:creator>Jerrod Kim</dc:creator>
      <pubDate>Sun, 21 Sep 2025 00:49:31 +0000</pubDate>
      <link>https://dev.to/jerrod_kim_3809262f7f2543/my-first-gke-experience-gke-turns-10-hackathon-1m9f</link>
      <guid>https://dev.to/jerrod_kim_3809262f7f2543/my-first-gke-experience-gke-turns-10-hackathon-1m9f</guid>
      <description>&lt;p&gt;&lt;strong&gt;This post is about creating a project for the GKE Turns 10 Hackathon - &lt;a href="https://gketurns10.devpost.com/" rel="noopener noreferrer"&gt;https://gketurns10.devpost.com/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the GKE Turns 10 Hackathon, I decided to extend Bank of Anthos with a retirement planning dashboard. (Bank of Anthos is a sandbox project you can run on GKE.)The idea was to give users a way to check their savings goals, get AI-powered advice from Google Gemini, and even look up side jobs through the Adzuna API. And I also did execute! &lt;/p&gt;

&lt;h2&gt;
  
  
  As a starter..
&lt;/h2&gt;

&lt;p&gt;If you're new to GKE in general, this is a rough explanation of how the GKE deployment process works: You create a docker image of your code/microservice -&amp;gt; Then you push the docker image to Google Cloud's Artifact Registry -&amp;gt; Then you run the "kubectl apply" terminal command to deploy to GKE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some stuff I went through:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The app itself wasn’t the hard part—the real challenge was getting it running smoothly on Google Kubernetes Engine (GKE). Along the way, I hit several bumps:&lt;/li&gt;
&lt;li&gt;Secrets not set up → My pods wouldn’t start because I forgot to apply the JWT secret. This was in the readme.md in the root directory. I'm the one who missed it.&lt;/li&gt;
&lt;li&gt;Cluster too small → Some services stayed in Pending until I scaled the cluster up. Wasn't expecting services to &lt;strong&gt;stop working&lt;/strong&gt; when I lowered the cpu requirements in the yaml files because GKE costs were higher than I had anticipated..!&lt;/li&gt;
&lt;li&gt;Docker image mismatch → I built locally on a Mac (ARM) but GKE nodes use AMD64. Quick fix here.&lt;/li&gt;
&lt;li&gt;Service exposure confusion → My dashboard worked internally, but I couldn’t access it until I switched the service type from ClusterIP to LoadBalancer. Even as a rookie, I can see this being a rookie mistake.&lt;/li&gt;
&lt;li&gt;Each issue was frustrating in the moment, but they helped me get closer to understanding GKE.. hopefully it did:)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So in the end..
&lt;/h2&gt;

&lt;p&gt;Anway, I ended up being able to build a dashboard that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hooks directly into the Bank of Anthos frontend&lt;/li&gt;
&lt;li&gt;Provides personalized AI retirement advice&lt;/li&gt;
&lt;li&gt;Surfaces job listings to boost income&lt;/li&gt;
&lt;li&gt;Runs consistently on GKE (GKE is &lt;strong&gt;expensive&lt;/strong&gt; for a solo dev I gotta say. Good thing I got $100 credit from the hackathon but it's running out real fast)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I could see how GKE and Kubernetes are essential for large, large projects. As a solo dev, I've been mainly using things like Firebase and maybe Cloudflare. I do feel that I need to up my ante to be on the next level as a dev and a founder. I'm still too uninitiated. Still taking small baby steps:)&lt;/p&gt;

&lt;p&gt;This post was created for the purposes of entering the GKE Turns 10 Hackathon.&lt;/p&gt;

</description>
      <category>gkehackathon</category>
      <category>gketurns10</category>
    </item>
  </channel>
</rss>
