一、工作背景
1、简单回顾
上一期知识获取思路:从搜狗下载心理学词库,然后爬取这些词汇的百度百科页面。但是这些词汇只有3600个,现在我们要丰富实体,为下一阶段的命名实体识别做准备。
2、下一步工作计划
step1:爬取百度百科心理学分类下的所有名词;
step2:所有整合后的词汇,人为对其进行实体分类;
step3:爬取《壹心理》中的文章,分词、标注、命名实体识别(为关系抽取做准备)
ps:其实这个计划由于某些原因被放弃了(因为这篇文章是草稿,这段话是隔了两周后添加的)
3、这篇文章主要内容:
递归爬取下图(百度百科开放分类页面)中所有的标签及子类别下的所有标签(相关分类栏目除外):
目标: 上图中①②③中的条目是我们需要添加到词汇集合中的,②下的条目还需要进一步到下级链接去爬取。
注意: ③下的条目不够完备,需要去下一页爬取,下面会详细讲解步骤。
二、工作记录
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理解
其实很简单,在哪用都成,就是一个生成器
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。