避免 python scrapy 中的响应重叠

Avoiding overlapping of responses in python scrapy

我试图抓取在这里找到的印度 Rajya Sabha 成员的家庭信息 http://164.100.47.5/Newmembers/memberlist.aspx
作为 scrapy 的新手,我按照 this and this 示例代码生成了以下内容。

def parse(self,response):

    print "Inside parse"
    requests = []
    target_base_prefix = 'ctl00$ContentPlaceHolder1$GridView2$ctl'
    target_base_suffix = '$lkb'

    for i in range(2,5):
        if i < 10:
            target_id = "0"+str(i)
        else:
            target_id = str(i)

        evTarget = target_base_prefix+target_id+target_base_suffix

        form_data = {'__EVENTTARGET':evTarget,'__EVENTARGUMENT':''}

        requests.append(scrapy.http.FormRequest.from_response(response, formdata = form_data,dont_filter=True,method = 'POST', callback = self.parse_politician))

    for r in requests:
        print "before yield"+str(r)
        yield r


def parse_pol_bio(self,response):

    print "[parse_pol_bio]- response url - "+response.url

    name_xp = '//span[@id=\"ctl00_ContentPlaceHolder1_GridView1_ctl02_Label3\"]/font/text()'
    base_xp_prefix = '//*[@id=\"ctl00_ContentPlaceHolder1_TabContainer1_TabPanel2_ctl00_DetailsView2_Label'
    base_xp_suffix='\"]/text()'
    father_id = '12'
    mother_id = '13'
    married_id = '1'
    spouse_id = '3'

    name = response.xpath(name_xp).extract()[0].strip()
    name = re.sub(' +', ' ',name)

    father = response.xpath(base_xp_prefix+father_id+base_xp_suffix).extract()[0].strip()
    mother = response.xpath(base_xp_prefix+mother_id+base_xp_suffix).extract()[0].strip()
    married = response.xpath(base_xp_prefix+married_id+base_xp_suffix).extract()[0].strip().split(' ')[0]

    if married == "Married":
        spouse = response.xpath(base_xp_prefix+spouse_id+base_xp_suffix).extract()[0].strip()
    else:
        spouse = ''

    print 'name     marital_stat    father_name     mother_name     spouse'
    print name,married,father,mother,spouse

    item = RsItem()
    item['name'] = name
    item['spouse'] = spouse
    item['mother'] = mother
    item['father'] = father

    return item



def parse_politician(self,response):

    evTarget = 'ctl00$ContentPlaceHolder1$TabContainer1'
    evArg =  'activeTabChanged:1'
    formdata = {'__EVENTTARGET':evTarget,'__EVENTARGUMENT':evArg}

    print "[parse_politician]-response url - "+response.url

    return scrapy.FormRequest.from_response(response, formdata,method = 'POST', callback = self.parse_pol_bio)

说明
parse 方法循环遍历不同政客的目标 ID 并发送请求。
parse_politician - 用于标签更改目的
parse_politician_bio 抓取依赖名称。

问题
问题是这会导致对 parse_politician_bio.
的重复响应 即关于同一个人的信息多次出现。
重复回复的性质在每个 运行 中都是相当随机的,即 - 在每个回复中可能会重复不同的政客数据。
我已经检查过是否有任何请求多次被 yield 但 none 是。
还尝试在每次 yield 请求后睡一会儿,看看是否有帮助。
我怀疑这里是 scrapy Request Scheduler。

代码中还有其他问题吗?有什么办法可以避免这种情况吗?

编辑
只是为了在这里澄清一些事情,我知道 dont_filter=True 的作用并故意保留它。

问题是一些响应数据正在被替换。例如,当我生成 3 个请求时,分别为 target_id = 1,2,3。 target_id = 1 的响应被 target_id = 2 的响应所取代。
[所以我对 target_id - 3 有一个回应,对 target_id -2]

有两个回应

预期输出 (csv)

politician name , spouse name , father name , mother name
pol1 , spouse1, father1, mother1
pol2 , spouse2, father2, mother2
pol3 , spouse3, father3, mother3

给定输出 (csv)

politician name , spouse name , father name , mother name
pol1 , spouse1, father1, mother1
pol1 , spouse1, father1, mother1
pol3 , spouse3, father3, mother3

终于修好了(呸!)。
默认scrapy一次发送16个请求(并发请求)。
CONCURRENT_REQUESTS = 1 放入 settings.py 文件中可以实现顺序并解决问题。

我提出的请求相似(检查上面),响应数据与 彼此只给出一种类型的重复响应。

虽然不知道这是怎么发生的,但通过发出顺序请求的解决方案证实了这一点。
有更好的解释吗?