本文共 4676 字,大约阅读时间需要 15 分钟。
最近在研究复杂网络和知识图谱内容时,准备爬取知网论文相关信息进行分析。包括标题、摘要、出版社、年份、下载数和被引用数、作者信息等。然而在爬取过程中遇到了不少问题。
问题一:内容总为空
最初尝试采用动态加载的数据进行爬取,但由于动态加载的原因,定位元素困难,导致爬取内容总为空。后来重新选取了CNKI3.0知网进行爬取。
问题二:缺少作者信息
虽然成功爬取了部分内容,但作者信息却缺失。因此需要定位到论文的详情页面,再依次获取作者信息。然而又遇到了新的问题。
知网网站结构如下:
比如搜索Python关键字,网页反馈内容如下所示,2681篇文章。
通过DOM树节点分析定位元素,右键浏览器审查元素可以看到,每页包括15篇论文,标签位于<div class="wz_tab">下。
点击具体一条内容,定位方法如下:
<div class="wz_content">下的<h3>标签,并且可以获取URL;<div class="width715">内容;<span class="year-count">节点下的title,年份通过正则表达式提取数据;<span class="count">,提取数字第一个和第二个。代码示例:
# -*- coding: utf-8 -*-import refrom bs4 import BeautifulSoupimport urlliburl = "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")for tab in wz_tab: title = tab.find("h3").get_text() print(title) urls = tab.find("h3").find_all("a") for u in urls: print(u.get('href')) abstract = tab.find(attrs={"class": "width715"}).get_text() print(abstract) other = tab.find(attrs={"class": "year-count"}) print(other.get_text()) num = tab.find(attrs={"class": "count"}) print(num.get_text()) 输出结果:
网网络资源辅助下的Python程序设计教学 本文对于Python学习网络资源做了归纳分类,说明了每类资源的特点,具体介绍了几个有特色的学习网站,就网络资源辅助下的Python学习进行了讨论,阐释了利用优质网络资源可以提高课堂教学效果,增加教学的生动性、直观性和交互性。同时说明了这些资源的利用能够方便学生的编程训练,使学生有更多的时间和机会动手编程,实现编程教学中...
电子技术与软件工程201711 0Python虚拟机内存管理的研究 动态语言的简洁性,易学性缩短了软件开发人员的开发周期,所以深受研发人员的喜爱。其在机器学习、科学计算、Web开发等领域都有广泛的应用。在众多的动态语言中,Python是用户数量较大的动态语言之一。本文主要研究Python对内存资源的管理。Python开发效率高,但是运行效率常为人诟病,主要原因在于一切皆是对象的语言实现...
南京大学2014156 0
代码示例:
# -*- coding: utf-8 -*-import timeimport refrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysurl = "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]")num = driver.find_elements_by_xpath("//span[@class='count']")i = 0for tag in content: print(tag.text) print(abstracts[i].text) print(other[i].get_attribute("title")) number = re.findall(r'\d+\.?\d*', other[i].text) print(number[0]) num_text = num[i].text number = re.findall(r'\d+\.?\d*', num_text) if len(number) == 1: print(number[0]) elif len(number) == 2: print(number[0], number[1]) tag.click() time.sleep(1) i += 1 输出结果:
网络资源辅助下的Python程序设计教学 本文对于Python学习网络资源做了归纳分类,说明了每类资源的特点,具体介绍了几个有特色的学习网站,就网络资源辅助下的Python学习进行了讨论,阐释了利用优质网络资源可以提高课堂教学效果,增加教学的生动性、直观性和交互性。同时说明了这些资源的利用能够方便学生的编程训练,使学生有更多的时间和机会动手编程,实现编程教学中...
电子技术与软件工程201711 0Python虚拟机内存管理的研究 动态语言的简洁性,易学性缩短了软件开发人员的开发周期,所以深受研发人员的喜爱。其在机器学习、科学计算、Web开发等领域都有广泛的应用。在众多的动态语言中,Python是用户数量较大的动态语言之一。本文主要研究Python对内存资源的管理。Python开发效率高,但是运行效率常为人诟病,主要原因在于一切皆是对象的语言实现...
南京大学2014156 0
代码示例:
# -*- coding: utf-8 -*-import timeimport refrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysurl = "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]")num = driver.find_elements_by_xpath("//span[@class='count']")now_handle = driver.current_window_handlei = 0for tag in content: print(tag.text) print(abstracts[i].text) print(other[i].get_attribute("title")) number = re.findall(r'\d+\.?\d*', other[i].text) print(number[0]) num_text = num[i].text number = re.findall(r'\d+\.?\d*', num_text) if len(number) == 1: print(number[0]) elif len(number) == 2: print(number[0], number[1]) tag.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(driver.current_url) print(driver.title) elem_sub = driver.find_element_by_xpath("//div[@class='summary pad10']") print("作者", elem_sub.text) driver.close() print(now_handle) driver.switch_to_window(now_handle) i += 1 在爬取过程中,主要采用了Selenium技术定位超链接,通过鼠标点击进行跳转,获取详情页面的作者信息。虽然部分网站访问出现异常,但通过多次尝试和调整浏览器设置,成功爬取了部分论文信息。
最终拟爬取万方数据进行分析。希望这篇文章对你有所帮助,如果错误或不足之处,请海涵~
转载地址:http://evq.baihongyu.com/