+-
*scrapy(二) 递归爬取心理学词汇

一、工作背景

1、简单回顾

上一期知识获取思路:从搜狗下载心理学词库,然后爬取这些词汇的百度百科页面。但是这些词汇只有3600个,现在我们要丰富实体,为下一阶段的命名实体识别做准备。

2、下一步工作计划

step1:爬取百度百科心理学分类下的所有名词;
step2:所有整合后的词汇,人为对其进行实体分类;
step3:爬取《壹心理》中的文章,分词、标注、命名实体识别(为关系抽取做准备)
ps:其实这个计划由于某些原因被放弃了(因为这篇文章是草稿,这段话是隔了两周后添加的)

3、这篇文章主要内容:

递归爬取下图(百度百科开放分类页面)中所有的标签及子类别下的所有标签(相关分类栏目除外):
image
目标: 上图中①②③中的条目是我们需要添加到词汇集合中的,②下的条目还需要进一步到下级链接去爬取。
注意: ③下的条目不够完备,需要去下一页爬取,下面会详细讲解步骤。

二、工作记录

1、此爬虫有一个根节点,所以start_urls内只有一个url:
start_urls.append('http://baike.baidu.com/fenlei/心理学')
2、想要迭代爬取一个标签下的所有标签:
main_sub=response.xpath("./div[@class='category-title ']/*") # 使用了星号,再:

for sub in main_sub:
    nexthref=sub.xpath("./@href")
    if(nexthref!=[]):
        nexthref=nexthref.extract()[0].strip()
        nexthref = response.urljoin(nexthref)
        yield response.follow(nexthref, callback=self.parse)
        print(nexthref)
    title=sub.xpath("string(.)").extract()[0].strip()
    if(title!="|" and title!="下级分类"):
        item['name']=title
        yield item

即可;
3、如上代码中,不论在程序任何位置,只要得到url,即可对其执行parse与yield:

细节

1、关于下一节内容如何爬取,附上解决问题的链接《scrapy中如何获取下一页链接》
注意:不能手动往start_urls中append()添加新的链接,因为在解析时候已经把队列存入内存。
2、两种在parse内继续爬取链接的方式

yield response.follow(nexthref, callback=self.parse)
yield scrapy.Request(nexthref, callback=self.parse)

3、解决一个bug
递归爬取链接无效:解决:1、第一次不能是因为allowed_domains的限制2、第二次是因为在div标签下有两个链接:<上一页>和<下一页>,果然结果只爬取了3个,第2页,第1页和第1页(因为scrapy的机制,爬过第二页所以不会重新爬取了)
4、对于yield item理解
其实很简单,在哪用都成,就是一个生成器