假设从淘宝抓取n个商品信息,然后又需要对这个n个信息分别取百度搜索,该怎么破?我能想到的有几个办法,但是都感觉有缺陷:
1 淘宝抓取到商品,在yield item的同时yield一个百度的requset,类似:
def parse_good_detail(self, response):
item = GoodItem()
item['name']=.....
yield item
//此处,同时去搜索这个商品
yield scrapy.Request('http://www.baidu.com?q='+item['name'],callback='parse_baidu_list')
def parse_baidu_list(self,response):
pass
但是那个GoodItem我有个pipeline是往数据库插入的,百度检索到数据后需要更新的,这个地方该怎么处理?
2 抓取和更新分开
抓取到数据库,然后启动搜索爬虫,一条一条搜索,一条一条更新。这样的问题是,在构造搜索爬虫的start_urls的时候可能会一次又几十万条,担心扛不住(机器比较弱).
刚开始接触爬虫,不知道哪一种可能好点?或者有更好的办法?
谢邀。
感觉你这个爬虫的工程,规模可能算为复杂,因此我不敢说我的建议绝对正确,在这里仅作抛砖引玉。
第一个问题,百度检索到的数据是要更新的,怎么处理?按我的理解,不知你的意思意思是,我爬取到信息A,然后百度信息A,之后用百度的内容覆盖掉A的某些重复的信息(就是以百度检索的内容为准),还是说,我获取到A的信息后,然后时不时需要按照百度的结果更新?
前者要处理的话,可以用缓存先把信息缓存起来,等更新完成了,再一次性写进数据库,避免频繁访问数据库。
如果是后者的需求,也就是说你对信息是要求实时更新的话,你可以先在程序里缓存一层,然后按照某个周期规律去写进数据库。(比如两分钟更新一次)这样的做法是既能保存数据的实时性(在允许的情况下存在误差,比如你的程序中途挂了,新的数据未写入数据库,你重启后再读出来的数据(上个周期保存的)肯定稍微滞后)但这避免你每次更新都去访问数据库。
第二个问题如果真的是机子的配置方面的问题的话,那对我来说很难给出一个令你满意的方案,不过有一个可能OK的方案就是,一般我们爬虫都是用广度优先的方法爬取,这就造成可能从一个节点扩散出几万个节点,再从下一个节点又扩散出几万个,所以干脆限制节点的扩散数量好了,反正如果路径是闭环的话(图),你始终会访问到的。
不过说起来,我反而考虑这种几十万个节点的该如何优化
visited
的列表?希望能帮到你