一、工作背景
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 了解
其实很简略,在哪用都成,就是一个生成器