分析

首先,我们看一下入口的网站,在输入关键词搜索之前和之后它的网址并没有什么变化,所以我们不能通过直接请求它来得到文章。
搜索前

搜索后

所以,我们应该换一种思路。打开开发者工具后,我们可以看到如下的内容

通过对比,我们可以基本上确定这个网址就是我们要爬取的网站了。它的url是
https://kns.cnki.net/kns/brief/brief.aspx?pagename=ASP.brief_default_result_aspx&isinEn=1&dbPrefix=SCDB&dbCatalog=%e4%b8%ad%e5%9b%bd%e5%ad%a6%e6%9c%af%e6%96%87%e7%8c%ae%e7%bd%91%e7%bb%9c%e5%87%ba%e7%89%88%e6%80%bb%e5%ba%93&ConfigFile=SCDBINDEX.xml&research=off&t=1572329280069&keyValue=%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6&S=1&sorttype=

参数如下


那我们是不是通过构造这些参数就可以访问了我们要的文章呢?这并不一定,点击刚才的链接,我们可能会得到这样的信息

而要想通过访问链接就直接得到内容的话,你就需要像正常访问知网一样,输入关键词进行搜索。这时,知网的服务器才会认为服务器上存在了用户,才会给你数据。那这样的话,我们就应该找POST方法,并向它传递包括关键词在内的一系列参数就可以了。同样在开发者工具下,我们找到了这样的内容

通过名字以及传输的字段我们可以很清楚地知道这个就是我们要进行post的网址了。

代码实现

1. 发送post请求

 知网的formdata
zhiwangFormdata={'action':'','ua': '1.11','isinEn': '1','PageName': 'ASP.brief_default_result_aspx','DbPrefix': 'SCDB','DbCatalog': '中国学术文献网络出版总库','ConfigFile': 'SCDBINDEX.xml','db_opt': 'CJFQ,CDFD,CMFD,CPFD,IPFD,CCND,CCJD','txt_1_sel': 'SU$%=|','txt_1_value1': '','txt_1_special1':'%','his': '0'
}
 发送POST
session=requests.session()
post_url='https://kns.cnki.net/kns/request/SearchHandler.ashx'
zhiwangFormdata['txt_1_value1']=keyWord
response=session.post(post_url,data=zhiwangFormdata)

2. 通过Requests获得首页文章信息

 注:这里的pq用的是pyquery
url='https://kns.cnki.net/kns/brief/brief.aspx?pagename='+response.text+'&keyValue='+quote(keyWord)+'&S=1&sorttype='
response=session.get(url)
html=pq(response.text)
totalNumber=html.find('div.pageBar_min>div.pagerTitleCell').text().replace('找到','').replace('条结果','').strip()
#没有论文
if totalNumber=='0':print('没有找到')return
print('正在爬取第1页')
get_detail(html)
获得文章详细信息
def get_detail(html):allItems=html.find('table.GridTableContent>tr').items()count=0for item in allItems:if count==0:count=1continuen_l=item('td:nth-child(2)>a')#获取文章名字及链接dict={'name':n_l.text().replace('\n',''),'link':'https://kns.cnki.net'+n_l.attr('href').replace('/kns','/KCMS')}print(dict)

3.构造剩余页面url并爬取

在爬取到第一页后,得到的源代码中还有下一页的链接,通过提取以及构造,我们就可以一直爬取下去
 #找出总的页数totalPage = html.find('span.countPageMark').text().split('/')[1]totalPage=int(totalPage)#现在从第二页开始爬,一直爬到totalPage就行count=2#获得通用的linknextUrl='https://kns.cnki.net/kns/brief/brief.aspx'+html.find('div.TitleLeftCell>a').attr('href')while count<=totalPage:print('正在爬取第'+str(count)+'页')#构造URLtrueUrl=nextUrl.replace('curpage=2','curpage='+str(count))response=session.get(trueUrl)#出现验证码,对验证码进行处理if response.url!=trueUrl:yanzhenma(session,response.url)continuehtml=pq(response.text)get_detail(html)count += 1

4. 验证码处理

在爬取知网的过程中,我们还要对付验证码。这个地方我选择的是把验证码图片下载下来,在本地进行识别(我使用的是百度的智能云),在之后在向服务器发送一个带有识别结果的POST请求就行。
获取验证码图片,我们通过构造一个含有一个随机数的网址,发送请求,获得图片
而知网的POST验证码POST网页构造比较简单,直接将验证码网址加上你识别出来的结果就是你要请求网址了
#验证码处理函数
def yanzhenma(session,url):print('识别验证码中......')session.get(url)response = session.get('https://kns.cnki.net/kns/checkcode.aspx?t=' + quote("'" + str(random())))image = open('image.jpg', 'wb')image.write(response.content)image.close()result =verify('image.jpg').lower()#或者查看image.jpg手动输入#result=input().lower()print('验证码为'+result)requestUrl=url+'&vericode='+quote(result)session.get(requestUrl)
验证码识别函数
def convertimg(path):img = Image.open(path)width, height = img.sizewhile(width*height > 4000000):  # 该数值压缩后的图片大约 两百多kwidth = width // 2height = height // 2new_img=img.resize((width, height),Image.BILINEAR)format=path.split('.')[1]new_img.convert('RGB').save('temp.'+format)
def baiduOCR(path):APP_ID = '你的APP_ID'API_KEY = '你的API_KEY'SECRECT_KEY = '你的SECRECT_KEY'client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)format = path.split('.')[1]i = open('temp.'+format, 'rb')img = i.read()message = client.basicGeneral(img)   # 通用文字识别,每天 50 000 次免费#message = client.basicAccurate(img)   # 通用文字高精度识别,每天 800 次免费i.close()if len(message.get('words_result'))==0:return ''return message.get('words_result')[0]["words"]
def verify(path):convertimg(path)result=baiduOCR(path)return result

最后,附上完整代码

#知网
from pyquery import PyQuery as pq
from urllib.parse import quote
from random import random
from aip import AipOcr
from PIL import Image
import requests
import settings
zhiwangFormdata={'action':'','ua': '1.11','isinEn': '1','PageName': 'ASP.brief_default_result_aspx','DbPrefix': 'SCDB','DbCatalog': '中国学术文献网络出版总库','ConfigFile': 'SCDBINDEX.xml','db_opt': 'CJFQ,CDFD,CMFD,CPFD,IPFD,CCND,CCJD','txt_1_sel': 'SU$%=|','txt_1_value1': '','txt_1_special1':'%','his': '0'
}
def convertimg(path):img = Image.open(path)width, height = img.sizewhile(width*height > 4000000):  # 该数值压缩后的图片大约 两百多kwidth = width // 2height = height // 2new_img=img.resize((width, height),Image.BILINEAR)format=path.split('.')[1]new_img.convert('RGB').save('temp.'+format)
def baiduOCR(path):APP_ID = '你的APP_ID'API_KEY = '你的API_KEY'SECRECT_KEY = '你的SECRECT_KEY'client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)format = path.split('.')[1]i = open('temp.'+format, 'rb')img = i.read()message = client.basicGeneral(img)   # 通用文字识别,每天 50 000 次免费#message = client.basicAccurate(img)   # 通用文字高精度识别,每天 800 次免费i.close()if len(message.get('words_result'))==0:return ''return message.get('words_result')[0]["words"]
def verify(path):convertimg(path)result=baiduOCR(path)return result
def get_all(keyWord):session=requests.session()post_url='https://kns.cnki.net/kns/request/SearchHandler.ashx'settings.zhiwangFormdata['txt_1_value1']=keyWordresponse=session.post(post_url,data=zhiwangFormdata)url='https://kns.cnki.net/kns/brief/brief.aspx?pagename='+response.text+'&keyValue='+quote(keyWord)+'&S=1&sorttype='response=session.get(url)html=pq(response.text)totalNumber=html.find('div.pageBar_min>div.pagerTitleCell').text().replace('找到','').replace('条结果','').strip()#没有论文if totalNumber=='0':print('没有找到')returnprint('正在爬取第1页')get_detail(html)totalPage = html.find('span.countPageMark').text().split('/')[1]totalPage=int(totalPage)#现在从第二页开始爬,一直爬到totalPage就行count=2#获得通用的linknextUrl='https://kns.cnki.net/kns/brief/brief.aspx'+html.find('div.TitleLeftCell>a').attr('href')while count<=totalPage:print('正在爬取第'+str(count)+'页')#构造URLtrueUrl=nextUrl.replace('curpage=2','curpage='+str(count))response=session.get(trueUrl)if response.url!=trueUrl:yanzhenma(session,response.url)continuehtml=pq(response.text)get_detail(html)count += 1
def yanzhenma(session,url):print('识别验证码中......')session.get(url)response = session.get('https://kns.cnki.net/kns/checkcode.aspx?t=' + quote("'" + str(random())))image = open('image.jpg', 'wb')image.write(response.content)image.close()#result =yanzhen.verify('image.jpg').lower()# 或者查看image.jpg手动输入result=input().lower()print('验证码为'+result)requestUrl=url+'&vericode='+quote(result)session.get(requestUrl)
def get_detail(html):allItems=html.find('table.GridTableContent>tr').items()count=0for item in allItems:if count==0:count=1continuen_l=item('td:nth-child(2)>a')dict={'name':n_l.text().replace('\n',''),'link':'https://kns.cnki.net'+n_l.attr('href').replace('/kns','/KCMS')}print(dict)
def run():keyWord=input('请输入搜索词')get_all(keyWord)
run()

测试结果

Python3爬取知网文章相关推荐

  1. Python2 Python3 爬取赶集网租房信息,带源码分析

    *之前偶然看了某个腾讯公开课的视频,写的爬取赶集网的租房信息,这几天突然想起来,于是自己分析了一下赶集网的信息,然后自己写了一遍,写完又用用Python3重写了一遍.之中也遇见了少许的坑.记一下.算是 ...

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

    作者最近在研究复杂网络和知识图谱内容,准备爬取知网论文相关信息进行分析,包括标题.摘要.出版社.年份.下载数和被引用数.作者信息等.但是在爬取知网论文时,遇到问题如下:   1.爬取内容总为空,其原因 ...

  3. 使用Scrapy、PhantomJS和Selenium爬取知网文献摘要

    使用Scrapy.PhantomJS和Selenium爬取知网文献摘要.以下例子用于爬取"医药卫生科技"类文献摘要. 1.使用Scrapy创建项目 scrapy startproj ...

  4. java+selenium爬取知网数据

    使用selenium工具爬取知网相关数据,思路:根据几个关键词搜索出相关的内容,然后爬取列表中所有论文的访问链接. 注意:直接爬取的链接是不能用的,需要自己拼接一下.具体看代码.新手,代码写的有点乱. ...

  5. python爬虫爬取知网

    python爬虫爬取知网 话不多说,直接上代码! import requests import re import time import xlrd from xlrd import open_wor ...

  6. 爬虫练习(一)爬取知网、万方、维普文献标题、作者、刊物来源等信息

    刚刚开始学习Python,今天一周整,浏览了站内一些大侠博客相关内容,自己也尝试着写了一个爬虫. 直接借鉴了几位大侠的经验,如有冒犯之处恳请海涵. 先说说目的吧,本爬虫的目的是根据EXCEL文件的作者 ...

  7. python抓取文献关键信息,python爬虫——使用selenium爬取知网文献相关信息

    python爬虫--使用selenium爬取知网文献相关信息 写在前面: 本文章限于交流讨论,请不要使用文章的代码去攻击别人的服务器 如侵权联系作者删除 文中的错误已经修改过来了,谢谢各位爬友指出错误 ...

  8. 爬取知网博硕士文献及中国专利存到mysql数据库中的代码及其注意事项

    今天因为需要做了一个爬取知网博硕士论文及中国专利的爬虫,在制作的过程中遇到了不少坑,在网上查资料时都是很老的资源,在现在知网的反爬虫下不起作用,所以我来写这篇文章来供大家参考.(这篇文章主要介绍通过改 ...

  9. Scrapy框架+Gerapy分布式爬取海外网文章

    Scrapy框架+Gerapy分布式爬取海外网文章 前言 一.Scrapy和Gerapy是什么? 1.Scrapy概述 2.Scrapy五大基本构成: 3.建立爬虫项目整体架构图 4.Gerapy概述 ...

最新文章

  1. AutoCAD.NET API 最新(2012)教程下载及在线视频教程DevTV 第8讲 用户界面
  2. linux下raid5的配置
  3. iOS 面试之Block
  4. 计算机 教育 研究生分数查询,专业硕士在考试结束之后几周内可以去查分呢现在只能是通过电脑来查分了吗...
  5. Struts2源码学习(一)——Struts2中的XWork容器
  6. 系统引导的过程一般包括如下几步: 【 】_20190317工控维修日记(西门子系统第二讲)...
  7. 百度SDN实践与思考
  8. tomcat https 启用8443加证书
  9. 微信小程序云开发教程-WXML入门-常用组件和属性
  10. debian samba出错:set_variable_helper(yes ): value is not boolean!
  11. LINUX上,2080/1080卡不要混插
  12. 面试题 | ISP 图像处理算法工程师
  13. 68pin SCSI接头针脚排序
  14. 计算机英语论文1000,1000字的英语论文范文大全
  15. edge浏览器设置启动时默认打开新标签页
  16. 高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版
  17. windows10添加键盘_如何在Windows中免费添加键盘并用您的语言书写
  18. Hadoop安装与使用
  19. AppImage应用启动报错:Cannot mount AppImage, please check your FUSE setup
  20. 一篇文章读懂身份技术发展简史

热门文章

  1. 1.FHS(Filesystem Hierarchy Standard)文件系统层级标准--重点
  2. java 如何级联删除_Java学习-040-级联删除目录中的文件、目录
  3. Java黑皮书课后题第6章:**6.30(游戏:双骰子)掷双骰子游戏是某场景中非常流行的骰子游戏。编写程序,玩这个游戏的变种
  4. 中文日语对照自我介绍
  5. echart4数据管理组件dataset学习
  6. 17.5 亿美金只烧了 6 个月,最受瞩目的短视频应用「爆毙而终」
  7. Linux进程管理之“四大名捕”!
  8. redis:01入门指南以及在springboot中使用redis
  9. 万字长文:Kubernetes 创建 Pod 时,背后到底发生了什么?
  10. vue 分页表格数据导出