Ekstrak dari respons JSON dinamis dengan Scrapy

Saya ingin mengekstrak nilai 'avail' dari output JSON yang terlihat seperti ini.

{
    "result": {
        "code": 100,
        "message": "Command Successful"
    },
    "domains": {
        "yolotaxpayers.com": {
            "avail": false,
            "tld": "com",
            "price": "49.95",
            "premium": false,
            "backorder": true
        }
    }
}

Masalahnya adalah nilai ['avail'] di bawah ["domains"]["domain_name"] dan saya tidak tahu cara mendapatkan nama domainnya.

Anda memiliki laba-laba saya di bawah. Bagian pertama berfungsi dengan baik, tetapi bagian kedua tidak.

import scrapy
import json
from whois.items import WhoisItem

class whoislistSpider(scrapy.Spider):
    name = "whois_list"
    start_urls = []
    f = open('test.txt', 'r')
    global lines
    lines = f.read().splitlines()
    f.close()
    def __init__(self):
        for line in lines:
            self.start_urls.append('http://www.example.com/api/domain/check/%s/com' % line)

    def parse(self, response):
        for line in lines:
            jsonresponse = json.loads(response.body_as_unicode())
            item = WhoisItem()
            domain_name = list(jsonresponse['domains'].keys())[0]
            item["avail"] = jsonresponse["domains"][domain_name]["avail"]
            item["domain"] = domain_name
            yield item

Terima kasih sebelumnya atas balasan Anda.


person Cristian Calin    schedule 11.07.2016    source sumber


Jawaban (3)


Dengan asumsi Anda hanya mengharapkan satu hasil per respons:

domain_name = list(jsonresponse['domains'].keys())[0]
item["avail"] = jsonresponse["domains"][domain_name]["avail"]

Ini akan berfungsi meskipun ada ketidakcocokan antara domain di file "test.txt" dan domain di hasilnya.

person Dean Fenster    schedule 11.07.2016
comment
Terima kasih @Dean Ini berfungsi dengan baik, tetapi menjadi semacam lingkaran. Untuk 17 domain yang diperiksa, saya mendapatkan 289 hasil dengan banyak duplikat. Apakah Anda tahu cara keluar dari lingkaran ini? - person Cristian Calin; 11.07.2016
comment
@CristianCalin Tampaknya dalam fungsi parse yang Anda tambahkan ke daftar domain (dan juga di init), ini mungkin merupakan sumber dari loop tak terbatas. - person Dean Fenster; 11.07.2016
comment
Saya memindahkan daftar domain ke atas di class dan mendefinisikan lines sebagai global, tetapi masih dalam loop yang sama. - person Cristian Calin; 11.07.2016
comment
Silakan edit pertanyaan Anda dengan kode yang diperbarui. Ini mungkin ada hubungannya dengan cara scrapy memeriksa url duplikat. - person Dean Fenster; 11.07.2016
comment
Mengapa Anda menambahkan semua domain ke diperbolehkan_domains, apakah Anda bermaksud mengirimkan perayap ke domain tersebut? Mungkin ia menganggap WhoisItem sebagai tahap perayapan berikutnya... - person Dean Fenster; 11.07.2016
comment
Saya telah menghapus baris-baris itu dan memperbarui kodenya, tetapi sayangnya saya mendapatkan hasil yang sama. @DeanFenster - person Cristian Calin; 11.07.2016
comment
@CristianCalin Bisakah Anda menambahkan kode untuk WhoisItem yang Anda gunakan? baik di sini atau pada pertanyaan lanjutan (karena kita keluar dari topik) - person Dean Fenster; 11.07.2016
comment
Terima kasih @DeanFenster Saya telah mengirimkan pertanyaan baru di sini stackoverflow.com/questions/38315087/ - person Cristian Calin; 11.07.2016

Saat ini, ia mencoba mendapatkan nilai dengan kunci "('%s.com' % line)".

Anda perlu melakukan pemformatan string dengan benar:

domain_name = "%s.com" % line.strip()
item["avail"] = jsonresponse["domains"][domain_name]["avail"]
person alecxe    schedule 11.07.2016
comment
Terima kasih @alecxe. Berhasil, tapi sekarang saya mendapatkan item["avail"] = jsonresponse["domains"][domain_name]["avail"] KeyError: 'qqqqq.com' Saya pikir ini ada hubungannya dengan kutipan, bukan? - person Cristian Calin; 11.07.2016

Untuk mendapatkan nama domain dari respons json di atas, Anda dapat menggunakan pemahaman daftar, misalnya:

nama_domain = [x untuk x di jsonresponse.values()[0].keys()]

Untuk mendapatkan nilai "avail" gunakan metode yang sama, misalnya:

faedah = [x["avail"] untuk x di jsonresponse.values()[0].values() jika "avail" di x]

untuk mendapatkan nilai dalam format string Anda harus memanggilnya dengan indeks 0 misalnya:

nama_domain[0] dan tersedia[0] karena hasil pemahaman daftar disimpan dalam variabel tipe daftar.

Info selengkapnya tentang pemahaman daftar

person vikas0713    schedule 11.07.2016