博客
关于我
[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实现播放器(附完整源码)
    查看>>
    Objective-C实现操作MySQL(附完整源码)
    查看>>
    Objective-C实现操作注册表 (附完整源码)
    查看>>
    Objective-C实现攀登 n 级楼梯的不同方式算法(附完整源码)
    查看>>
    Objective-C实现改变图片亮度算法(附完整源码)
    查看>>
    Objective-C实现数乘以二multiplyByTwo算法(附完整源码)
    查看>>
    Objective-C实现数列的和(附完整源码)
    查看>>
    Objective-C实现数字图像处理算法(附完整源码)
    查看>>
    Objective-C实现数组切片(附完整源码)
    查看>>
    Objective-C实现数组去重(附完整源码)
    查看>>
    Objective-C实现数组循环右移三次(附完整源码)
    查看>>
    Objective-C实现数组的循环右移(附完整源码)
    查看>>
    Objective-C实现数组的循环左移(附完整源码)
    查看>>
    Objective-C实现数组逆置 (附完整源码)
    查看>>
    Objective-C实现数除以二divideByTwo算法(附完整源码)
    查看>>
    Objective-C实现整个字符串转换为小写字母算法(附完整源码)
    查看>>
    Objective-C实现整数N以内的质数算法(附完整源码)
    查看>>
    Objective-C实现文件传输(附完整源码)
    查看>>
    Objective-C实现文件分割(附完整源码)
    查看>>
    Objective-C实现文件拷贝(附完整源码)
    查看>>