作者最近在研究复杂网络和知识图谱内容,准备爬取知网论文相关信息进行分析,包括标题、摘要、出版社、年份、下载数和被引用数、作者信息等。但是在爬取知网论文时,遇到问题如下:
  1.爬取内容总为空,其原因是采用动态加载的数据,无法定位,然后作者重新选取了CNKI3.0知网进行了爬取;
  2.但却不含作者信息,需要定位到详情页面,再依次获取作者信息,但是又遇到了新的问题。

一. 网站定位分析

知网网站如下:http://nvsm.cnki.net/kns/brief/default_result.aspx
比如搜索Python关键字,网页反馈内容如下所示,2681篇文章。

但是使用Selenium定位爬取的论文内容总为空,后来网上看到qiuqingyun大神的博客,发现另一个知网接口(CNKI3.0 知识搜索:http://search.cnki.net/)。
强烈推荐大家阅读他的原文:http://qiuqingyu.cn/2017/04/27/python实现CNKI知网爬虫/
搜索python的的图片如下,共3428篇论文。

接下来简单讲述分析的过程,方法都类似,通过DOM树节点分析定位元素。右键浏览器审查元素如下所示,每页包括15篇论文,标签位于<div class="wz_tab">下。

点击具体一条内容,如下所示,定位方法如下:
  1.标题定位<div class="wz_content">下的<h3>标签,并且可以获取URL;
  2.摘要定位<div class="width715">内容;
  3.出处定位<span class="year-count">节点下的title,年份通过正则表达式提取数据;
  4.下载次数和被引用数定位<span class="count">,提取数字第一个和第二个。

接下来直接讲述BeautifulSoup和Selenium两种方式的爬虫。

二. BeautifulSoup爬虫

BeautifulSoup完整代码如下:

# -*- coding: utf-8 -*-
import time
import re
import urllib
from bs4 import BeautifulSoup#主函数
if __name__ == '__main__':url = "http://search.cnki.net/Search.aspx?q=python&rank=relevant&cluster=all&val=&p=0"content = urllib.urlopen(url).read()soup = BeautifulSoup(content,"html.parser")#定位论文摘要wz_tab = soup.find_all("div",class_="wz_tab")num = 0for tab in wz_tab:#标题title = tab.find("h3")print title.get_text()urls = tab.find("h3").find_all("a")#详情超链接flag = 0for u in urls:if flag==0: #只获取第一个URLprint u.get('href')flag += 1#摘要abstract = tab.find(attrs={"class":"width715"}).get_text()print abstract#获取其他信息other = tab.find(attrs={"class":"year-count"})content = other.get_text().split("\n")"""由于无法分割两个空格,如:《怀化学院学报》  2017年 第09期故采用获取标题titile内容为出版杂志<span title="北方文学(下旬)">《北方文学(下旬)》  2017年 第06期</span>"""#出版杂志+年份cb_from = other.find_all("span")flag = 0 for u in cb_from:if flag==0: #获取标题print u.get("title")flag += 1mode = re.compile(r'\d+\.?\d*')number = mode.findall(content[0])print number[0] #年份#下载次数 被引次数mode = re.compile(r'\d+\.?\d*')number = mode.findall(content[1])if len(number)==1:print number[0]elif len(number)==2:print number[0], number[1]num = num + 1

输出如下图所示:

但是爬取的URL无法跳转,总是显示登录页面,比如“http://epub.cnki.net/kns/detail/detail.aspx?filename=DZRU2017110705G&dbname=CAPJLAST&dbcode=cjfq”,而能正确显示的是的“http://www.cnki.net/KCMS/detail/detail.aspx?filename=DZRU2017110705G&
dbname=CAPJLAST&dbcode=CJFQ&urlid=&yx=&v=MTc2ODltUm42ajU3VDN
mbHFXTTBDTEw3UjdxZVlPZHVGeTdsVXJ6QUpWZz1JVGZaZbzlDWk81NFl3OU16”。
显示如下图所示:

解决方法:这里我准备采用Selenium技术定位超链接,再通过鼠标点击进行跳转,从而去到详情页面获取作者或关键词信息。

三. Selenium爬虫

爬取代码如下:

# -*- coding: utf-8 -*-
import time
import re
import sys
import codecs
import urllib
from selenium import webdriver
from selenium.webdriver.common.keys import Keys            #主函数
if __name__ == '__main__':url = "http://search.cnki.net/Search.aspx?q=python&rank=relevant&cluster=all&val=&p=0"driver = webdriver.Firefox()driver.get(url)#标题content = driver.find_elements_by_xpath("//div[@class='wz_content']/h3")#摘要abstracts = driver.find_elements_by_xpath("//div[@class='width715']")#出版杂志+年份other = driver.find_elements_by_xpath("//span[@class='year-count']/span[1]")mode = re.compile(r'\d+\.?\d*')#下载次数 被引次数num = driver.find_elements_by_xpath("//span[@class='count']")#获取内容i = 0for tag in content:print tag.textprint abstracts[i].textprint other[i].get_attribute("title")number = mode.findall(other[i].text)print number[0] #年份number = mode.findall(num[i].text)if len(number)==1: #由于存在数字确实 如(100) ()print number[0]elif len(number)==2:print number[0],number[1]print ''i = i + 1tag.click()time.sleep(1)

输出如下所示:

>>>
网络资源辅助下的Python程序设计教学
本文对于Python学习网络资源做了归纳分类,说明了每类资源的特点,具体介绍了几个有特色的学习网站,就网络资源辅助下的Python学习进行了讨论,阐释了利用优质网络资源可以提高课堂教学效果,增加教学的生动性、直观性和交互性。同时说明了这些资源的利用能够方便学生的编程训练,使学生有更多的时间和机会动手编程,实现编程教学中...
电子技术与软件工程
2017
11 0Python虚拟机内存管理的研究
动态语言的简洁性,易学性缩短了软件开发人员的开发周期,所以深受研发人员的喜爱。其在机器学习、科学计算、Web开发等领域都有广泛的应用。在众多的动态语言中,Python是用户数量较大的动态语言之一。本文主要研究Python对内存资源的管理。Python开发效率高,但是运行效率常为人诟病,主要原因在于一切皆是对象的语言实现...
南京大学
2014
156 0

接下来是点击详情页面,窗口转化捕获信息,代码如下:

# -*- coding: utf-8 -*-
import time
import re
import sys
import codecs
import urllib
from selenium import webdriver
from selenium.webdriver.common.keys import Keys            #主函数
if __name__ == '__main__':url = "http://search.cnki.net/Search.aspx?q=python&rank=relevant&cluster=all&val=&p=0"driver = webdriver.Firefox()driver.get(url)#标题content = driver.find_elements_by_xpath("//div[@class='wz_content']/h3")#摘要abstracts = driver.find_elements_by_xpath("//div[@class='width715']")#出版杂志+年份other = driver.find_elements_by_xpath("//span[@class='year-count']/span[1]")mode = re.compile(r'\d+\.?\d*')#下载次数 被引次数num = driver.find_elements_by_xpath("//span[@class='count']")#获取当前窗口句柄  now_handle = driver.current_window_handle#获取内容i = 0for tag in content:print tag.textprint abstracts[i].textprint other[i].get_attribute("title")number = mode.findall(other[i].text)print number[0] #年份number = mode.findall(num[i].text)if len(number)==1: #由于存在数字确实 如(100) ()print number[0]elif len(number)==2:print number[0],number[1]print ''i = i + 1tag.click()time.sleep(2)#跳转 获取所有窗口句柄  all_handles = driver.window_handles  #弹出两个界面,跳转到不是主窗体界面  for handle in all_handles:  if handle!=now_handle:     #输出待选择的窗口句柄  print handle  driver.switch_to_window(handle)  time.sleep(1)  print u'弹出界面信息'  print driver.current_url  print driver.title  #获取登录连接信息  elem_sub = driver.find_element_by_xpath("//div[@class='summary pad10']")  print u"作者", elem_sub.text   print ''  #关闭当前窗口  driver.close()  #输出主窗口句柄  print now_handle  driver.switch_to_window(now_handle) #返回主窗口 开始下一个跳转

但部分网站还是出现无法访问的问题,如下所示:

最后作者拟爬取万方数据进行分析。
最后希望文章对你有所帮助,如果错误或不足之处,请海涵~
(By:Eastmount 2017-11-17 深夜12点  http://blog.csdn.net/eastmount/ )

[python爬虫] BeautifulSoup和Selenium简单爬取知网信息测试相关推荐

  1. [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

    这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...

  2. python爬虫实战(一)--爬取知乎话题图片

    原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...

  3. 爬虫练习(一)爬取知网、万方、维普文献标题、作者、刊物来源等信息

    刚刚开始学习Python,今天一周整,浏览了站内一些大侠博客相关内容,自己也尝试着写了一个爬虫. 直接借鉴了几位大侠的经验,如有冒犯之处恳请海涵. 先说说目的吧,本爬虫的目的是根据EXCEL文件的作者 ...

  4. 使用Python爬取知网信息

    使用Python爬取知网信息 import requests from urllib import request from lxml import etree import re import cs ...

  5. Python爬虫实战之一 - 基于Requests爬取拉勾网招聘信息,并保存至本地csv文件

    Python爬虫实战之二 - 基于Requests抓取拉勾网招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于小白,本 ...

  6. 从入门到入土:Python爬虫学习|实例练手|爬取LOL全英雄信息及技能||异步加载|初级难度反扒处理|寻找消失的API

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. python爬虫今日头条_python 简单爬取今日头条热点新闻(

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  8. python爬虫今日头条_python 简单爬取今日头条热点新闻(一)

    今日头条如今在自媒体领域算是比较强大的存在,今天就带大家利用python爬去今日头条的热点新闻,理论上是可以做到无限爬取的: 在浏览器中打开今日头条的链接,选中左侧的热点,在浏览器开发者模式netwo ...

  9. Python爬取知网信息——Python+selenium爬取知网信息(文献名,作者,来源,发表日期,文献类型)

    # -*- coding: utf-8 -*- #时间:2019.5.1 #运行环境Python 3.* ''' 1.运行此代码前需要先下载Chrome浏览器,去百度搜索下载 2.我是利用seleni ...

最新文章

  1. sync是同步还是非同步_MySQL半同步复制你可能没有注意的点
  2. php定义常量 define vs const
  3. hbase java框架_Hadoop学习笔记—15.HBase框架学习(基础实践篇)
  4. 四、linux编译规则文件Makefile
  5. 如何通过redisTemplate获得key的过期时间
  6. 请假系统特例规则详细设计
  7. python调用有道翻译API进行翻译
  8. 004. 看似“完美”的类目+属性
  9. python一阶差分_如何用Python对数据进行差分
  10. 不低调的巨人,史玉柱
  11. HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字)
  12. 经典兔子问题有一对兔子从出生后第3个月起每个月都生一对兔子
  13. 基础30讲 第九讲 一元函数积分学的几何应用
  14. 游戏建模次世代角色模型制作教程,内藏超级无敌干货!
  15. 关于印发《建造师执业资格制度暂行规定》的通知
  16. unturned服务器重置,服务器配置文件Config.json说明
  17. 【10月月赛T9】射命丸文
  18. 计算机一级簇型水平统计图,一级计算机考前水平试题及答案解析
  19. 程序员不得不学的操作系统知识(三)
  20. 一般IPTV/OTT直播点播系统都具有那些功能?

热门文章

  1. Oracle 如何修改列的数据类型
  2. 8.初探python之集合
  3. 『Linux基础 - 4 』linux常用命令(1)
  4. UVa 1626 (输出方案) Brackets sequence
  5. 站立会议-2014-04-14
  6. 饲料企业精细化生产管理方案
  7. When.js 1.8.0 发布,Promises/A 的实现
  8. JavaScript:prototype属性使用说明
  9. Http Handler 介绍(转)
  10. html2canvas导出地图,Leaflet OpenStreetMap使用html2canvas使用地图标记导出图像