[Debug]Scrapy-yield-循环顺序问题

1,195 阅读2分钟

-记一次debug

本来以为上次做好的爬虫已经没有问题了,的但是在实际运行的时候又出了了问题,前期一直以为问题出来循环和URL的设置上,结果在经过一早上的调整顺序后,还是没有结果。累。

后面终于在观察语句的调用顺序,找到了问题的所在,

image-20210503162542426.png

在前十五次的执行中,放在yield中执行的print(c)都没执行,说明前十五次跳过了yield,直接执行后面的代码。

image-20210503162649407.png

image-20210503162705629.png 而在之后的执行中,更是看不懂yield调用顺序了。第十六次正常执行,第十七次开始重复执行和乱序执行。

            
            #header of json
            for result in data["engine_search_result"]:
                item["job_id"] = result["jobid"]
                print("\nA\n")
                item["company_id"] = result["coid"]
                item["requirement"] = result["attribute_text"]
                item["job_url"] = result["job_href"]

                item["company_size"] = result["companysize_text"]
                item["company_url"] = result["company_href"]
                print("\nB\n")
                job_url = item["job_url"]
                comp_url = item["company_url"]
                print("在这里第",i,"次")
                i = i+1
                #按照我自己的想法,这边应该是顺序调用,在这里进入yield里,执行完之后再返回来执行下一步,然后继续循环。但实际上并非如此,而是产生了多种多样的调用方式,1.自己调用自己多次2,正常顺序调用3.乱序调用
                yield scrapy.Request(
                    url = job_url,
                    callback=self.jobs_detail,
                    meta={"item": item}
                ) 
                #yield scrapy.Request(
                #    url = comp_url,
                #    callback=self.comp_detail,
                #    meta={"item": item}
                #)
                print("\nD\n")

                yield item

最后得出,问题出在yield中。

看来之前对yield的理解错了。现在重新学一遍。

……………………………………(关于yield的内容)

但问题还是没解决,我没想通为什么生成器就不会执行中间的步骤的了。 然后我阅读到一篇文章scrapy中的yield scrapy.Request 在传递item 的注意点

在需要多次调用下面这个parse_detail() 方法的时候,会出现获取到最后一个item的情况,而且是循环调用最后一个,就像是上面yield 这一部分是个for循环,但是下面的parse方法不再循环内,所以就只能一直调用到最后一个item.

**使用deepcopy深层次拷贝item,拷贝每一次引擎收到的item,并将其调给parse_detail()方法 后天通过调用也发现,程序在执行一个yield之后,也并不会按序返回接着执行,具体的细节我还没有分析,以后解决。

所以如果先调用一次,就deepcopy 如果要两次,就需要在第一个yield里,调用yiedld。