使用 Scrapy 从动态 JSON 响应中提取
Extract from dynamic JSON response with Scrapy
我想从 JSON 输出中提取 'avail' 值,如下所示。
{
"result": {
"code": 100,
"message": "Command Successful"
},
"domains": {
"yolotaxpayers.com": {
"avail": false,
"tld": "com",
"price": "49.95",
"premium": false,
"backorder": true
}
}
}
问题是 ['avail']
值在 ["domains"]["domain_name"]
下面,我不知道如何获取域名。
你下面有我的蜘蛛。第一部分工作正常,但不是第二部分。
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
提前感谢您的回复。
目前,它尝试通过 "('%s.com' % line)"
键获取值。
您需要正确设置字符串格式:
domain_name = "%s.com" % line.strip()
item["avail"] = jsonresponse["domains"][domain_name]["avail"]
假设您每次回复只期望一个结果:
domain_name = list(jsonresponse['domains'].keys())[0]
item["avail"] = jsonresponse["domains"][domain_name]["avail"]
即使文件 "test.txt" 中的域与结果中的域不匹配,这仍然有效。
要从上面的 json 响应中获取域名,您可以使用列表理解,例如:
domain_name = [x for x in jsonresponse.values()[0].keys()]
要获取 "avail" 值使用相同的方法,例如:
avail = [x["avail"] for x in jsonresponse.values()[0].values() if "avail" in x]
要获取字符串格式的值,您应该通过索引 0 调用它,例如:
domain_name[0] 和 可用 [0] 因为列表理解结果存储在列表类型变量中。
我想从 JSON 输出中提取 'avail' 值,如下所示。
{
"result": {
"code": 100,
"message": "Command Successful"
},
"domains": {
"yolotaxpayers.com": {
"avail": false,
"tld": "com",
"price": "49.95",
"premium": false,
"backorder": true
}
}
}
问题是 ['avail']
值在 ["domains"]["domain_name"]
下面,我不知道如何获取域名。
你下面有我的蜘蛛。第一部分工作正常,但不是第二部分。
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
提前感谢您的回复。
目前,它尝试通过 "('%s.com' % line)"
键获取值。
您需要正确设置字符串格式:
domain_name = "%s.com" % line.strip()
item["avail"] = jsonresponse["domains"][domain_name]["avail"]
假设您每次回复只期望一个结果:
domain_name = list(jsonresponse['domains'].keys())[0]
item["avail"] = jsonresponse["domains"][domain_name]["avail"]
即使文件 "test.txt" 中的域与结果中的域不匹配,这仍然有效。
要从上面的 json 响应中获取域名,您可以使用列表理解,例如:
domain_name = [x for x in jsonresponse.values()[0].keys()]
要获取 "avail" 值使用相同的方法,例如:
avail = [x["avail"] for x in jsonresponse.values()[0].values() if "avail" in x]
要获取字符串格式的值,您应该通过索引 0 调用它,例如:
domain_name[0] 和 可用 [0] 因为列表理解结果存储在列表类型变量中。