Pembangun Python mengetahui latihan ini: anda memerlukan data syarikat yang boleh dipercayai, dan Crunchbase memilikinya. Panduan ini menunjukkan kepada anda cara membina pengikis Crunchbase yang berkesan dalam Python yang memberikan anda data yang anda perlukan.
Crunchbase menjejaki butiran yang penting: lokasi, tumpuan perniagaan, pengasas dan sejarah pelaburan. Pengekstrakan manual daripada set data yang begitu besar tidak praktikal -automasi adalah penting untuk mengubah maklumat ini kepada format yang boleh dianalisis.
Menjelang akhir blog ini, kami akan meneroka tiga cara berbeza untuk mengekstrak data daripada Crunchbase menggunakan Crawlee untuk Python. Kami akan melaksanakan sepenuhnya dua daripadanya dan membincangkan spesifik dan cabaran yang ketiga. Ini akan membantu kami memahami dengan lebih baik betapa pentingnya memilih sumber data yang betul dengan betul.
Nota: Panduan ini datang daripada pembangun dalam komuniti kami yang semakin berkembang. Pernahkah anda membina projek menarik dengan Crawlee? Sertai kami di Discord untuk berkongsi pengalaman dan idea blog anda - kami menghargai sumbangan daripada pembangun seperti anda ini.
Langkah utama yang akan kami bincangkan:
Sebelum kita mula mengikis, kita perlu menyediakan projek kita. Dalam panduan ini, kami tidak akan menggunakan templat perangkak (Penulis Drama dan Beautifulsoup), jadi kami akan menyediakan projek secara manual.
Pasang Puisi
pipx install poetry
Buat dan navigasi ke folder projek.
mkdir crunchbase-crawlee && cd crunchbase-crawlee
Mulakan projek menggunakan Puisi, biarkan semua medan kosong.
poetry init
Apabila digesa:
Tambah dan pasang Crawlee dengan kebergantungan yang diperlukan pada projek anda menggunakan Puisi.
poetry add crawlee[parsel,curl-impersonate]
Lengkapkan persediaan projek dengan mencipta struktur fail standard untuk projek Crawlee untuk Python.
mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
Selepas menyediakan struktur projek asas, kami boleh meneroka kaedah yang berbeza untuk mendapatkan data daripada Crunchbase.
Walaupun kami boleh mengekstrak data sasaran terus daripada halaman syarikat, kami perlu memilih cara terbaik untuk menavigasi tapak.
Pemeriksaan teliti struktur Crunchbase menunjukkan bahawa kami mempunyai tiga pilihan utama untuk mendapatkan data:
Mari kita periksa setiap pendekatan ini secara terperinci.
Peta laman ialah cara standard navigasi tapak yang digunakan oleh perangkak seperti Google, Ahrefs dan enjin carian lain. Semua perangkak mesti mengikut peraturan yang diterangkan dalam robots.txt.
Mari kita lihat struktur Peta Laman Crunchbase:
Seperti yang anda lihat, pautan ke halaman organisasi terletak di dalam fail Peta Laman peringkat kedua, yang dimampatkan menggunakan gzip.
Struktur salah satu daripada fail ini kelihatan seperti ini:
Medan lastmod amat penting di sini. Ia membolehkan pengesanan syarikat yang telah mengemas kini maklumat mereka sejak pengumpulan data sebelumnya. Ini amat berguna untuk kemas kini data biasa.
Untuk bekerja dengan tapak, kami akan menggunakan CurlImpersonateHttpClient, yang menyamar sebagai penyemak imbas Safari. Walaupun pilihan ini mungkin kelihatan tidak dijangka untuk bekerja dengan peta laman, ia diperlukan oleh ciri perlindungan Crunchbase.
Alasannya ialah Crunchbase menggunakan Cloudflare untuk melindungi daripada akses automatik. Ini jelas kelihatan apabila menganalisis trafik pada halaman syarikat:
Ciri yang menarik ialah challenges.cloudflare dilaksanakan selepas memuatkan dokumen dengan data. Ini bermakna kami menerima data dahulu, dan kemudian JavaScript menyemak sama ada kami bot. Jika cap jari klien HTTP kami cukup serupa dengan penyemak imbas sebenar, kami akan berjaya menerima data tersebut.
Cloudflare juga menganalisis trafik pada peringkat peta laman. Jika perangkak kami tidak kelihatan sah, akses akan disekat. Itulah sebabnya kami menyamar sebagai pelayar sebenar.
Untuk mengelakkan sekatan akibat rangkak yang terlalu agresif, kami akan mengkonfigurasi ConcurrencySettings.
Apabila menskalakan pendekatan ini, anda mungkin memerlukan proksi. Maklumat terperinci tentang persediaan proksi boleh didapati dalam dokumentasi.
Kami akan menyimpan hasil pengikisan kami dalam format JSON. Begini rupa konfigurasi perangkak asas:
pipx install poetry
Navigasi peta laman berlaku dalam dua peringkat. Pada peringkat pertama, kita perlu mendapatkan senarai semua fail yang mengandungi maklumat organisasi:
pipx install poetry
Pada peringkat kedua, kami memproses fail peta laman peringkat kedua yang disimpan dalam format gzip. Ini memerlukan pendekatan khas kerana data perlu dinyahmampat dahulu:
mkdir crunchbase-crawlee && cd crunchbase-crawlee
Setiap halaman syarikat mengandungi sejumlah besar maklumat. Untuk tujuan demonstrasi, kami akan menumpukan pada medan utama: Nama Syarikat, Penerangan Ringkas, Tapak Web dan Lokasi.
Salah satu kelebihan Crunchbase ialah semua data disimpan dalam format JSON dalam halaman:
Ini memudahkan pengekstrakan data dengan ketara - kami hanya perlu menggunakan satu pemilih Xpath untuk mendapatkan JSON, dan kemudian gunakan jmespath untuk mengekstrak medan yang diperlukan:
poetry init
Data yang dikumpul disimpan dalam Crawlee untuk storan dalaman Python menggunakan kaedah context.push_data. Apabila perangkak selesai, kami mengeksport semua data yang dikumpul ke fail JSON:
poetry add crawlee[parsel,curl-impersonate]
Dengan semua komponen tersedia, kami perlu mencipta titik masuk untuk perangkak kami:
mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
Laksanakan perangkak menggunakan Puisi:
# main.py from crawlee import ConcurrencySettings, HttpHeaders from crawlee.crawlers import ParselCrawler from crawlee.http_clients import CurlImpersonateHttpClient from .routes import router async def main() -> None: """The crawler entry point.""" concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50) http_client = CurlImpersonateHttpClient( impersonate='safari17_0', headers=HttpHeaders( { 'accept-language': 'en', 'accept-encoding': 'gzip, deflate, br, zstd', } ), ) crawler = ParselCrawler( request_handler=router, max_request_retries=1, concurrency_settings=concurrency_settings, http_client=http_client, max_requests_per_crawl=30, ) await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml']) await crawler.export_data_json('crunchbase_data.json') <h3> 5. Akhir sekali, ciri-ciri menggunakan perangkak peta laman </h3> <p>Pendekatan peta laman mempunyai kelebihan dan batasannya yang tersendiri. Ia sesuai dalam kes berikut:</p> <ul> <li>Apabila anda perlu mengumpul data tentang semua syarikat di platform</li> <li>Apabila tiada kriteria pemilihan syarikat khusus</li> <li>Jika anda mempunyai masa dan sumber pengiraan yang mencukupi</li> </ul> <p>Walau bagaimanapun, terdapat had penting untuk dipertimbangkan:</p> <ul> <li>Hampir tiada keupayaan untuk menapis data semasa pengumpulan</li> <li>Memerlukan pemantauan berterusan blok Cloudflare</li> <li>Menskalakan penyelesaian memerlukan pelayan proksi, yang meningkatkan kos projek</li> </ul> <h2> Menggunakan carian untuk mengikis Crunchbase </h2> <p>Keterbatasan pendekatan peta laman mungkin menunjukkan carian sebagai penyelesaian seterusnya. Walau bagaimanapun, Crunchbase menggunakan langkah keselamatan yang lebih ketat pada fungsi cariannya berbanding halaman awamnya.</p> <p>Perbezaan utama terletak pada cara perlindungan Cloudflare berfungsi. Semasa kami menerima data sebelum semakan challenges.cloudflare apabila mengakses halaman syarikat, API carian memerlukan kuki yang sah yang telah melepasi semakan ini.</p> <p>Mari sahkan perkara ini dalam amalan. Buka pautan berikut dalam mod Inkognito:<br> </p> <pre class="brush:php;toolbar:false"># routes.py from crawlee.crawlers import ParselCrawlingContext from crawlee.router import Router from crawlee import Request router = Router[ParselCrawlingContext]() @router.default_handler async def default_handler(context: ParselCrawlingContext) -> None: """Default request handler.""" context.log.info(f'default_handler processing {context.request} ...') requests = [ Request.from_url(url, label='sitemap') for url in context.selector.xpath('//loc[contains(., "sitemap-organizations")]/text()').getall() ] # Since this is a tutorial, I don't want to upload more than one sitemap link await context.add_requests(requests, limit=1)
Apabila menganalisis trafik, kita akan melihat corak berikut:
Jujukan acara di sini ialah:
Mengautomasikan proses ini memerlukan penyemak imbas tanpa kepala yang mampu memintas Cloudflare Turnstile. Versi semasa Crawlee for Python (v0.5.0) tidak menyediakan fungsi ini, walaupun ia dirancang untuk pembangunan masa hadapan.
Anda boleh melanjutkan keupayaan Crawlee untuk Python dengan menyepadukan Camoufox mengikut contoh ini.
Crunchbase menyediakan API percuma dengan fungsi asas. Pengguna langganan berbayar mendapat akses data yang diperluaskan. Dokumentasi lengkap untuk titik akhir yang tersedia boleh didapati dalam spesifikasi API rasmi.
Untuk mula bekerja dengan API, ikut langkah berikut:
Walaupun dokumentasi menyatakan bahawa pengaktifan kunci mungkin mengambil masa sehingga satu jam, ia biasanya mula berfungsi sebaik sahaja selepas penciptaan.
Ciri API yang penting ialah had - tidak lebih daripada 200 permintaan seminit, tetapi dalam versi percuma, jumlah ini jauh lebih rendah. Dengan mengambil kira perkara ini, mari kita konfigurasikan ConcurrencySettings. Memandangkan kami sedang bekerja dengan API rasmi, kami tidak perlu menutup klien HTTP kami. Kami akan menggunakan 'HttpxHttpClient' standard dengan pengepala pratetap.
Pertama, mari kita simpan kunci API dalam pembolehubah persekitaran:
pipx install poetry
Begini rupa konfigurasi perangkak untuk bekerja dengan API:
mkdir crunchbase-crawlee && cd crunchbase-crawlee
Untuk bekerja dengan API, kami memerlukan dua titik akhir utama:
Pertama, mari kita laksanakan pemprosesan hasil carian:
poetry init
Selepas mendapat senarai syarikat, kami mengeluarkan maklumat terperinci tentang setiap syarikat:
poetry add crawlee[parsel,curl-impersonate]
Jika anda memerlukan keupayaan carian yang lebih fleksibel, API menyediakan titik akhir carian khas. Berikut ialah contoh carian untuk semua syarikat di Prague:
mkdir crunchbase-crawlee && touch crunchbase-crawlee/{__init__.py,__main__.py,main.py,routes.py}
Untuk memproses hasil carian dan penomboran, kami menggunakan pengendali berikut:
# main.py from crawlee import ConcurrencySettings, HttpHeaders from crawlee.crawlers import ParselCrawler from crawlee.http_clients import CurlImpersonateHttpClient from .routes import router async def main() -> None: """The crawler entry point.""" concurrency_settings = ConcurrencySettings(max_concurrency=1, max_tasks_per_minute=50) http_client = CurlImpersonateHttpClient( impersonate='safari17_0', headers=HttpHeaders( { 'accept-language': 'en', 'accept-encoding': 'gzip, deflate, br, zstd', } ), ) crawler = ParselCrawler( request_handler=router, max_request_retries=1, concurrency_settings=concurrency_settings, http_client=http_client, max_requests_per_crawl=30, ) await crawler.run(['https://www.crunchbase.com/www-sitemaps/sitemap-index.xml']) await crawler.export_data_json('crunchbase_data.json')
Versi percuma API mempunyai had yang ketara:
Pertimbangkan langganan berbayar untuk kerja peringkat pengeluaran. API menyediakan cara yang paling boleh dipercayai untuk mengakses data Crunchbase, walaupun dengan kekangan kadarnya.
Kami telah meneroka tiga pendekatan berbeza untuk mendapatkan data daripada Crunchbase:
Setiap kaedah mempunyai kelebihannya, tetapi untuk kebanyakan projek, saya mengesyorkan menggunakan API rasmi walaupun terhad dalam versi percuma.
Kod sumber lengkap tersedia dalam repositori saya. Ada soalan atau ingin membincangkan butiran pelaksanaan? Sertai Discord kami - komuniti pembangun kami sedia membantu.
Atas ialah kandungan terperinci Bagaimana untuk mengikis Crunchbase menggunakan Python dalam Panduan Mudah). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!