python+爬虫+mysql+neo4j 基于知识图谱的古诗词推荐(一)

基于知识图谱的古诗词推荐-python+爬虫+mysql+neo4j(一)
这是个人最近大创项目的成果,整理一下发出来 。第一次写文
数据准备
这个网站内容还较为丰富,并且好像没有反爬,新手党的福音啊,我在最后爬取古诗的时候,连续访问了几万次都没有被封ip,简直了 。
一开始学爬虫的时候,都是使用BeautifulSoup和re的组合,但是对文本爬取的效率极低(是我不会用),后来就用Xpath语法了,贼快 。
import requestsfrom lxml import etree #导入相应的包url='https://www.xungushici.com/shici/1'#输入我们的urlget = requests.get(url).text # get(url) 得到我们的网页, text将源网页转化为字符串selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式
接下来就是找到要爬取的内容的xpath路径
用浏览器(我的是chrome)打开网页,按一下F12进入查看源码,找到要爬取的内容在源码的位置,以标题为例,对着内容点击右键,然后移到copy选项上,选择copy xpath,相应内容的xpath就会复制了
#/html/body/div/div/div[1]/div[1]/div/h3 #这是最初复制出来的xpath#//html/body/div/div/div[1]/div[1]/div/h3/text()#将它添头加尾selector.xpath('//html/body/div/div/div[1]/div[1]/div/h3/text()')#获取标题的内容
运行之后发现出来的是列表

python+爬虫+mysql+neo4j 基于知识图谱的古诗词推荐(一)

文章插图
那就改一下
selector.xpath('//html/body/div/div/div[1]/div[1]/div/h3/text()')[0]
所以要耐心的实验和细心的观察
标题搞定,朝代和作者都是类似的 。
但是正文又不一样了
python+爬虫+mysql+neo4j 基于知识图谱的古诗词推荐(一)

文章插图
它的每一句诗词都是分开的,也不能一个一个复制xpath,那会go die 的,观察一下它的第一句的xpath
#/html/body/div/div/div[1]/div[1]/div/div[1]/text()[1]
那我们就可以猜出它的整首诗的xpath因该是
#/html/body/div/div/div[1]/div[1]/div/div[1]/text()
(如果熟悉xpath语法的话,当我没说)
selector.xpath('//html/body/div/div/div[1]/div[1]/div/div[1]/text()')
添头加尾就可以获取正文了
python+爬虫+mysql+neo4j 基于知识图谱的古诗词推荐(一)

文章插图
发现是一个列表,那我们可以用join把它们给串起来
''.join(selector.xpath('//html/body/div/div/div[1]/div[1]/div/div[1]/text()'))
python+爬虫+mysql+neo4j 基于知识图谱的古诗词推荐(一)

文章插图
获取内容的过程就差不多了,为了方便之后的写代码,我们可以采取字典的形式把各个xpath给组织起来
Xpath={'标题':'/html/body/div/div/div[1]/div[1]/div/h3','朝代':'/html/body/div/div/div[1]/div[1]/div/p/a[1]','作者':'/html/body/div/div/div[1]/div[1]/div/p/a[2]','正文':'/html/body/div/div/div[1]/div[1]/div/div[1]',#需要合并'译文':'/html/body/div/div/div[1]/div[2]/div[2]/p[4]',#需要合并'注释':'/html/body/div/div/div[1]/div[2]/div[2]/p[4]','赏析':'/html/body/div/div/div[1]/div[3]/div[2]/p[%d]','创作背景':'/html/body/div/div/div[1]/div[4]/div[2]/p','关于诗人':'/html/body/div/div/div[2]/div[2]/div[2]/p'}Xpath_keys=['标题', '朝代', '作者', '正文','译文', '注释', '赏析', '创作背景','关于诗人']
最后获得的诗也用字典存储,爬取一首诗的完整代码
import requestsfrom lxml import etreeurl='https://www.xungushici.com/shici/1'#输入我们的urlget = requests.get(url).text # get(url) 得到我们的网页, text将源网页转化为字符串selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式Xpath={'标题':'/html/body/div/div/div[1]/div[1]/div/h3','朝代':'/html/body/div/div/div[1]/div[1]/div/p/a[1]','作者':'/html/body/div/div/div[1]/div[1]/div/p/a[2]','正文':'/html/body/div/div/div[1]/div[1]/div/div[1]',#需要合并'译文':'/html/body/div/div/div[1]/div[2]/div[2]/p[4]',#需要合并'注释':'/html/body/div/div/div[1]/div[2]/div[2]/p[4]','赏析':'/html/body/div/div/div[1]/div[3]/div[2]/p[%d]','创作背景':'/html/body/div/div/div[1]/div[4]/div[2]/p','关于诗人':'/html/body/div/div/div[2]/div[2]/div[2]/p'}Xpath_keys=['标题', '朝代', '作者', '正文','译文', '注释', '赏析', '创作背景','关于诗人']content={}for i in range(9):if i in [3,4,5]:ls=[]ls=selector.xpath('/'+Xpath[Xpath_keys[i]]+'/text()')content[Xpath_keys[i]] = ''.join(ls)elif i==6:ls=[]for j in range(1,17):path='/html/body/div/div/div[1]/div[3]/div[2]/p[%d]'%jls+=selector.xpath('/'+path+'/text()')content[Xpath_keys[i]] = ''.join(ls)else:content[Xpath_keys[i]] = selector.xpath('/'+Xpath[Xpath_keys[i]]+'/text()')[0]print(content)