json - Scrapy:Rest API 返回的 Json 对象的以下链接
问题描述
我正在实现一个蜘蛛,它应该从此页面获取所有 url 链接(以及所有其他通过分页):https://www.ibm.com/search?lang=de&cc=de&q=iot。我可以通过使用 api 来做到这一点。
这是我的问题:我不知道如何跟踪我提取的链接,因为来自 Scrapy 的链接提取器仅适用于选择器而不是 Json 对象。
当尝试使用这样的第二个请求抓取 url 时:
url = result.get('url')
content = scrapy.Request(url=url,callback=self.parse_content)
对于内容变量,我只得到类似的东西:Request GET http://www-01.ibm.com/support/docview.wss?uid=ibm10884852
请帮忙。这是我的完整代码:
import scrapy
import json
class IbmSpiderSpider(scrapy.Spider):
name = 'ibm_spider'
start_urls = ['http://www.ibm.com/search?lang=de/']
def start_requests(self):
urls_=[]
for i in range(0,10):
urls_.append('https://www-api.ibm.com/api/v1/search/aggr/rest/appid/mh?bookmark=eyJzZXJ2aWNlTmFtZSI6Imtub3dsZWRnZUNlbnRlciIsInRvdGFsIjoyOTMzNSwiY291bnQiOjMsInNtQ291bnQiOjAsIm9mZnNldCI6NiwiZmFpbGVkUGFnZXMiOltdfS17InNlcnZpY2VOYW1lIjoiZXNxcyIsInRvdGFsIjo0MDE3MywiY291bnQiOjE3LCJzbUNvdW50IjoyLCJvZmZzZXQiOjMyLCJmYWlsZWRQYWdlcyI6W119LXsicGFnZSI6MywicXVlcnkiOiJpb3QifQ&cachebust=1559896290619&dict=spelling&fr=60&nr=20&page={0}&query=iot&rc=de&refinement=ibmcom&rmdt=entitled&sm=true&smnr=20MzNSwiY291bnQiOjMsInNtQ291bnQiOjAsIm9mZnNldCI6NiwiZmFpbGVkUGFnZXMiOltdfS17InNlcnZpY2VOYW1lIjoiZXNxcyIsInRvdGFsIjo0MDE3MywiY291bnQiOjE3LCJzbUNvdW50IjoyLCJvZmZzZXQiOjMyLCJmYWlsZWRQYWdlcyI6W119LXsicGFnZSI6MywicXVlcnkiOiJpb3QifQ'.format(i))
for url in urls_:
yield scrapy.Request(url=url,callback=self.parse)
def parse(self, response):
data = json.loads(response.body)
results = data.get('resultset').get('searchresults').get('searchresultlist')
for result in results:
url = result.get('url')
content = scrapy.Request(url=url,callback=self.parse_content)
yield {
'title': result.get('title'),
'url': url,
# added to extract Links content
'content': content
}
def parse_content(self,response):
return response.text
解决方案
在您的parse
函数中,您应该产生的不是 dict,而是内容请求。检查这个例子:
def parse(self, response):
data = json.loads(response.body)
results = data.get('resultset').get('searchresults').get('searchresultlist')
for result in results:
url = result.get('url')
yield scrapy.Request(url, self.parse_content, meta={'title': result.get('title')})
因此,parse_content
您可以获取请求的标题、网址和内容:
def parse_content(self, response):
# and your logics here
print response.meta['title']
print response.url
print response.text
推荐阅读
- r - 在 R 中使用 ifelse 创建列
- python - Nutritionix 错误:“message”:“child \"query\" 失败,因为 [\"query\" is required]"
- c# - The name 'currentUserId' does not exist in the current context
- python - Python 中的组合
- vb.net - 在不使用按钮的情况下在 Visual Basic 中编写文本框?
- nginx - 根据 NGINX 代理传递中的动态头键修改头值
- python - Flask: TypeError: blog() got an unexpected keyword argument 'user'
- r - 在服务器和 UI 之间跳转的问题,以及组合数据框的问题
- c# - 在字段更改时显示 asp-validation-summary
- python - 如何使用 ipywidget 的 `interact` 和 matplotlib 的 `plt.subplots()`?