Pekerjaan di sini adalah untuk mengikis API situs yang dimulai dari https://xxx.xxx.xxx/xxx/1.json
ke https://xxx.xxx.xxx/xxx/1417749.json
dan menulisnya persis ke mongodb. Untuk itu saya punya kode berikut:
client = pymongo.MongoClient("mongodb://127.0.0.1:27017")
db = client["thread1"]
com = db["threadcol"]
start_time = time.time()
write_log = open("logging.log", "a")
min = 1
max = 1417749
for n in range(min, max):
response = requests.get("https:/xx.xxx.xxx/{}.json".format(str(n)))
if response.status_code == 200:
parsed = json.loads(response.text)
inserted = com.insert_one(parsed)
write_log.write(str(n) + "\t" + str(inserted) + "\n")
print(str(n) + "\t" + str(inserted) + "\n")
write_log.close()
Tetapi butuh banyak waktu untuk melakukan tugas itu. Pertanyaan di sini adalah bagaimana saya bisa mempercepat proses ini.
python
mongodb
web-scraping
pymongo
Tek Nath
sumber
sumber
Jawaban:
asyncio juga merupakan solusi jika Anda tidak ingin menggunakan multi threading
sumber
Ada beberapa hal yang bisa Anda lakukan:
Kode paralel dari sini
Pengaturan waktu dari pertanyaan ini untuk koneksi yang dapat digunakan kembali
sumber
Anda dapat meningkatkan kode Anda pada dua aspek:
Menggunakan a
Session
, sehingga koneksi tidak diatur ulang pada setiap permintaan dan tetap terbuka;Menggunakan paralelisme dalam kode Anda dengan
asyncio
;Coba lihat di sini https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
sumber
Apa yang mungkin Anda cari adalah goresan asinkron. Saya akan merekomendasikan Anda untuk membuat beberapa kumpulan url, yaitu 5 url (cobalah untuk tidak chrash situs web), dan mengikisnya asinkron. Jika Anda tidak tahu banyak tentang async, google for the libary asyncio. Saya berharap bisa membantumu :)
sumber
Cobalah untuk memotong permintaan dan menggunakan operasi penulisan massal MongoDB.
Ini mungkin menghemat banyak waktu dengan cara berikut * MongoDB menulis latensi * latensi panggilan jaringan sinkron
Tetapi jangan meningkatkan jumlah permintaan paralel (ukuran Chunk), Ini akan meningkatkan beban jaringan server dan server mungkin berpikir ini sebagai serangan DDoS.
sumber
Dengan asumsi bahwa Anda tidak akan diblokir oleh API dan tidak ada batasan nilai, kode ini harus membuat proses 50 kali lebih cepat (mungkin lebih karena semua permintaan sekarang dikirim menggunakan sesi yang sama).
sumber
Saya kebetulan memiliki pertanyaan yang sama bertahun-tahun yang lalu. Saya tidak pernah puas dengan jawaban berbasis python, yang cukup lambat atau terlalu rumit. Setelah saya beralih ke alat dewasa lainnya, kecepatannya cepat dan saya tidak pernah kembali.
Baru-baru ini saya menggunakan langkah-langkah tersebut untuk mempercepat proses sebagai berikut.
aria2c -x16 -d ~/Downloads -i /path/to/urls.txt
untuk mengunduh file-file iniIni adalah proses tercepat yang saya lakukan sejauh ini.
Dalam hal menggores halaman web, saya bahkan mengunduh * .html yang diperlukan, alih-alih mengunjungi halaman itu satu per satu, yang sebenarnya tidak membuat perbedaan. Ketika Anda menekan mengunjungi halaman, dengan alat python seperti
requests
atauscrapy
atauurllib
, itu masih menyimpan dan mengunduh seluruh konten web untuk Anda.sumber
Pertama buat daftar semua tautan karena semuanya sama saja ubah iterate it.
Dengan hanya menambah atau mengurangi t_no Anda tidak dapat mengubah utas ..
sumber