关闭

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

4915人阅读 评论(13) 收藏 举报
分类:

作者最近在研究复杂网络和知识图谱内容,准备爬取知网论文相关信息进行分析,包括标题、摘要、出版社、年份、下载数和被引用数、作者信息等。但是在爬取知网论文时,遇到问题如下:
  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 = 0
    for tab in wz_tab:
        #标题
        title = tab.find("h3")
        print title.get_text()
        urls = tab.find("h3").find_all("a")
        #详情超链接
        flag = 0
        for u in urls:
            if flag==0: #只获取第一个URL
                print 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 += 1
        mode = 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 = 0
    for tag in content:
        print tag.text
        print abstracts[i].text
        print 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 + 1
        tag.click()
        time.sleep(1)
输出如下所示:
>>> 
网络资源辅助下的Python程序设计教学 
本文对于Python学习网络资源做了归纳分类,说明了每类资源的特点,具体介绍了几个有特色的学习网站,就网络资源辅助下的Python学习进行了讨论,阐释了利用优质网络资源可以提高课堂教学效果,增加教学的生动性、直观性和交互性。同时说明了这些资源的利用能够方便学生的编程训练,使学生有更多的时间和机会动手编程,实现编程教学中...
电子技术与软件工程
2017
11 0

Python虚拟机内存管理的研究 
动态语言的简洁性,易学性缩短了软件开发人员的开发周期,所以深受研发人员的喜爱。其在机器学习、科学计算、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 = 0
    for tag in content:
        print tag.text
        print abstracts[i].text
        print 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 + 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 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/ )



3
0
查看评论

python 爬取知网url

由于知网存在异步加载,爬取需要获得queryid,cookies等代码如下:#coding:utf-8 ''' Created on 2016-8-15@author: 刘帅 ''' import urllib2 from bs4 import Bea...
  • weixin_36541072
  • weixin_36541072
  • 2016-12-19 13:56
  • 2289

使用python爬虫抓取学术论文

介绍这是一个很小的爬虫,可以用来爬取学术引擎的pdf论文,由于是网页内容是js生成的,所以必须动态抓取。通过selenium和chromedriver实现。可以修改起始点的URL从谷粉搜搜改到谷歌学术引擎,如果你的电脑可以翻墙。
  • lin370
  • lin370
  • 2015-03-25 20:19
  • 7958

python爬取知网

最近在练习写爬虫的时候,真巧同学的女朋友有需求,大概是爬取知网内的几千个主题的数据,每一个主题的条数记录有几条的到几千条的不等,总来的来说也算是个上万数量级的爬虫了,分析了下知网,发现使用专业检索,可以完成我的目标,然后通过chrome的developer tools大概分析了下了请求数据包,发现知...
  • aricover
  • aricover
  • 2017-12-27 13:40
  • 145

httpclient爬取中国知网

  • 2014-06-20 11:10
  • 2.13MB
  • 下载

爬虫爬取谷歌专利文献

功能:实现爬取谷歌专利文献 计算机行业的都知道,世界范围内互联网巨头非google莫属,最近几年在计算机领域具有很大轰动的论文大部分出自google,前一段时时间更是因为google的AlphaGo击败围棋冠军李世石名噪一时,google更闻名于搜索引擎,被称为世界最强大搜索引擎,同样google的...
  • liberty_zheng
  • liberty_zheng
  • 2016-05-04 10:29
  • 2762

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

这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对比,你可以进一步加深Python爬虫的印象。同时,文章给出了我以前关于爬虫的基础知识介绍,方便新手进...
  • Eastmount
  • Eastmount
  • 2016-12-30 00:19
  • 8593

使用Python+selenium+BeautifulSoup抓取动态网页的关键信息

程序目的:根据特定的SNP list, 在千人基因组数据库中爬取CHB人群的等位基因频率信息。 因为网页是动态的数据,嵌入了JavaScript代码,因此借助selenium来爬取信息。 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。Beautiful Sou...
  • VincentLuo91
  • VincentLuo91
  • 2016-10-27 16:39
  • 5857

Python爬虫小实践:使用BeautifulSoup+Request爬取CSDN博客的个人基本信息

好久都没有动Python了,自从在网上买了《Python网络数据采集》这本书之后一直没有时间写自己的小的Demo,今天再网络上无意中看见 http://www.cnblogs.com/mfryf/p/3695844.html: 开发记录_自学Python写爬虫程序爬取csdn个人博客信息 这篇...
  • HW140701
  • HW140701
  • 2017-02-13 14:29
  • 1982

Python爬虫实例——基于BeautifulSoup和requests实现

爬取的目标网页:http://www.qianlima.com/zb/area_305/ 这是一个招投标网站,我们使用python脚本爬取红框中的信息,包括链接网址、链接名称、时间等三项内容。 使用到的Python库:BeautifulSoup、requests 代码如下: # -*...
  • u013547284
  • u013547284
  • 2017-05-16 09:10
  • 858

python爬虫----爬取糗事百科

一个练手的小爬虫 熟悉了下requests,BeautifulSoup,正则表达式的操作 本来不想放上来,因为感觉写的不好,放上来方便自己以后修改下 import requests from bs4 import BeautifulSoup import re def gethtml...
  • qq_32511479
  • qq_32511479
  • 2017-07-13 14:00
  • 257
    个人资料
    • 访问:2326230次
    • 积分:21610
    • 等级:
    • 排名:第413名
    • 原创:270篇
    • 转载:10篇
    • 译文:0篇
    • 评论:1651条
    个人博客
    作者:杨秀璋
    学历:本科-北京理工大学
               硕士-北京理工大学
    现任教于贵财财经大学信息学院
    http://www.eastmountyxz.com

    简介:自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真心传授给自己的学生,帮助更多陌生人。

    贵州纵美路迢迢,
    为负劳心此一遭。
    收得破书三四本,
    也堪将去教尔曹。

    娜美人生,醉美生活。
    他和她经历风雨,慢慢变老。
    博客专栏
    牛人博客
    最新评论