-记一次debug
本来以为上次做好的爬虫已经没有问题了,的但是在实际运行的时候又出了了问题,前期一直以为问题出来循环和URL的设置上,结果在经过一早上的调整顺序后,还是没有结果。累。
后面终于在观察语句的调用顺序,找到了问题的所在,
在前十五次的执行中,放在yield中执行的print(c)都没执行,说明前十五次跳过了yield,直接执行后面的代码。
而在之后的执行中,更是看不懂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。