scrapy基础博客:Python之scrapy模块基础解析(一)
自然语言处理:分词(断词)与关键词提取方法(一)
自然语言处理:问答语料生成词汇表,词转向量(三)
1 网页分析
1.0 关键词提取网页分析
打开网页:https://www.baidu.com/s?wd=自然语言处理
(1) 打开关键词搜索页面,找到含有关键词如自然语言处理
有效链接标签;
(2) 依据链接位置,反推链接所在的html
层次,获取该层次的内容,实例的层次为div class="result c-container "中h3的a标签.
response.xpath('//div[contains(@class, "c-container")]/h3/a/@href')
其中@为提取属性内容;
1.2 分页网页分析
(1) 分页信息在块div id="page"的a标签中,a的href只有上一页和下一页有class=“n”,因为class相同,所以不能直接通过class区分连接,因此获取所有分页链接的list,提取列表最后一个元素,即为下一页的链接,可持续获取数据;
(2) 依据下一页的链接,设置循环获取数据,使用follow函数即可;
next_page = response.xpath('//div[@id="page"]/a/@href')
next_page = next_page[-1]
response.follow(next_page, self.parse)
2 crawl爬取信息
- Demo
baidu.py
import scrapy
from w3lib.html import remove_tags
class BaiduSearchSpider(scrapy.Spider):
# spider名称
name = "info_search"
allowed_domains = ["baidu.com"]
# 起始链接
start_urls = [
"https://www.baidu.com/s?wd=自然语言处理"
]
# 解析函数
def parse(self, response):
# 关键词链接
hrefs = response.xpath('//div[contains(@class, "c-container")]/h3/a/@href').extract()
# 关键词信息链接列表
containers = response.selector.xpath('//div[contains(@class, "c-container")]')
print("Containers: {}".format(containers))
for container in containers:
# 关键词链接
href = container.xpath('h3/a/@href').extract()[0]
# 标题
title = remove_tags(container.xpath('h3/a').extract()[0])
# 摘要
c_abstract = container.xpath('div/div/div[contains(@class, "c-abstract")]').extract()
abstract = ""
if len(c_abstract) > 0:
# 删除不必要的标签
abstract = remove_tags(c_abstract[0])
# 爬取链接信息
request = scrapy.Request(href, callback=self.parse_url)
request.meta['title'] = title
request.meta['abstract'] = abstract
yield request
# 分页信息
next_page = response.xpath('//div[@id="page"]/a/@href').extract()
next_page = next_page[-1]
if next_page is not None:
yield response.follow(next_page, self.parse)
# 输出信息
def parse_url(self, response):
print("URL: {}".format(response.url))
print("Title: {}".format(response.meta['title']))
print("Abstract: {}".format(response.meta['abstract']))
# 含关键词信息的内容,使用remove_tags删除标签标记如<br>
content = remove_tags(response.xpath('//body').extract()[0])
print("Content length: {}".format(len(content)))
print("Content: {}".format(content))
- Run
scrapy crawl info_search -o question.json -t json
- Result
2019-02-14 14:25:20 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://data.aliyun.com/product/nlp> from <GET http://www.baidu.com/link?url=T37RDPpOypeFv0w6xf43-m8QlMrhF98T_XeNWPpGc4fbh0zJysoakdRVr81Od7oX>
2019-02-14 14:25:20 [scrapy.extensions.logstats] INFO: Crawled 13 pages (at 9 pages/min), scraped 0 items (at 0 items/min)
2019-02-14 14:25:23 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.oschina.net/project/tag/305/nlp> (referer: None)
URL: https://www.oschina.net/project/tag/305/nlp
Title: 自然语言处理 - 开源软件 - 开源中国
1、概括来说,NLP,除了NLU(图中红框部分),还包含理解之前的处理阶段、和理解之后的应用阶段。也就是说,NLU是NLP的子集——他们不是并集、更不是等价的概念。这里,是很多AI从业人员都容易混淆的,大家可以先记住这个概念关系:NLU是NLP的子集。
2、其他:
1)左边最底部,是最基础的大数据、机器学习和语言学(Linguistics);
2)往上看,是知识图谱(Knowledge Graph),其中包含了实体图谱、注意力图谱和意图图谱。
3)再往上,左侧是语言理解(Language Understanding),右侧是语言生成(Language Generation)——
语言理解,包含了Query理解、文本理解、情感分析(Sentiment Analysis)等,还有词法(Lexical)、句法(Syntax)和语义(Semantic)等不同层次的分析。
语言生成,包含了写作、阅读理解等等。
3 总结
(1) 爬取关键词文本两步:获取关键信息链接,获取分页信息链接;
(2) 初步清洗数据:删除多余的标签如<br>
使用remove_tags()
方法;
[参考文献]
[1]https://docs.scrapy.org/en/latest/intro/tutorial.html?highlight=response.follow
[2]http://www.scrapyd.cn/doc/179.html
[3]http://www.shareditor.com/blogshow/?blogId=76
[4]https://blog.csdn.net/Xin_101/article/details/87165132