使用Scrapy在嵌套页面中连续捕获数据

使用Scrapy在嵌套页面中连续捕获数据,scrapy,meta,Scrapy,Meta,我正试图用一个Scrapy BaseSpider来创建一个相当简单的网站,因为我事先知道我想要爬网的所有链接都在哪里 要爬网的站点的基本布局为 国家名单 一个州内的县列表 县内机构名单 关于单一机构的信息 我可以成功导航并获取所有4个级别的数据,但是,我的county字段没有正确填充。对于给定的机构,我得到的不是它所在的实际县,而是该机构所在州的最后一个县 例如: OH-县3-机构1(应该是县1) OH-县3-机构2(应该是县2) OH-县3-机构3(正确) 我似乎想不出一些我认为相对简单的

我正试图用一个Scrapy BaseSpider来创建一个相当简单的网站,因为我事先知道我想要爬网的所有链接都在哪里

要爬网的站点的基本布局为

  • 国家名单
  • 一个州内的县列表
  • 县内机构名单
  • 关于单一机构的信息
  • 我可以成功导航并获取所有4个级别的数据,但是,我的county字段没有正确填充。对于给定的机构,我得到的不是它所在的实际县,而是该机构所在州的最后一个县

    例如:

    • OH-县3-机构1(应该是县1
    • OH-县3-机构2(应该是县2
    • OH-县3-机构3(正确)
    我似乎想不出一些我认为相对简单的事情

    代码如下:

    from scrapy.spider import BaseSpider
    from scrapy.selector import Selector
    from agencyspider.items import AgencyItem
    from scrapy.http import Request
    
    class BasicspiderSpider(BaseSpider):
        name = "basicSpider"
        allowed_domains = ["usacops.com"]
        start_urls = [
            'http://www.usacops.com/',
            ]
    
        items = {}
    
        def parse(self, response):
            sel = Selector(response)
            states = sel.xpath('//comment()[.=" Begin State Names "]/following::table[1]/tr/td/a')
            for s in states:
                item = AgencyItem()
                state = s.xpath('text()').extract()[0]
                url = s.xpath('@href').extract()[0]
                item['state'] = state
                item['stateUrl']= url
                yield Request(url=url,callback=self.parse_counties,meta={'item':item})
    
    
        def parse_counties(self, response):
            sel = Selector(response)
            counties = sel.xpath('//comment()[.=" Begin Counties "]/following::table[1]/tr/td/font/a | //comment()[.=" Begin Counties "]/following::table[1]/tr/td/a')
            for c in counties:
                item = response.request.meta["item"]
                county = c.xpath('text()').extract()[0]
                countyUrl = c.xpath('@href').extract()[0]
                url = item["stateUrl"] + countyUrl
                item["county"]=county
                item["countyUrl"]=url
                yield Request(url=url, callback=self.parse_agencies,meta={'item':item})
    
        def parse_agencies(self,response):
            sel = Selector(response)
            agencies = sel.xpath('//table[9]/tr/td/table[2]/tr/td/font/a | //table[9]/tr/td/table[2]/tr/td/a')
            for a in agencies:
                item = response.request.meta["item"]
                agency = a.xpath('text()').extract()[0]
                agencyUrl = a.xpath('@href').extract()[0]
                url =  item["stateUrl"] + agencyUrl
                item["agency"] = agency
                item["agencyUrl"] = url 
                yield Request(url=url, callback=self.parse_agencyinfo,meta={'item':item})
    
        def parse_agencyinfo(self,response):
            sel = Selector(response)        
            item = response.request.meta["item"]
            item["agency"]= ' '.join(sel.xpath('//comment()[.=" Begin center section "]/following::table/tr/td/strong/font[1]/text()').extract())
            item["admintype"]= ' '.join(sel.xpath('//comment()[.=" Begin center section "]/following::table/tr/td/strong/font[2]/text()').extract())
            item["adminhead"]= ' '.join(sel.xpath('//comment()[.=" Begin center section "]/following::table/tr/td/strong/font[3]/text()[1]').extract())
            item["address"]= ' '.join(sel.xpath('//comment()[.=" Begin center section "]/following::table/tr/td/strong/font[3]/text()[position()>1]').extract())
            return item
    

    嘿,所以问题是每次分配
    item=response.request.meta[“item”]
    时,都会反复引用和分配相同的项

    幸运的是,这是一个简单的解决办法!只需将
    response.request.meta[“item”]
    包装为
    AgencyItem(response.request.meta[“item”])
    即可为每个县创建一个州项目的列表


    另外,不要忘了在其他回调中执行同样的操作,否则您将在其他字段中遇到问题。希望有帮助

    成功了!出于某种原因,我认为对新URL的请求将为我创建一个新的作用域,而不是重复使用相同的对象。非常感谢。我可以把自己从屏幕上撬开。妻子和孩子更幸福。