<?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: Nicholas</title>
    <description>The latest articles on DEV Community by Nicholas (@eren_poger).</description>
    <link>https://dev.to/eren_poger</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3993828%2Fc19a7c67-2e75-4dc0-85ea-b43cde21a54e.jpg</url>
      <title>DEV Community: Nicholas</title>
      <link>https://dev.to/eren_poger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eren_poger"/>
    <language>en</language>
    <item>
      <title>I think it’s time for Aster’s come back. Or just what to do when you finished your project.</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Thu, 17 Sep 2026 15:44:26 +0000</pubDate>
      <link>https://dev.to/eren_poger/i-think-its-time-for-asters-come-back-or-just-what-to-do-when-you-finished-your-project-3an5</link>
      <guid>https://dev.to/eren_poger/i-think-its-time-for-asters-come-back-or-just-what-to-do-when-you-finished-your-project-3an5</guid>
      <description>&lt;p&gt;Hey guys ;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8dtflazo3t4tiv4mkzv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8dtflazo3t4tiv4mkzv.gif" alt="Hello gif" width="360" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So as the title said I’ve finished my Music Classification project. You could check it here &lt;a href="https://github.com/kolyapisarenko/Music-Genres-Classification" rel="noopener noreferrer"&gt;Music Classification Project&lt;/a&gt;.&lt;br&gt;
Sorry that I didn’t deploy this app. I hope if someone will be interested in it, then this person will just copy my repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can I tell you?
&lt;/h2&gt;

&lt;p&gt;Actually I don’t know, this project was pretty easy, because only librosa was new for me. All the other libraries I’ve used before. Maybe I just should say the main points of how to transform data into models. I guess that will be good.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwlti5y6y7pm26g91dc9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwlti5y6y7pm26g91dc9.gif" alt="Plan gif" width="498" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First step
&lt;/h2&gt;

&lt;p&gt;Maybe it will be unexpected, but you should choose a topic in which you’re interested. I think it’s important for every project you’re working on. &lt;strong&gt;If you don’t have fun with it, then why are you doing it?&lt;/strong&gt;&lt;br&gt;
For example all my projects built on my interests and hobbies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second step
&lt;/h2&gt;

&lt;p&gt;Now, you need data. It’s good if you will find an amazing dataset for your topic, or you just could scrape all data manually. The more proper data you have, the more accurate your model will be. I mean if we only have 10 students for example and half of them are good students and the other half are bad, then how to classify an average student?&lt;/p&gt;

&lt;h2&gt;
  
  
  Third step
&lt;/h2&gt;

&lt;p&gt;Here you need to work with data I guess. Clean it, fill None values, normalize data and split data into training and test datasets. That’s easy, maybe normalization is a bit difficult, because you should choose for example between StandardScaler and MinMaxScaler. &lt;strong&gt;Also for some models you need to encode target&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final step
&lt;/h2&gt;

&lt;p&gt;Choose the right model and make it accurate. Yep there are Regression models and Classification models, and there are Linear models, ensemble models and so on. How to choose right? You need to read a bit of theory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwq3i3cdm5tvwdysc4ck8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwq3i3cdm5tvwdysc4ck8.gif" alt="Difficult choise" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;Again the title said everything already. I’m going to come back to my Aster - personal assistant project. Actually I had 3 options - Chess Project, Aster and brand new AI for Cuphead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93p4jgxip38bpxlwlsef.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93p4jgxip38bpxlwlsef.gif" alt="Cuphead gif" width="104" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I think I need to work with Aster, at least upgrade it, and it would be great to make Aster “alive”. So, for the next few weeks I’ll be writing about Aster. That’s all for today, see you guys later 😘&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>github</category>
    </item>
    <item>
      <title>Which classification have I used? As I know it should be KNN, but stuff wasn’t so easy.</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Thu, 10 Sep 2026 17:01:15 +0000</pubDate>
      <link>https://dev.to/eren_poger/which-classification-have-i-used-as-i-know-it-should-be-knn-but-stuff-wasnt-so-easy-4hd2</link>
      <guid>https://dev.to/eren_poger/which-classification-have-i-used-as-i-know-it-should-be-knn-but-stuff-wasnt-so-easy-4hd2</guid>
      <description>&lt;p&gt;Hey guys ;)&lt;/p&gt;

&lt;p&gt;This time I also don’t have much to say. But let’s try to explore some interesting things that happened this week.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff53hmygttskq2mlizxzx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff53hmygttskq2mlizxzx.gif" alt="Hello gif" width="640" height="332"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Back to Uni
&lt;/h2&gt;

&lt;p&gt;So, the most important reason why I have less time to work is University. But I must confess that I heard something that gave me more power to continue my journey. So, this week I worked on Music Classification only yesterday. On Monday and Tuesday I was just bored or something like that and didn't write any code. Then one lecture in uni gave me motivation and understanding that there are still so many things in the world that I don’t know yet. Maybe it’s the reason why I’m moving forward.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe7nmp9agqyi0ls1n5ah3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe7nmp9agqyi0ls1n5ah3.gif" alt="Deep thoughts" width="374" height="374"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Music Classifier
&lt;/h2&gt;

&lt;p&gt;Now I could say that the project is almost done. Yep it’s kinda strange, but learning models is the easiest part. So first I trained the KNN model, when I got 68% test accuracy I decided to change model. The first option was Random Forest, it gave me 78% accuracy. +10%, pretty impressive, but I still wanted more. So then I chose the XGBoost model. And finally I got 85% accuracy. Yep maybe it’s not perfect, maybe it would be great to gain 90% accuracy, but for now I think the model is pretty accurate. Here I’ll add some images (Confusion matrix and Top-15 important features).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5y3am16lrce2qn5o4ufh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5y3am16lrce2qn5o4ufh.png" alt="Confusion matrix" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmgl3t8go7g078olwzhld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmgl3t8go7g078olwzhld.png" alt="Feature importance" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So what do I need to do? Today I wanna finish the main part of the project. Write predict.py which will load trained models, extract all features, normalize features, and predict genres. And next week I need to write README and add some conclusions into notebook. Maybe compare KNN, Random Forest and XGBoost. I don't know yet what I’ll write there.&lt;/p&gt;




&lt;h2&gt;
  
  
  May I know your favorite songs?
&lt;/h2&gt;

&lt;p&gt;I just wanna test my classifier later, so it’d be great to check it on your favorite songs. Yep, there will be one problem, my classifier only knows 10 genres, all of them you could see on the Confusion Matrix plot.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzjp61yk52om6gj9r32r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flzjp61yk52om6gj9r32r.gif" alt="Curious me" width="436" height="498"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;So it’s all for today, see you later guys 😘&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Summer is over. But I continue my funny journey</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Thu, 03 Sep 2026 17:02:00 +0000</pubDate>
      <link>https://dev.to/eren_poger/summer-is-over-but-i-continue-my-funny-journey-8n</link>
      <guid>https://dev.to/eren_poger/summer-is-over-but-i-continue-my-funny-journey-8n</guid>
      <description>&lt;p&gt;Hey guys ;)&lt;br&gt;
Summer ended, but September's days are still so hot. Hope you’re doing well.&lt;/p&gt;

&lt;p&gt;So I actually don’t remember if I told you about my new project in my last post. Maybe I only said that it will be a KNN based project. It was hard to choose an interesting project to build. I mean I don’t wanna do something big, because I still should finish the Chess Project. So after a few hours of struggling and conversations with ChatGPT I decided that I should try to build Music Genre Classification and for interface use Streamlit.&lt;/p&gt;

&lt;p&gt;So actually I don’t know what to say, because this project is much easier than the previous. I’ll use GTZAN Dataset for training KNN, yesterday I built a feature extractor from an audio file. Today I added the Streamlit interface. Next week I’ll train KNN, save it using Joblib and then launch a full pipeline. So as I said, the project is pretty easy and I don’t have to say much about it. &lt;/p&gt;

&lt;p&gt;But I’d like to hear your favorite song and when the app is done, I’ll check its genre.&lt;/p&gt;

&lt;p&gt;So see you next time, hope with more interesting info 😘&lt;/p&gt;

</description>
      <category>python</category>
      <category>knn</category>
    </item>
    <item>
      <title>Unexpected, but Secret Santa is cooked. Let's explore bit more about role of Django here.</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Thu, 27 Aug 2026 10:42:15 +0000</pubDate>
      <link>https://dev.to/eren_poger/unexpected-but-secret-santa-is-cooked-lets-explore-bit-more-about-role-of-django-here-2bn3</link>
      <guid>https://dev.to/eren_poger/unexpected-but-secret-santa-is-cooked-lets-explore-bit-more-about-role-of-django-here-2bn3</guid>
      <description>&lt;p&gt;Hey guys ;)&lt;br&gt;
Hope you’re doing well, summer is almost over and some of us will go back to University (for example me) or maybe even some of us will even go to school. My summer was pretty good, actually I’ve finished 2 projects and 1 is in the final stage (yep I still remember about the Chess Project 😂). Okay, let’s move to the main topic of this post.&lt;/p&gt;


&lt;h2&gt;
  
  
  Secret Santa done.
&lt;/h2&gt;

&lt;p&gt;Actually almost done, I mean all logic and design were cooked, there is still one task - README.md. I’m going to do it after finishing this post. Secret Santa now available for everyone, you could access it via this link &lt;a href="https://secret-santa-baf4.onrender.com/" rel="noopener noreferrer"&gt;https://secret-santa-baf4.onrender.com/&lt;/a&gt;&lt;br&gt;
&lt;em&gt;But you need to wait about 50 secs because I deployed it with free Render trial (at least deployed, not localhost XD )&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What can my Secret Santa do ?
&lt;/h2&gt;

&lt;p&gt;Okay, Santa working with a simple data pipeline, first you enter all required data and then just send an email. Now more detailed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Participants input with 3 modes:

&lt;ul&gt;
&lt;li&gt;manual input mode;&lt;/li&gt;
&lt;li&gt;file input mode;&lt;/li&gt;
&lt;li&gt;Faker script generator mode;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Party general info (name, time, date, location, host email)&lt;/li&gt;
&lt;li&gt;Results and sending email&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What more interesting &lt;strong&gt;All this you could do for free&lt;/strong&gt;, even sending the emails.&lt;/p&gt;


&lt;h2&gt;
  
  
  More technical info about Django
&lt;/h2&gt;

&lt;p&gt;I couldn’t say that after this little project I became a super Django user, I’m a beginner (I even didn’t finish my tutorial). But I’ll tell you some important stuff that I’ve learned.&lt;br&gt;
In a previous post I described basics like views and urls in general. Today I wanna talk about how Django sees data.&lt;/p&gt;

&lt;p&gt;So basically when we talk about big websites it has a database. Django allows work with different databases and changes nothing in logic. So for working with data usually you need 2 things - &lt;strong&gt;model and form&lt;/strong&gt;. I think all we know is what it is. &lt;strong&gt;The model describes something and how it should look, form could be built on this model and then you just create form inside of view and transfer it to the frontend&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But what to do, if I don’t need to save my data to the database. We use for it sessions(cookies). &lt;strong&gt;My pipeline is simple, I collect data from participants form, save it to request.sessions["participants"], do the same for party info and in result page use pop method, which clear all sessions data after using it&lt;/strong&gt;. So what I’ve done in Secret Santa.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created forms with specific fields (like CharField, IntegerField, FileField and EmailField). All fields are available in Django.Forms.&lt;/li&gt;
&lt;li&gt;Import created forms in views.py. We need to create 2 forms. One for the POST method and the other just an empty form. And obviously we need to add our form into the context dictionary.&lt;/li&gt;
&lt;li&gt;And finally we could access forms in HTML.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You could create Forms based on Models (for this in Form Class after all fields add Meta Class) or just ordinary Form. The difference in Model form will be very strict, if you change Form and forgot to change Model then you’ll get some troubles.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to send an email ?
&lt;/h2&gt;

&lt;p&gt;Actually I thought that it would be the hardest part of the project. But I was wrong. First of all the situation is similar to databases. You write logic once, then just change settings in settings.py. So what do we need to send an email? &lt;/p&gt;

&lt;p&gt;We could use many different APIs, like Resend or Brevo. But the problem is that you need an email domain for this. I don’t have one. But you could still do something.&lt;br&gt;
&lt;strong&gt;And it’s Google&lt;/strong&gt;. All you need is to add 2 step verification for your account and create an App and get a password for it. Save your email (&lt;em&gt;account where you created the App&lt;/em&gt;) and password (usually 16 symbols) to the .env file, and that’s all. Now you could use @gmail.com domain for sending email for everyone you want. So it’s looks like that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;from: &lt;a href="mailto:your_email@gmail.com"&gt;your_email@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;to: &lt;a href="mailto:secret_santa_participant@gmail.com"&gt;secret_santa_participant@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;reply_to: &lt;a href="mailto:party_host@gmail.com"&gt;party_host@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;It was really easier than I thought. I was planning to finish Secret Santa and some KNN projects by the summer end. But the KNN project I’ll start next week, I hope it will be interesting, and the more important it will be enough for getting my first job, yep I wanna try my luck on freelance.&lt;/p&gt;

&lt;p&gt;So, see ya in September, hope you have a nice summer.&lt;br&gt;
Oh yeah, I’ll add a link to my X post with 3 videos, where I tried to show Secret Santa, but there were 2 fails 😂.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-2092911178183766208-374" src="https://platform.twitter.com/embed/Tweet.html?id=2092911178183766208"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2092911178183766208-374');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2092911178183766208&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Is it possible to code while learning something new? Of course, it’s more fun.</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Wed, 19 Aug 2026 16:08:37 +0000</pubDate>
      <link>https://dev.to/eren_poger/is-it-possible-to-code-while-learning-something-new-of-course-its-more-fun-1lhd</link>
      <guid>https://dev.to/eren_poger/is-it-possible-to-code-while-learning-something-new-of-course-its-more-fun-1lhd</guid>
      <description>&lt;p&gt;Hey guys;)&lt;br&gt;
Long time no see.&lt;/p&gt;

&lt;h2&gt;
  
  
  General
&lt;/h2&gt;

&lt;p&gt;Actually I wanna change my blog format. Now I’m planning to do a &lt;strong&gt;few posts on X, and then 1-2 times per week do a big post here&lt;/strong&gt;. And I wanna try not only to show what I’ve done, but also how to do it. Some kind of teaching I don’t know yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  New project. What is it about?
&lt;/h2&gt;

&lt;p&gt;Okay, so since my last post I’ve finished Yakaboo Sales Analysis. You could check it here - &lt;a href="https://github.com/kolyapisarenko/Yakaboo-Books-Sales-Analyser" rel="noopener noreferrer"&gt;Yakaboo Project&lt;/a&gt;.&lt;br&gt;
The new project is basic - it’s Secret Santa. But if I wrote just an algorithm it wouldn't be so interesting. So I decided to add Django here and make some websites. But here was a problem, I’ve never worked with Django before. But thanks to &lt;strong&gt;Corey Schafer&lt;/strong&gt; I learnt some basics and even built something. &lt;em&gt;I’ll show the video in the end&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A bit about Django
&lt;/h2&gt;

&lt;p&gt;So it’s a great framework which allows us to build websites using Python. In the beginning I thought that I’ll explain almost everything that I’ve learnt, but I don’t think it’s necessary. So in short, to begin writing you should do&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a project directory and venv (of course you could do it without venv).&lt;/li&gt;
&lt;li&gt;Install Django.&lt;/li&gt;
&lt;li&gt;Create the project using django-admin startproject name_of_project.&lt;/li&gt;
&lt;li&gt;Create an app using django-admin startapp name_of_app&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After that we could do what we wanted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Another amazing library
&lt;/h2&gt;

&lt;p&gt;One of my favorite libraries is Faker, which allows generating data. I used it for creating participants (their full name, email and wishlist) for a party. That was the easiest part, after that I started exploring Django. So, I’ll skip all the theories and say only the most important.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To write html and css inside the app directory you need to create templates (for html) and static (for css and js, about js I’m not sure), and inside these directories create a folder with the same name as app name.&lt;/li&gt;
&lt;li&gt;Inside the views.py file you create a function which returns html response and gives arguments which we could use inside html.&lt;/li&gt;
&lt;li&gt;After creating views functions you could use it in the url of the app, add a pattern to the project and don’t forget to add the app into project settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Okay now it’s time to watch some results for now.&lt;br&gt;
&lt;a href="https://x.com/NicholaDevua/status/2090096246950187072?s=20" rel="noopener noreferrer"&gt;Link to video&lt;/a&gt;&lt;br&gt;
See you in the next post. I hope it was interesting to read.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>django</category>
    </item>
    <item>
      <title>A long break from post, but I’ve cocked some stuff like Walter White did.</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Wed, 12 Aug 2026 19:11:00 +0000</pubDate>
      <link>https://dev.to/eren_poger/a-long-break-from-post-but-ive-cocked-some-stuff-like-walter-white-did-41ad</link>
      <guid>https://dev.to/eren_poger/a-long-break-from-post-but-ive-cocked-some-stuff-like-walter-white-did-41ad</guid>
      <description>&lt;p&gt;Hey guys ;)&lt;br&gt;
It’s been a while since my last post. Actually I was a bit busy and forgot to write about progress. And this time I really have what to say. So what happened in short?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scraper ended data extending.&lt;/li&gt;
&lt;li&gt;Pageviews script added pageview info for all 6k books.&lt;/li&gt;
&lt;li&gt;My first analysis notebook is done.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;So, here is a fragment of my extended data before pageviews.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3702itqg4b33ctb9t84k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3702itqg4b33ctb9t84k.png" alt="Extended data" width="799" height="437"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;And here is a fragment of dataset &lt;strong&gt;after pageviews&lt;/strong&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbvc76cdy2blzdtqtmci1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbvc76cdy2blzdtqtmci1.png" alt="Pageviews extending" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Is pageview extending false?
&lt;/h2&gt;

&lt;p&gt;As I said in a previous post, sometimes Wikipedia pageviews give some nonsense data, and it’s true. Barely it gives an exact match, more often it gives the author page, and most of the time it gives 0 or some nonsense. &lt;br&gt;
When I’ll start my second analysis notebook, &lt;strong&gt;I’ll do something about that&lt;/strong&gt;, &lt;em&gt;maybe erase some data, for example if the saved Wiki title is in author or in title, I don’t know yet&lt;/em&gt;.&lt;br&gt;
Here is my pageview script fragment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktbzfoudyyniizhgz3xa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktbzfoudyyniizhgz3xa.png" alt="Pageviews code fragment" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fww1byqjeq8jbkkwx4g97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fww1byqjeq8jbkkwx4g97.png" alt="Pageviews code fragment" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  First conclusions
&lt;/h2&gt;

&lt;p&gt;When I began this project I asked a question, do people read less nowadays? Actually I don’t know. According to my data I couldn’t say that people read less or people read more nowadays. All I could say it’s that people still read some books indeed. &lt;br&gt;
&lt;strong&gt;Again all ,my conclusion here will be true according to my scrapped data, custom standard of books popularity and validity for Ukraine reading culture.&lt;/strong&gt; &lt;br&gt;
So, people prefer physical books more, the most popular author is Hiro Mashima, because of the number of his manga volumes. The most popular publishers are those who produce manga and comics, again because of the number of volumes and parts. The amount of books released in the last 10 years is bigger than the amount of books released 10-20+ years ago. And the most popular categories are manga, comics, autobiography and memoirs, self-improvement and children literature. Charts from notebook I’ll add too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F94b5wlqp6dwbzuxt6trr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F94b5wlqp6dwbzuxt6trr.png" alt="Format chart" width="483" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfkb64qy1ewa3wb90s5g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvfkb64qy1ewa3wb90s5g.png" alt="Authors chart" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fevdk3ea52hznllnekr4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fevdk3ea52hznllnekr4f.png" alt="Publishers chart" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3n4j73ioywfyc8cdigaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3n4j73ioywfyc8cdigaj.png" alt="Release year chart" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fppbb2iykxu0ab6wnq0ri.png" alt="Categories chart" width="800" height="709"&gt;
&lt;/h2&gt;

&lt;p&gt;What do I mean by using the words popular or famous? So in my dataset there are 6k books. And for each analysis I’ve used count. So the most popular author is who has the most amount of books. And I should remind you, that it isn’t some 6k books, it's the best books according to my custom standard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next step
&lt;/h2&gt;

&lt;p&gt;I think the next step is going to be the last. I don’t know, maybe I’ll do all the code tomorrow, or next week. So what do I need to do?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyse books, their popularity according to standard and to pageviews.&lt;/li&gt;
&lt;li&gt;Write something between code.&lt;/li&gt;
&lt;li&gt;Write final conclusion and README.md (with some screenshots to show what this project is about very quickly, without opening notebooks).&lt;/li&gt;
&lt;li&gt;Push and commit everything.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>books</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>What do marketing tags, broken author arrays, and an unexpected email from Derek Sivers have in common?</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Sat, 01 Aug 2026 13:38:41 +0000</pubDate>
      <link>https://dev.to/eren_poger/what-do-marketing-tags-broken-author-arrays-and-an-unexpected-email-from-derek-sivers-have-in-165c</link>
      <guid>https://dev.to/eren_poger/what-do-marketing-tags-broken-author-arrays-and-an-unexpected-email-from-derek-sivers-have-in-165c</guid>
      <description>&lt;p&gt;Hey guys 👋&lt;/p&gt;

&lt;p&gt;I don't have a massive technical feature to showcase today, but I do have a solid batch of data pipeline updates, a bug fix story, and a pretty inspiring personal highlight.&lt;/p&gt;

&lt;p&gt;While refining the secondary parser for the Ukrainian book market, I ran into classic data pollution issues, stripped out marketing noise, and got a reminder of why building side projects should be fun.&lt;/p&gt;

&lt;p&gt;Here is the weekly progress report!&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing the "Comma-in-Category" Bug
&lt;/h2&gt;

&lt;p&gt;After rewriting the extended scraper, I noticed a subtle data formatting bug during early inspection.&lt;/p&gt;

&lt;p&gt;Certain books on retail platforms list multiple authors. My initial DOM selection logic grabbed only the primary author string. However, because of how the HTML elements were structured, the trailing author separators (commas and secondary tags) bled directly into the Category column!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Corrupted: Category = ", Fiction, Bestsellers"
Cleaned:   Category = "Fiction"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To fix this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updated the scraper logic to properly parse multi-author arrays.&lt;/li&gt;
&lt;li&gt;Manually sanitized and patched 20 affected JSON objects in the clean dataset to keep data integrity intact.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stripping "Garbage" Categories &amp;amp; Preprocessing
&lt;/h2&gt;

&lt;p&gt;I’m currently finishing up the final data preparation script, specifically handling empty values (&lt;code&gt;NaN&lt;/code&gt;s) and filtering non-standard categories.&lt;/p&gt;

&lt;p&gt;Originally, I expected platform categories to function purely as literary sub-genres (e.g., Sci-Fi, Historical Fiction, Biography). However, e-commerce platforms heavily mix genre metadata with promotional marketing tags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;"Reader's Choice"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"Top Bestsellers 2023"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"Must-Read Recommendations"&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tags provide zero value when trying to analyze actual genre trends over time. My preprocessing script is currently dropping these noise categories along with empty rows to leave a pure, genre-focused analytical dataset.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzdt3sib88yyo4jrzkpcm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzdt3sib88yyo4jrzkpcm.png" alt="Code for cleaning categories" width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyt74sf5m2ngv1sv4zdhf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyt74sf5m2ngv1sv4zdhf.png" alt="Jsonl fragment" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  An Unexpected Reply from Derek Sivers
&lt;/h2&gt;

&lt;p&gt;On a non-technical note, something really cool happened this week.&lt;/p&gt;

&lt;p&gt;I recently finished reading &lt;em&gt;Anything You Want&lt;/em&gt; by Derek Sivers-a short, brilliant book about entrepreneurship, independence, and doing things your own way. At the end of the book, Derek invites readers to send him an email, introduce themselves, and share what they are working on.&lt;/p&gt;

&lt;p&gt;I decided to write to him, not really expecting a reply. To my surprise, he actually responded! He shared some thoughtful feedback and even recommended a few more great books to check out.&lt;/p&gt;

&lt;p&gt;It was a great reminder that building side projects-whether it's a Python chess engine or a market scraper-should come from a place of curiosity and freedom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuvv0xi3rsbguo3aj68pn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuvv0xi3rsbguo3aj68pn.png" alt="Email from Derek" width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Finishing the final &lt;code&gt;NaN&lt;/code&gt; drop and category mapping pass in Pandas.&lt;/li&gt;
&lt;li&gt;Running exploratory data analysis (EDA) to generate our very first trend charts.&lt;/li&gt;
&lt;li&gt;Starting one of Derek's recommended books during my 3-day rest period!&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Have you ever reached out directly to an author or creator who inspired you? How do you handle promotional marketing tags when cleaning e-commerce data? Let's chat in the comments below! 👇&lt;/p&gt;

</description>
      <category>python</category>
      <category>pandas</category>
      <category>datascience</category>
      <category>showdev</category>
    </item>
    <item>
      <title>No APIs?! Analysis is almost here, but I’ve mistaken again.</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Wed, 29 Jul 2026 14:56:14 +0000</pubDate>
      <link>https://dev.to/eren_poger/no-apis-analysis-is-almost-here-but-ive-mistaken-again-54k0</link>
      <guid>https://dev.to/eren_poger/no-apis-analysis-is-almost-here-but-ive-mistaken-again-54k0</guid>
      <description>&lt;p&gt;"Why hit API request limits for 111,000 books when a single log10 formula and direct web scraping can solve the problem?"&lt;/p&gt;

&lt;p&gt;Hey guys ;)&lt;/p&gt;

&lt;p&gt;Looks like my focus is completely locked on data analysis right now. I can’t help it-this project is just too fun.&lt;/p&gt;

&lt;p&gt;Over the past two or three posts, I kept promising that I would enrich my book dataset using the Google Books API and OpenLibrary. Well... forget about the APIs.&lt;/p&gt;

&lt;p&gt;After wrestling with rate limits, poor metadata quality, and HTML structures all week, I dropped the APIs entirely and built my own data enrichment pipeline. Here is how it happened, why I deleted 1,451 scraped books today, and what’s coming next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem with Books APIs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I started planning the data enrichment phase for my 111,000 unique scraped books, I ran into two massive brick walls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Books API Limits:&lt;/strong&gt; The free tier caps you at 1,000 requests per day. At that rate, enriching 111k books would take over three months (I know about payment account and increasing of limits).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenLibrary Limitations:&lt;/strong&gt; It handles Ukrainian literature poorly without exact ISBN matches. Title and Author search combinations gave way too many false positives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I quickly realized I didn't actually need all 111,000 books. Thousands of them had zero reviews, no ratings, and no active search interest. Processing them was just adding noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filtering the Catalog and Popularity Formula&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To isolate the most relevant titles, I designed a custom metric to score and rank the entire catalog:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;popularity_rating = log10(amount_of_reviews + 1) * rating&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Using the logarithmic scale prevents titles with hundreds of reviews from completely breaking the ranking curve while still giving heavy weight to actual reader engagement.&lt;/p&gt;

&lt;p&gt;This formula immediately isolated ~3,000 highly active titles. I expanded the threshold to capture the top 6,000 books for the final analytical sample.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parsing Metadata Directly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To analyze publishing trends over time, I needed the exact publication year for a specific edition, not just the general first release year of a work.&lt;/p&gt;

&lt;p&gt;To get that accuracy from APIs, I would need to parse the book's individual URL anyway to extract its ISBN. That's when the realization hit me: If I'm already scraping the specific book pages for ISBNs, why not just scrape the missing metadata directly from Yakaboo?&lt;/p&gt;

&lt;p&gt;So from Monday until yesterday, I wrote a dedicated secondary parser to process my top 6,000 URL list, extract extended properties, and map them into structured category buckets.&lt;/p&gt;

&lt;p&gt;Here is my best books selection code&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqt7kctazp3xfxmvxkhsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqt7kctazp3xfxmvxkhsg.png" alt="Best books selection" width="799" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is scraper fragment&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe49xyn6za1cl0jhe92qw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe49xyn6za1cl0jhe92qw.png" alt="Scraper fragment" width="799" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And how I deal with categories for final dataset preprocessing&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bs5vhls7ny6gaaiwg7b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bs5vhls7ny6gaaiwg7b.png" alt="Categories preprocessing" width="799" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The HTML Trap and deleting 1,451 Books&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It wouldn't be a real project without a good mistake.&lt;/p&gt;

&lt;p&gt;While running the extended parser, I noticed that Yakaboo's HTML structure reuses generic CSS classes across different metadata blocks while hiding or omitting unique element IDs. Because of a misplaced selector logic, my parser was extracting Author names and saving them into the Publisher field. 😅&lt;/p&gt;

&lt;p&gt;After 1,451 books were parsed, I caught the bug, wiped the corrupted JSON file, and fixed the DOM selector.&lt;/p&gt;

&lt;p&gt;Today, I’m re-running the script on the top 6,000 clean URLs. The most important lesson in Data Engineering: never give up, even when you have to wipe your output and start over!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary &amp;amp; What's Next&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; All changes are finally committed and pushed! I'm much more cautious here than in my Chess project, pushing only when the pipeline logic is 100% verified.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current Task:&lt;/strong&gt; Re-running the extended parser for the top 6k books without the Author/Publisher swap bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next Goal:&lt;/strong&gt; Data cleaning, category normalization, and generating our first analytical charts to answer if people are reading fewer books over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have you ever built a custom metric to downsample a massive dataset? What’s your worst HTML scraping horror story? Let’s chat in the comments! 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;#python #datascience #webscraping #pandas #showdev&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>pandas</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Weekends with translator for book analysis</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Sat, 25 Jul 2026 11:29:37 +0000</pubDate>
      <link>https://dev.to/eren_poger/weekends-with-translator-for-book-analysis-21bm</link>
      <guid>https://dev.to/eren_poger/weekends-with-translator-for-book-analysis-21bm</guid>
      <description>&lt;p&gt;Hey guys ;)&lt;/p&gt;

&lt;p&gt;Today I’m going to tell you about some progress in books analysis and my plans for the weekend. Let’s start.&lt;/p&gt;

&lt;p&gt;So from my previous post, I’ve been working with the author translation problem. What is it? Okay, so for extending books data I should use some API, and for that I need an ISBN that will give a certain book with 99% accuracy, or use a Title + Author combination. When a book is from a Ukrainian publisher, it will find the book with 80-90% accuracy. But what happens if the book is from a foreign publisher? Well, in fact, the accuracy will definitely be less.&lt;/p&gt;

&lt;p&gt;Another problem was the amount of unique books that I parsed from 16 categories. That amount surprised even me: &lt;strong&gt;117,000 unique books&lt;/strong&gt; and &lt;strong&gt;63,000 unique foreign authors&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;So before I found out the exact amount of unique books, I wrote a script based on the &lt;code&gt;deep-translator&lt;/code&gt; library (Google Translator). My first few requests were done without a rate limit, so my IP got blocked. After that, I added &lt;code&gt;time.sleep(2)&lt;/code&gt;. Even after adding a dictionary for saving unique authors and reducing the number of requests, the execution time was too long - like 8 hours or more.&lt;/p&gt;

&lt;p&gt;After that, I found an interesting library called &lt;code&gt;argostranslate&lt;/code&gt;. The main difference is that it’s an &lt;strong&gt;offline library&lt;/strong&gt;, and it works entirely on laptop resources. The process of translating took only &lt;strong&gt;1h 30 min to 2 hours&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Though someone forgot about saving! For Parquet files, Python needs the &lt;code&gt;pyarrow&lt;/code&gt; library. So I installed &lt;code&gt;pyarrow&lt;/code&gt; and will start the translation process on Monday.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Okay, now about some plans. Of course, for book analysis, the next step after translation is working with an API. Now I’m thinking about a few variants:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Google Books API:&lt;/strong&gt; With an ordinary free account, I have only 1,000 requests per day. If I connect a payment account, I’ll get 50,000 requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Library API:&lt;/strong&gt; Free, but this API doesn’t have much info about Ukrainian publishers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the best option could be Google Books API. But that’s for next week! &lt;/p&gt;

&lt;p&gt;Now it's the weekend, so I can rest, play games, and watch something interesting. Speaking of watching, first I’m going to watch some Django tutorials (because in the future I’ll definitely need it) and maybe something else.&lt;/p&gt;

&lt;p&gt;Have a great weekend!&lt;br&gt;
&lt;em&gt;#python, #dataanalysis, #learning, #buildinpublic&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>learning</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Building a Chess AI &amp; Book Scraper - Part 5: Memory-Efficient JSON Loading &amp; Switching to a 4/3 Work Balance</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Thu, 23 Jul 2026 09:40:32 +0000</pubDate>
      <link>https://dev.to/eren_poger/building-a-chess-ai-book-scraper-part-5-memory-efficient-json-loading-switching-to-a-43-24no</link>
      <guid>https://dev.to/eren_poger/building-a-chess-ai-book-scraper-part-5-memory-efficient-json-loading-switching-to-a-43-24no</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"Even when your scripts are doing the heavy lifting automatically, watching them run while trying to maintain a 6/1 schedule will burn you out."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hey guys ;)&lt;/p&gt;

&lt;p&gt;I’m posting a day later than usual today (Thursday instead of Wednesday), and honestly, that’s part of the update. Over the past few weeks, I’ve been living in a 6 days on, 1 day off routine. When that single day off finally arrived, I felt an overwhelming pressure to cram in every missed habit, chore, and task. Instead of resting, I ended up feeling completely drained.&lt;/p&gt;

&lt;p&gt;So, I’m changing my framework: I’m moving to a &lt;strong&gt;4/3 schedule&lt;/strong&gt; (4 days of intense focus, 3 days of genuine rest and recovery).&lt;/p&gt;

&lt;p&gt;Here is what’s happening with my hardware, my data pipelines, and my mental bandwidth!&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory-Efficient Data Ingestion in Pandas
&lt;/h2&gt;

&lt;p&gt;On Tuesday, I officially wrapped up the main scraping phase for the Ukrainian book market. I finally ran &lt;code&gt;git push&lt;/code&gt; on the repository and started building the processing pipeline in Pandas.&lt;/p&gt;

&lt;p&gt;Instead of calling &lt;code&gt;pd.read_json()&lt;/code&gt; directly, I wrote a custom loader function using &lt;code&gt;with open()&lt;/code&gt; to stream the JSON dictionary before passing it to &lt;code&gt;pd.DataFrame()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd92rcn07ptp20rqf9jwe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd92rcn07ptp20rqf9jwe.png" alt="Function to convert Json to Pandas DataFrame" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just use &lt;code&gt;pd.read_json()&lt;/code&gt;? 🤔
&lt;/h3&gt;

&lt;p&gt;Standard &lt;code&gt;read_json()&lt;/code&gt; can be a memory hog because Pandas attempts to infer structures and allocate buffer space for the entire file at once. While my raw file is currently around 50MB, this approach guarantees that as the dataset grows (after API enrichment), my machine won't choke on RAM limits.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Case of the Missing 400 Pages
&lt;/h2&gt;

&lt;p&gt;While testing the loader function and inspecting the dataset using &lt;code&gt;.head()&lt;/code&gt;, I noticed a weird anomaly: the top entries were all children's literature (which is Category #2 in my setup).&lt;/p&gt;

&lt;p&gt;Somewhere during the long automated execution, the first 400+ pages of the Fiction category evaporated! 😅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzzqzorgttwlf5mhli4xc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzzqzorgttwlf5mhli4xc.png" alt="Missing category" width="800" height="809"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So here is my immediate technical checklist for today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Re-scrape the missing Fiction category pages.&lt;/li&gt;
&lt;li&gt;[ ] Run a full deduplication pass across all 16 categories.&lt;/li&gt;
&lt;li&gt;[ ] Integrate the Google Books API to pull missing metadata (publication years, page counts, sub-genres).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ♟️ Chess RL Engine: Extending the Self-Play Deadline
&lt;/h2&gt;

&lt;p&gt;Because I’m adjusting my schedule to a 4/3 split, I am officially extending my self-play generation deadline for the chess project.&lt;/p&gt;

&lt;p&gt;People often think: &lt;em&gt;"Why are you tired? You're just sitting there watching a script scrape pages or a chess engine play itself."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s true that the CPU does the calculation, but managing routines, tracking habits and debugging background crashes. Extending the deadline gives me the breathing room to build a high-quality dataset without turning my personal projects into a stressful second job.&lt;/p&gt;

&lt;p&gt;Here is my screenshots of daily habits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsip8vbcwbfko4iygij99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsip8vbcwbfko4iygij99.png" alt="Monday habits" width="736" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lutlvagn4r0w576l0y1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4lutlvagn4r0w576l0y1.png" alt="Tuesday habits" width="659" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fss2tqw4pqph3an95qn3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fss2tqw4pqph3an95qn3r.png" alt="Wednesday habits" width="659" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm501tz77jaojpnjqcl8f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm501tz77jaojpnjqcl8f.png" alt="Thursday habits" width="659" height="594"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Let's Chat!
&lt;/h2&gt;

&lt;p&gt;How do you manage your schedule when building side projects? Have you ever had to restructure your work/rest ratio to prevent burnout? Let’s chat in the comments! 👇&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#python&lt;/code&gt; &lt;code&gt;#pandas&lt;/code&gt; &lt;code&gt;#mentalhealth&lt;/code&gt; &lt;code&gt;#datascience&lt;/code&gt; &lt;code&gt;#showdev&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Chess Engine &amp; Book Scraper - Part 4: Capping the Catalog &amp; 4,500+ Games Cooked</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Sat, 18 Jul 2026 15:45:38 +0000</pubDate>
      <link>https://dev.to/eren_poger/building-a-chess-engine-book-scraper-part-4-capping-the-catalog-4500-games-cooked-462k</link>
      <guid>https://dev.to/eren_poger/building-a-chess-engine-book-scraper-part-4-capping-the-catalog-4500-games-cooked-462k</guid>
      <description>&lt;h2&gt;
  
  
  "The data pipeline is perfectly stable, the automation is running smoothly, but I'm not pushing these changes to GitHub yet." 😅
&lt;/h2&gt;

&lt;p&gt;Hey guys ;)&lt;br&gt;&lt;br&gt;
I’m a bit tired after this week's data marathon, so I'll let the numbers and the architecture do the talking today. &lt;/p&gt;

&lt;p&gt;Over the last seven days, my workstation has been split into two universes: generating high-quality training datasets for my chess AI on a strict daily quota, and building a scalable market analysis tool for the book industry. &lt;/p&gt;

&lt;p&gt;Here is the weekly recap, some crucial optimizations, and the roadmap ahead.&lt;/p&gt;


&lt;h3&gt;
  
  
  ♟️ Chess Database: 4,500+ Games Cooked
&lt;/h3&gt;

&lt;p&gt;The automated parallel self-play setup I described in my previous post is performing beautifully. My hardware survived the daily quota of 716 games per day. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Weekly Total:&lt;/strong&gt; 6 * 716 games + 260 baseline test games = 4,556 games successfully generated and saved into the local database. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dataset is expanding exactly as planned, laying down a bulletproof foundation before I open the Jira backlog for the Reinforcement Learning model training phase.&lt;/p&gt;


&lt;h3&gt;
  
  
  📖 The Book Scraper: Smart Capping &amp;amp; Strategy
&lt;/h3&gt;

&lt;p&gt;While the chess engine runs its daily simulations, I’ve been heavily focusing on my new target platform: &lt;strong&gt;Yakaboo&lt;/strong&gt; (the largest book platform in Ukraine). The platform contains &lt;strong&gt;16 distinct main categories&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Initially, I went deep and scraped over 410 pages for the Fiction category alone. But looking at the data, I realized I needed to optimize my traversal mechanics. I decided to introduce a strict limit: &lt;strong&gt;a maximum of 200 pages per category.&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Why cap the dataset at 200 pages? 🤔
&lt;/h4&gt;

&lt;p&gt;Online retail storefronts naturally sort their catalog by popularity, search volume, and sales velocity on the initial pages. The deeper you go into page 300+, the higher the density of out-of-print titles, placeholders, or niche products. Scraping thousands of deep pages won't help us identify active consumer trends-it just adds unnecessary noise and processing bloat to the database.&lt;/p&gt;

&lt;p&gt;Here is a sneak peek of how the raw item structure looks right now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    {
        "title": "Generations in the World of Work",
        "author": "Корі Сіміллер",
        "price": "2947 грн",
        "rating": "0",
        "reviews": "0",
        "status": "Фізична книга",
        "href": "https://www.yakaboo.ua/ua/generations-in-the-world-of-work.html"
    },
    {
        "title": "Paralegal Career For Dummies",
        "author": "Ліза Зіммер Хатч",
        "price": "1832 грн",
        "rating": "0",
        "reviews": "0",
        "status": "Фізична книга",
        "href": "https://www.yakaboo.ua/ua/paralegal-career-for-dummies-3295617.html"
    },
    {
        "title": "Performance Appraisals &amp;amp; Phrases For Dummies",
        "author": "Кен Ллойд",
        "price": "1513 грн",
        "rating": "0",
        "reviews": "0",
        "status": "Фізична книга",
        "href": "https://www.yakaboo.ua/ua/performance-appraisals-phrases-for-dummies.html"
    },
    {
        "title": "A Pluralistic Approach to Leadership: Interdisciplinary Perspectives",
        "author": "Натан В. Хартер",
        "price": "3982 грн",
        "rating": "0",
        "reviews": "0",
        "status": "Фізична книга",
        "href": "https://www.yakaboo.ua/ua/a-pluralistic-approach-to-leadership-interdisciplinary-perspectives.html"
    },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And of course some screenshots&lt;/p&gt;

&lt;p&gt;It's a chess database fragment. Yep some games is short, and some is more then 100 moves.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i0rq4m3qewxeoi1qp2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i0rq4m3qewxeoi1qp2g.png" alt="Chess database fragment" width="799" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I parsed Yakaboo for 3 days and already parsed almost 23MB of data.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fil3pkbgqp3jbxyyqy9sg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fil3pkbgqp3jbxyyqy9sg.png" alt="Size of parsed data" width="768" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My laptop straggling to parse data while I'm writing posts.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F23duyqb7y05cynmwiysm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F23duyqb7y05cynmwiysm.png" alt="Btop when I run my parser script" width="800" height="806"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And what I see as a progress. Of course I could just open Chrome and watch how pages scrolling.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frwe9754arnvfcpzo34qn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frwe9754arnvfcpzo34qn.png" alt="Console logs with parsing progress" width="799" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Chess Engine in Python - Part 3: Letting the DB Cook &amp; Launching a New Book Market Scraper</title>
      <dc:creator>Nicholas</dc:creator>
      <pubDate>Thu, 16 Jul 2026 11:29:29 +0000</pubDate>
      <link>https://dev.to/eren_poger/building-a-chess-engine-in-python-part-3-letting-the-db-cook-launching-a-new-book-market-5e42</link>
      <guid>https://dev.to/eren_poger/building-a-chess-engine-in-python-part-3-letting-the-db-cook-launching-a-new-book-market-5e42</guid>
      <description>&lt;h2&gt;
  
  
  "What do you do when your laptop is too weak to train a neural network and run game simulations at the same time? I'm letting the database cook, and starting a new small project."
&lt;/h2&gt;

&lt;p&gt;Hey guys ;)&lt;br&gt;&lt;br&gt;
Sorry for being a bit late with this update, but I promise I have some very exciting news. &lt;/p&gt;

&lt;p&gt;Right now, my main Chess Project is entering a transition phase. To train a proper Reinforcement Learning model, I need a massive, high-quality dataset of self-play games. But running heavy simulations and coding at the same time is a heavy burden for my hardware. &lt;/p&gt;

&lt;p&gt;So, I made a strategic decision: &lt;strong&gt;take a 2-week development break to generate the database, while kicking off a brand new Data Science project on the side.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is what's happening on both fronts!&lt;/p&gt;




&lt;h3&gt;
  
  
  ♟️ Chess Project: The Daily Generation Quota
&lt;/h3&gt;

&lt;p&gt;To keep my laptop healthy while still building a solid dataset, I’ve set up a strict automated daily schedule. From now until &lt;strong&gt;July 27th&lt;/strong&gt;, I am running my parallelized self-play script with a specific daily quota:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;716 games per day&lt;/strong&gt; in total (distributed as 358 games per active CPU core).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The depth distribution:&lt;/strong&gt; 300 games at depth 2, 55 games at depth 3, and 3 games at depth 4.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even this "limited" run takes about &lt;strong&gt;2 hours and 30 minutes&lt;/strong&gt; every single day. Once the database reaches its target size on July 27th, I will officially close the generation phase and jump straight into the model training backlog, which is already fully planned and ready in my Jira!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6f99mewc1ufii45el7b9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6f99mewc1ufii45el7b9.png" alt="Screenshot of Jira Board for RL sprint" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📖 New Project: Analyzing the Book Industry
&lt;/h3&gt;

&lt;p&gt;While the chess script is running in the background, I decided to tackle a question that has been on my mind for a while: &lt;strong&gt;Are people actually reading fewer books nowadays?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To answer this with cold, hard data, I decided to build a custom web scraper to gather, clean, and analyze retail book market trends. &lt;/p&gt;

&lt;h4&gt;
  
  
  The Pivot: From Amazon to Yakaboo
&lt;/h4&gt;

&lt;p&gt;Initially, my first target was &lt;strong&gt;Amazon&lt;/strong&gt;. However, I quickly ran into two major roadblocks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Aggressive Anti-Bot Protection:&lt;/strong&gt; Amazon does &lt;em&gt;not&lt;/em&gt; like scrapers, making automated extraction highly inefficient without expensive proxy setups. Yep I parsed some book data from Amazon via undetected-chromedriver, but there is second problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Limitations:&lt;/strong&gt; The accessible, free-tier product details were too sparse for the deep analysis I wanted to conduct. To compare on Yakaboo there is a books cards with title, author, rating and count of reviews, of course price. So for my analysis I only need to get amount of pages(for example via GoogleBooks API or just right from Yakaboo details page) and interest in certain book(I'm planning to get it via Google Trends)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, I pivoted! My new target is &lt;strong&gt;Yakaboo&lt;/strong&gt;, the largest online book platform in Ukraine. It has incredibly rich metadata regarding which is exactly what I need. And of course their web source code is pretty easier to read.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe8i2ozi0hlflnokxd6yd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe8i2ozi0hlflnokxd6yd.png" alt="Yakaboo fiction page" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m currently writing the automation scripts combining &lt;strong&gt;Selenium&lt;/strong&gt; and &lt;strong&gt;BeautifulSoup&lt;/strong&gt; to handle paginated lists and extract the raw dataset.&lt;/p&gt;




&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;For the next two weeks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;My CPU will be sweating to generate those 716 chess games daily.&lt;/li&gt;
&lt;li&gt;I will be finalizing the Yakaboo parser, cleaning the scraped book data, and preparing my first analytical dashboard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’m super excited to share actual data insights about what people are reading (and buying) in one of the next post!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you ever had to pause a heavy computational task to prevent your machine from melting? What’s your go-to tool for bypassing anti-bot systems? Let’s share some stories in the comments!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;#python&lt;/code&gt; &lt;code&gt;#datascience&lt;/code&gt; &lt;code&gt;#webscraping&lt;/code&gt; &lt;code&gt;#chess&lt;/code&gt; &lt;code&gt;#showdev&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
