我正在使用scrapy
抓取this网站并抓取数据
我希望抓取的数据具有嵌套结构。这样的事情
{
denomination1: {
date1: {
bondNumbers: [...] },
date2: {
bondNumbers: [...] },
... },
denomination2: {
date1: {
bondNumbers: [...] },
date2: {
bondNumbers: [...] },
... },
...
}
这是我写的spider
。
import scrapy
class Savings(scrapy.Spider):
name = 'savings'
start_urls = [
'https://savings.gov.pk/download-draws/',
]
def parse(self, response):
for option in response.css('select option'):
denomination = option.css('::text').get()
url = option.css('::attr(value)').get()
yield {
denomination: response.follow(url, self.parseDrawList)
}
def parseDrawList(self, response):
for a in response.css('select option'):
date = a.css('::text').get()
url = a.css('::attr(value)').get()
yield {
date: response.follow(url, self.parseDraw)
}
def parseDraw(self, response):
yield {
'bondNumbers': response.selector.re(r'\d{6}'),
}
每个函数在网页层次结构中抓取不同的页面(如果我们可以这样称呼它的话),因此,嵌套数据结构的每个级别将由来自不同级别的页面的数据填充。
这个代码不工作,并给我一个错误。
从我所看到的所有教程和文档中,没有一个使用scrapy
来生成嵌套的数据结构。
有没有办法从scrapy
获取嵌套数据?我还想知道这个解决方案是否不会牺牲scrapy
的并发请求执行。
1条答案
按热度按时间hgncfbus1#
您需要从每个回调中获取信息,并使用请求Meta字典或
response.follow
中的cb_kwargs参数将其传递给下一个回调,然后在最后的回调中,您可以构建完全嵌套的结构并将其作为一个项产生。举例来说:
示例输出