中国知网爬虫

中国知网爬虫中国知网爬虫一、知网介绍提起中国知网,如果你曾经写过论文,那么基本上都会与中国知网打交道,因为写一篇论文必然面临着各种查重,当然翟博士除外。但是,本次重点不在于写论文跟查重上,而在于我们要爬取知网上一些论文的数据,什么样的数据呢?我们举一个例子来说,在知网上,搜索论文的方式有很多种,但是对于专业人士来说,一般都会使用高级检索,因为直接去查找作者的话,容易查找到很多重名作者,所以我们本次的爬…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

中国知网爬虫

一、知网介绍

提起中国知网,如果你曾经写过论文,那么基本上都会与中国知网打交道,因为写一篇论文必然面临着各种查重,当然翟博士除外。但是,本次重点不在于写论文跟查重上,而在于我们要爬取知网上一些论文的数据,什么样的数据呢?我们举一个例子来说,在知网上,搜索论文的方式有很多种,但是对于专业人士来说,一般都会使用高级检索,因为直接去查找作者的话,容易查找到很多重名作者,所以我们本次的爬虫也是使用了高级检索(泛称)的爬虫,再具体就是专业检索,有助于我们唯一定位到作者。

中国知网爬虫

中国知网爬虫

二、常规步骤—页面分析

1.来到高级检索页面,以【AU=王长峰 AND FU=71271031】为例检索,结果如下:

中国知网爬虫

2.利用Xpath语法尝试获取这些数据,却发现一无所获。

中国知网爬虫

3.按照常理来说,即使是动态网页也可以利用Xpath语法提取到数据,只是在Python里面获取不到而已,所以在这里存在我们所不知道的问题。

三、知网反爬虫机制

常见的反爬虫机制一般有两种:

第一种是请求头反爬虫,这个也是最简单的,如果你不给定请求头,对方服务器就不会理你。需要设置的参数有User-Agent、Referer和Cookie。

第二种是动态网页,利用Ajax技术使用js接口来传递数据。

毫无疑问,对于数据非常金贵的中国知网来说,肯定使用了以上两种反爬方式,并且中国知网的js接口非常复杂,虽说复杂,但是只要你的内功要是足够强的话,还是能够分析得出来,但是对于不懂js以及web开发的朋友来说,这将是一个非常困难的事情,所以使用selenium来进行爬虫将是一件相对来说比较容易的事情。

另外,知网也不是仅仅只有这两层反爬虫机制,还有第三层,那就是iframe,由于很多朋友并没有做过网站开发,所以不太清楚了这是什么东西,导致即使发现自己的Xpath语法正确,也无法正确获取数据,从而怀疑人生,实际上,iframe比较常见的一种反爬虫机制,不过,如果你不知道这个东西,那么你就基本上无缘爬取中国知网了。

四、什么是iframe?

了解iframe前,你首先得知道一个网页是什么,没错,一个网页就是一个html页面。接下来我们从感性和源码两个方面来认识一下iframe.

1.感性认知。

一句话:一个完整的网页内部又嵌套了多个完整的网页,嵌套的页面就叫做iframe。

中国知网爬虫

2.网页源码认识。

比如一个非常简单的html页面(如下图所示),一个html页面是拥有一个完整的html标签的,也就是起始html【<html>】和闭合html【</html>】,而iframe则是在这一个完整的html标签里面又嵌套了一个完整的html标签。

<html>
<body>

<p>Python伊甸园</p>

</body>
</html>

中国知网爬虫

中国知网爬虫

3.看一下中国知网的源码,发现果然存在一个iframe,所以这个就是中国知网的第三种反爬虫机制。

中国知网爬虫

五、最后给出中国知网的爬虫

1.ways.py

import pandas as pd
#AU=王长峰 AND FU=71271031
def get_data():
    data_list = pd.read_excel(r"C:\Users\wwb\Desktop\科学基金.xls",
                              encoding='utf8')
    leaders = data_list.leader.values.tolist()
    codes = data_list.code.tolist()
    results = []
    for leader,code in zip(leaders,codes):
        result = "AU={} AND FU={}".format(leader,code)
        results.append(result)
    return results

#results = get_data()
#print(results)

2.main.py

from selenium import webdriver
from lxml import etree
import time
from ways import get_data
import random

def pasre_page(driver):
    html = etree.HTML(driver.page_source)
    trs = html.xpath('//tr[@bgcolor]')
    for tr in trs:
        title = tr.xpath('./td//a[@class="fz14"]/text()')[0]
        authors = tr.xpath('./td[@class="author_flag"]/a[@class="KnowledgeNetLink"]//text()')
        authors = "|".join(authors)
        source = tr.xpath('./td//a[@target="_blank"]/text()')[1]
        times = tr.xpath('./td[@align="center"]/text()')[0].strip()
        database = tr.xpath('./td[@align="center"]/text()')[1].strip()
        counted = tr.xpath('./td//span[@class="KnowledgeNetcont"]/a/text()')
        if len(counted) == 0:
            counted = 0
        else:
            counted = counted[0]
        downloadCount = tr.xpath('./td//span[@class="downloadCount"]/a/text()')
        if len(downloadCount) == 0:
            downloadCount = 0
        else:
            downloadCount = downloadCount[0]
        data = {
                "title":title,
                "authors":authors,
                "source":source,
                "times":times,
                "database":database,
                "counted":counted,
                "downloadCount":downloadCount,
                }
        datas.append(data)
        print(title)
    time.sleep(random.uniform(2,4))
    driver.switch_to.parent_frame()
    search_win = driver.find_element_by_id('expertvalue')
    search_win.clear()
    time.sleep(random.uniform(2,4))
    

driver_path = r"C:\Users\wwb\Desktop\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path)
url = "https://www.cnki.net/"
driver.get(url)

home_page = driver.find_element_by_id('highSearch')
home_page.click()
driver.switch_to_window(driver.window_handles[1])
search_page = driver.find_element_by_id('1_3')
search_page.click()
datas = []
results = get_data()
for result in results:
    search_win = driver.find_element_by_id('expertvalue')
    search_win.send_keys(result)
    search_btn = driver.find_element_by_id('btnSearch')
    search_btn.click()
    iframe = driver.find_element_by_id('iframeResult')
    driver.switch_to.frame(iframe) 
    time.sleep(random.uniform(2,4))
    pasre_page(driver)

3.部分结果展示:

中国知网爬虫


扫描二维码即可参与该课程,解锁更多爬虫知识:

中国知网爬虫

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159483.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot跨域配置「建议收藏」

    SpringBoot跨域配置「建议收藏」什么是跨域简单而言,跨域请求就是当一台服务器资源从另一台服务器(不同的域名或者端口)请求一个资源或者接口,就会发起一个跨域HTTP请求。举个简单的例子,从http://www.baidu.com,发送一个Ajax请求,请求地址是http://www.taobao.com下面的一个接口,这就是发起了一个跨域请求,在不做任何处理的情况下,显然当前跨域请求是无法被成功请求,因为浏览器基于同源策略会对跨域请求做一定的限制。产生跨域问题的条件例如:http://192.168.38.438:808

    2022年6月25日
    36
  • 饭否2359条之微信成长记录[通俗易懂]

    饭否2359条之微信成长记录[通俗易懂]微信成长时间表下面是百度百科的微信成长时间表:2011年1月21日,微信发布针对iPhone用户的1.0测试版。该版本支持通过QQ号来导入现有的联系人资料,但仅有即时通讯、分享照片和更换头像等简单功能。[6] 在随后1.1、1.2和1.3三个测试版中,微信逐渐增加了对手机通讯录的读取、与腾讯微博私信的互通以及多人会话功能的支持,截至2011年4月底,腾讯微信

    2022年5月15日
    48
  • Spark Streaming详解(重点窗口计算)

    Spark Streaming详解(重点窗口计算)前面有几篇关于SparkStreaming的博客,那会只是作为Spark入门,快速体验Spark之用,只是照着葫芦画瓢。本文结合Spark官网上SparkStreaming的编程指南对SparkStreaming进行介绍StreamingContext如同SparkContext一样,StreamingContext也是SparkStreaming应用程序通往Spark集群的通道,它的定义…

    2022年6月26日
    32
  • 毫秒和秒的换算在ms_秒,毫秒,微秒,纳秒,皮秒单位

    毫秒和秒的换算在ms_秒,毫秒,微秒,纳秒,皮秒单位文章目录[隐藏]前言毫秒微秒纳秒皮秒前言1秒=1000毫秒=1000*1000微秒=1000*1000*1000纳秒=1000*1000*1000*1000皮秒毫秒毫秒,符号ms(英语:millisecond).1毫秒等于一千分之一秒(10-3秒)0.000000001毫秒=1皮秒0.000001毫秒=…

    2022年9月3日
    2
  • 激光slam综述_激光slam原理

    激光slam综述_激光slam原理本篇是记录曾书格老师的课程《激光slam理论与实践》先贴一下个人总结(有理解的不正确的,麻烦指出来):第一章:激光SLAM简要介绍1、输出Metricalmap尺度地图,slam分为两种:基于滤波的filter-based的SLAM,和Graph-based的SLAM。2、(1)基于Graph-based的代表是cartographer,可以修复t时刻之前的误差分为两部…

    2022年8月23日
    6
  • httprunner(8)用例调用-RunTestCase[通俗易懂]

    httprunner(8)用例调用-RunTestCase[通俗易懂]前言一般我们写接口自动化的时候,遇到复杂的逻辑,都会调用API方法来满足前置条件,Pytest的特性是无法用例之间相互调动的,我们一般只调用自己封装的API方法。而httprunner支持用例之间

    2022年7月28日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号