- Connector protocol with fetch(query: SearchQuery) -> list[RawPosting] - ArbetsformedlingenConnector: official Platsbanken API, field mapping (headline->title, employer.name->company, webpage_url->url, description.text->description, id->external_id), region mapping, polite User-Agent - GenericUrlConnector: readability extraction (prefers main/article, strips nav/footer/script/style), title/company guess, Cloudflare challenge detection -> UnsupportedSite - dedupe helper: (source, url) + external_id keying - normalizer: RawPosting -> JobPosting (job_posting table shape) - 37 tests, all passing, recorded fixtures (no live network) - README with usage and mock examples
28 lines
No EOL
898 B
HTML
28 lines
No EOL
898 B
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<title>Just a moment...</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<style>
|
|
body { font-family: sans-serif; }
|
|
.cf-spinner { display: block; margin: 50px auto; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="cf-challenge-running">
|
|
<div class="cf-spinner"></div>
|
|
<h1>Just a moment...</h1>
|
|
<p>Don't refresh this page.</p>
|
|
</div>
|
|
<script src="/cdn-cgi/challenge-platform/h/b/cv/result/0" type="text/javascript"></script>
|
|
<script>
|
|
(function(){
|
|
var a = document.getElementById('cf-challenge-running');
|
|
a.style.display = 'none';
|
|
// challenge-platform code
|
|
window._cf_chl_opt = {cfRay: 'abc123-xyz789'};
|
|
})();
|
|
</script>
|
|
</body>
|
|
</html> |