乐趣区

关于scrapy:scrapy二-递归爬取心理学词汇

一、工作背景

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

退出移动版