Germantechjobs Jobs Scraper collects structured German tech job listings and turns them into clean, analysis-ready records. Use it to centralize openings, compare roles across cities, and keep an always-current dataset for reporting, alerts, or market research. It’s built for repeatable extraction of German tech jobs data with consistent fields and predictable outputs.
Created by Bitbash, built to showcase our approach to Scraping and Automation!
If you are looking for germantechjobs-jobs-scraper you've just found your team — Let’s Chat. 👆👆
This project extracts job listings and key metadata from a German tech-focused job platform and normalizes the results into a structured dataset. It solves the problem of manually tracking fast-changing job boards by automating discovery and standardizing job details for downstream use. It’s for developers, analysts, recruiters, and job seekers who need reliable German tech jobs listings for monitoring, insights, or automation.
- Collects technology-focused roles across Germany (engineering, DevOps, web, backend, frontend, and more).
- Captures both job-level and company-level metadata to support filtering and segmentation.
- Supports location coordinates for mapping, regional analysis, and geo-based alerts.
- Preserves role requirements and tags (skills, categories, technologies) for trend analysis.
- Produces a consistent dataset format for exports, dashboards, and pipelines.
| Feature | Description |
|---|---|
| Query-based job discovery | Pull listings using job titles, skill keywords, or category filters to target relevant roles. |
| Rich job metadata extraction | Captures title, job type, experience level, workplace mode, visa sponsorship, and language. |
| Company profile fields | Extracts company name, size, type, website, branding, and contact method. |
| Location intelligence | Stores city category, address fields, and latitude/longitude for mapping and geo insights. |
| Salary range normalization | Collects annual salary ranges when available for compensation benchmarking. |
| Tag and technology parsing | Extracts technologies and filter tags for skill-demand and role clustering analysis. |
| Operational flags | Keeps partner/paused/status flags to support de-duplication and lifecycle tracking. |
| Export-ready outputs | Produces structured records suitable for JSON/CSV pipelines and analytics workflows. |
| Field Name | Field Description |
|---|---|
| _id | Unique record identifier for the listing. |
| jobUrl | Job listing path or slug used to build/open the job page. |
| name | Job title as shown on the listing. |
| company | Company name associated with the job. |
| companyId | Unique identifier referencing the company record/source. |
| companyWebsiteLink | Company website link or short URL if provided. |
| candidateContactWay | Preferred contact method (e.g., Email). |
| workplace | Workplace mode such as remote, onsite, or hybrid. |
| remoteType | Remote scope indicator (e.g., country-limited) when available. |
| jobType | Employment type (e.g., Full-Time). |
| expLevel | Experience level (e.g., Junior, Regular, Senior). |
| language | Working language for the role (e.g., English, German). |
| hasVisaSponsorship | Whether visa sponsorship is offered when provided. |
| annualSalaryFrom | Salary lower bound (annual), when present. |
| annualSalaryTo | Salary upper bound (annual), when present. |
| techCategory | Primary tech category (e.g., PHP) used for grouping/filtering. |
| technologies | List of technologies mentioned for the role. |
| filterTags | Tag list for role filtering (skills, domains, stacks). |
| perkKeys | List of perks/benefits as standardized keys. |
| offerStockOrBonus | Whether stock/bonus is mentioned (boolean when present). |
| tier | Listing tier level (e.g., basic). |
| activeFrom | Activation/publish date-time for the job listing. |
| isPartner | Partner listing flag when present. |
| isPaused | Whether the listing is paused/inactive when present. |
| hasLangCheck | Language-check/status flag when present. |
| cityCategory | City/region grouping label (e.g., Berlin). |
| actualCity | City name derived from the listing. |
| address | Street address if available. |
| postalCode | Postal/ZIP code if available. |
| latitude | Latitude coordinate for mapping. |
| longitude | Longitude coordinate for mapping. |
| companyType | Company type/category (e.g., Services). |
| companySize | Company size band (e.g., <50). |
| logoImg | Company logo filename or reference if available. |
| disableMethodology | Platform-specific operational flag if present. |
| ba | Additional listing flag/status value when provided. |
[
{
"_id": "66d9bc6dc2c192daf765eb42",
"jobUrl": "keySquare-Network-UG--CoKG-Backend-Developer-mfd-with-a-Focus-on-PHP",
"isPartner": false,
"isPaused": false,
"hasLangCheck": true,
"companyId": "66d9b4edba8d3810ef51a6b3",
"longitude": 13.41924219,
"latitude": 52.5487464,
"cityCategory": "Berlin",
"tier": "basic",
"logoImg": "keysquare-network-ug--cokg-logo-1725543991525.jpg",
"activeFrom": "2024-09-10T00:00:00.000+02:00",
"companyWebsiteLink": "visi.bi",
"candidateContactWay": "Email",
"workplace": "remote",
"company": "keySquare Network UG & Co.KG",
"address": "Wichertstr. 16/17",
"actualCity": "Berlin",
"postalCode": "10439",
"companyType": "Services",
"companySize": "<50",
"hasVisaSponsorship": "No",
"language": "English",
"perkKeys": [
"freshfruits",
"weeksvacation4",
"cooloffice",
"flexiblework",
"petfriendly",
"remote2day",
"hybridwork",
"coffee",
"maternity",
"quietoffice",
"sweets",
"parttime",
"remotefull"
],
"offerStockOrBonus": false,
"name": "Backend Developer (m/f/d) with a Focus on PHP",
"jobType": "Full-Time",
"expLevel": "Regular",
"annualSalaryFrom": 40000,
"annualSalaryTo": 60000,
"techCategory": "PHP",
"technologies": ["PHP", "MySQL", "JavaScript", "CSS", "WordPress"],
"filterTags": ["Backend", "CSS", "Frontend", "JavaScript", "MySQL", "PHP", "Web", "WordPress"],
"disableMethodology": true,
"remoteType": "onlycountry",
"ba": "Yes"
}
]
Germantechjobs Jobs Scraper/
├── src/
│ ├── main.py
│ ├── runner.py
│ ├── http/
│ │ ├── client.py
│ │ └── retry.py
│ ├── extractors/
│ │ ├── jobs_extractor.py
│ │ ├── company_extractor.py
│ │ ├── salary_parser.py
│ │ ├── tags_parser.py
│ │ └── geo_parser.py
│ ├── normalize/
│ │ ├── schema.py
│ │ ├── validators.py
│ │ └── transformers.py
│ ├── outputs/
│ │ ├── exporters.py
│ │ ├── dataset_writer.py
│ │ └── dedupe.py
│ ├── config/
│ │ ├── defaults.json
│ │ ├── settings.example.json
│ │ └── logging.yaml
│ └── utils/
│ ├── dates.py
│ ├── text.py
│ └── metrics.py
├── tests/
│ ├── test_salary_parser.py
│ ├── test_tags_parser.py
│ ├── test_normalizers.py
│ └── test_dedupe.py
├── data/
│ ├── inputs.sample.json
│ └── sample_output.json
├── scripts/
│ ├── run_local.sh
│ └── export_csv.py
├── .env.example
├── .gitignore
├── requirements.txt
├── pyproject.toml
├── LICENSE
└── README.md
- Job seekers use it to aggregate German tech jobs, so they can filter roles by stack, city, and remote type in one place.
- Recruiters use it to monitor new listings and company activity, so they can identify hiring signals and outreach targets faster.
- Market analysts use it to track salary ranges and skill demand, so they can build compensation and trend reports by quarter.
- Engineering managers use it to benchmark role requirements, so they can write competitive job descriptions and set realistic hiring bars.
- Data teams use it to feed dashboards and alerts, so they can automate weekly updates without manual scraping work.
How do I target specific roles or skills? Use query parameters that represent job titles or skill keywords (e.g., "DevOps", "React", "Backend"). The extractor then focuses collection around those filters and returns listings with consistent tags and technology arrays for easier post-filtering.
What if some listings don’t include salary or exact address fields? The dataset keeps missing fields empty while preserving the record. Salary ranges and address fields are optional by nature; you can still use tags, city category, workplace mode, and technologies to analyze roles reliably.
How do I avoid duplicates across repeated runs? The project includes a de-duplication layer that keys off stable identifiers like job URL/slug plus company ID and title. This allows incremental refresh runs while keeping a single canonical record per listing.
Does it collect personal data? It focuses on job and company listing information intended for public job posts. If you extend it, avoid collecting personal data unless you have a legitimate purpose and a compliant legal basis under applicable privacy laws.
Primary Metric: Average extraction speed of 35–70 job records per minute on typical query runs, depending on filters and response size.
Reliability Metric: 96–99% successful fetch rate across repeated runs when retries are enabled and network conditions are stable.
Efficiency Metric: Sustains steady throughput with bounded concurrency, averaging 250–450 MB RAM usage during medium-sized runs (5k–15k records).
Quality Metric: 92–97% field completeness for core fields (title, company, workplace, city category, technologies), with optional fields (salary/address) varying by listing availability.
