博客
关于我
[python爬虫] BeautifulSoup和Selenium简单爬取知网信息测试
阅读量:80 次
发布时间:2019-02-25

本文共 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">,提取数字第一个和第二个。

  • BeautifulSoup爬虫

    代码示例:

    # -*- 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


    Selenium爬虫

    代码示例:

    # -*- 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/

    你可能感兴趣的文章
    Objective-C实现hill climbing爬山法用来寻找函数的最大值算法(附完整源码)
    查看>>
    Objective-C实现Hopcroft算法(附完整源码)
    查看>>
    Objective-C实现hornerMethod霍纳法算法(附完整源码)
    查看>>
    Objective-C实现Http Post请求(附完整源码)
    查看>>
    Objective-C实现http下载文件 (附完整源码)
    查看>>
    Objective-C实现Http协议下载文件(附完整源码)
    查看>>
    Objective-C实现ID3贪心算法(附完整源码)
    查看>>
    Objective-C实现IIR 滤波器算法(附完整源码)
    查看>>
    Objective-C实现IIR数字滤波器(附完整源码)
    查看>>
    Objective-C实现insertion sort插入排序算法(附完整源码)
    查看>>
    Objective-C实现integer partition整数分区算法(附完整源码)
    查看>>
    Objective-C实现integerPartition整数划分算法(附完整源码)
    查看>>
    Objective-C实现interpolation search插值搜索算法(附完整源码)
    查看>>
    Objective-C实现Interpolation search插值查找算法(附完整源码)
    查看>>
    Objective-C实现intersection交集算法(附完整源码)
    查看>>
    Objective-C实现intro sort内省排序算法(附完整源码)
    查看>>
    Objective-C实现inverse matrix逆矩阵算法(附完整源码)
    查看>>
    Objective-C实现inversions倒置算法(附完整源码)
    查看>>
    Objective-C实现isalpha函数功能(附完整源码)
    查看>>
    Objective-C实现islower函数功能(附完整源码)
    查看>>