How I found an internship in one week by automating LinkedIn and ranking offers with data
How I used Selenium, analysis of 10,000 LinkedIn job offers and reverse engineering of ATS filters to get 10 interviews from only 15 emails.
Finding an internship can easily become a volume game: send a lot of CVs, open a lot of tabs and wait for somebody to answer. I approached it differently. Instead of sending hundreds of generic applications, I built a system to understand the market, detect where I had the strongest fit and contact only a very small set of high-quality opportunities.
The result was clear: in one week I got 10 interviews from only 15 emails. Out of those interviews, 5 came from offers whose official deadline had already closed. The difference was not sending more messages. It was knowing who to contact, why it made sense and how to explain my fit.
That was the origin of the LinkedIn Jobs Intelligence Bot, an automation project that combines scraping, offer analysis, ATS pattern reading and CV-based prioritization.
The problem was not finding offers
The real problem was not a lack of offers. The problem was that there were too many.
LinkedIn, job boards, ATS forms, experience filters, location constraints, languages, tech stacks, curricular internships, extracurricular internships, part-time roles, university agreements, duplicated posts, closed offers that still appear online and companies that are still hiring even when the public form no longer accepts applications.
Reviewing all of that manually does not scale. It also creates two common mistakes:
- Applying to roles where the real fit is low.
- Ignoring roles where the fit is high because the title does not look perfect.
I wanted to answer a different question: out of all available offers, where am I statistically one of the strongest candidates?
The Selenium scraper
To build my own dataset, I created a scraper with Python and Selenium. The goal was not to automate applications or send mass messages. The goal was to collect enough information to analyze the market properly.
The system extracted roughly 10,000 LinkedIn job offers in about 3 hours. For each offer, I tried to store fields such as:
- Role.
- Company.
- Location.
- Modality.
- Seniority.
- Tech stack.
- Description.
- Requirements.
- Type of internship or contract.
- Application source.
- Signals about whether the offer still looked active or already closed.
The important part was not having a large table. The important part was turning a messy list of offers into a dataset where patterns could be compared.
I am not publishing operational scraping details here because I do not want this to become a guide for abusing any platform. The relevant part of the project was not scraping for its own sake. It was using data to make better decisions during an internship search.
Understanding ATS filters
After collecting the offers, I focused on understanding how the ATS filters and forms seemed to work. Not to trick the system, but to understand which signals kept appearing in offers where my profile genuinely matched.
I analyzed thousands of descriptions looking for patterns:
- Technical keywords repeated across software, automation, data and AI internships.
- Requirements that were actually mandatory versus nice-to-have.
- Offers asking for a Computer Engineering student or university internship agreement.
- Stacks where my CV was strongest: Python, automation, scraping, n8n, Swift, web and AI workflows.
- Companies whose processes looked active even when a public form was near closing.
- Differences between the commercial title of the role and the real technical work.
- Language suggesting they wanted a junior profile with fast learning capacity.
That gave me a kind of reverse engineering of the market: not to manipulate ATS systems, but to understand which opportunities were designed for a profile like mine.
Ranking fit against my CV
The next layer was comparing each offer against my CV. The system had to answer three things:
- Whether I met the base requirements.
- Whether I could prove real experience with projects.
- Whether I had a concrete story to tell that company.
Projects mattered a lot here. It is very different to say "I know Python" and to show the SEPE algorithm, NexaVision AI workflows, a published iOS app or real automation systems.
The final ranking was not looking for easy offers. It was looking for offers where my profile had a clear advantage: a requirement I had already proven, a stack I had already used or a problem I had already solved in another context.
15 emails, 10 interviews
Once the system had prioritized the best opportunities, I did not run a mass campaign. I sent only 15 emails.
Each email was chosen for a specific reason. It was not "hello, attached is my CV". It was a message designed to explain:
- Why that offer matched my profile.
- Which project demonstrated a relevant skill.
- What I could contribute from day one.
- Why it made sense to talk even if the offer was advanced or officially closed.
The surprising result was that 10 of those 15 emails became interviews. An especially interesting part was that 5 interviews came from offers whose official deadline had already finished.
That taught me something important: a closed offer on a portal does not always mean the company need has disappeared. Sometimes the public form is closed, but the team is still hiring, the process is still alive internally or a very aligned candidate can still enter through a more human path.
What I learned
The main lesson was that looking for an internship does not have to be a lottery. It can be treated as an information problem:
- Collect data.
- Remove noise.
- Understand patterns.
- Compare each opportunity against your real profile.
- Prioritize a few actions with high intent.
I also learned that ATS tools are not perfect judges. They are filters. If you understand the information they need, you can present your experience better without inventing anything. The point is not to "hack" the system. The point is to translate your profile into the language the company is already using.
Most importantly, it confirmed an idea that appears in almost all my automation projects: automation should not remove human judgement. It should remove repetitive work so human judgement can be used better.
Why this project represents how I work
I like building systems that turn chaotic problems into clearer decisions. In this case, the problem was my own internship search. I could have done it manually, but I preferred to build a tool that helped me think better.
The value was not only Selenium, n8n or a dataset of 10,000 offers. The value was connecting those pieces to answer a practical question: where do I have the strongest real chance to create value?
That same mindset is behind my automation and AI projects and the systems I am building at NexaVision AI: data, context, automation and human action at the right point.
If you want to talk about automation, applied AI or intelligent search systems, you can contact me on LinkedIn or through the contact page.