scrapy中不同站点多次抓取

假设从淘宝抓取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的时候可能会一次又几十万条,担心扛不住(机器比较弱).

刚开始接触爬虫,不知道哪一种可能好点?或者有更好的办法?

阅读 4.6k
1 个回答

谢邀。

感觉你这个爬虫的工程,规模可能算为复杂,因此我不敢说我的建议绝对正确,在这里仅作抛砖引玉。

第一个问题,百度检索到的数据是要更新的,怎么处理?按我的理解,不知你的意思意思是,我爬取到信息A,然后百度信息A,之后用百度的内容覆盖掉A的某些重复的信息(就是以百度检索的内容为准),还是说,我获取到A的信息后,然后时不时需要按照百度的结果更新?

前者要处理的话,可以用缓存先把信息缓存起来,等更新完成了,再一次性写进数据库,避免频繁访问数据库。

如果是后者的需求,也就是说你对信息是要求实时更新的话,你可以先在程序里缓存一层,然后按照某个周期规律去写进数据库。(比如两分钟更新一次)这样的做法是既能保存数据的实时性(在允许的情况下存在误差,比如你的程序中途挂了,新的数据未写入数据库,你重启后再读出来的数据(上个周期保存的)肯定稍微滞后)但这避免你每次更新都去访问数据库。

第二个问题如果真的是机子的配置方面的问题的话,那对我来说很难给出一个令你满意的方案,不过有一个可能OK的方案就是,一般我们爬虫都是用广度优先的方法爬取,这就造成可能从一个节点扩散出几万个节点,再从下一个节点又扩散出几万个,所以干脆限制节点的扩散数量好了,反正如果路径是闭环的话(图),你始终会访问到的。

不过说起来,我反而考虑这种几十万个节点的该如何优化visited的列表?

希望能帮到你

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进