脚本宝典收集整理的这篇文章主要介绍了基于selenium的知网爬虫(实测可用),脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
虽然是20年写的,但最近改了改还能用。 ?怎么还审核不通过,删了些图片,加了个代码。 项目地址:
https://github.com/stay-leave/CNKI-selenium-crawler
配置:
本项目使用selenium模块,浏览器使用的是火狐。
1.下载geckodriver,地址https://github.com/mozilla/geckodriver/releases
2.将适配的安装包放置在火狐浏览器的安装路径、Python的Stricpts文件夹
3.将火狐的安装路径添加到电脑环境变量的用户变量的path中。
功能:
1.社科基金项目数据爬取 代码样例:
#coding='utf-8'
import requests
import re
import xlwt
headers = {
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'en-US,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Referer': 'https://www.baidu.com/',
'Connection': 'keep-alive',
}
url_1='http://fz.people.com.cn/skygb/sk/index.php/index/seach/'
url_2='?pznum=&xmtype=0&xktype=%E5%9B%BE%E4%B9%A6%E9%A6%86%E3%80%81%E6%83%85%E6%8A%A5%E4%B8%8E%E6%96%87%E7%8C%AE%E5%AD%A6&xmname=&lxtime=0&xmleader=&zyzw=0&gzdw=&dwtype=0&szdq=0&ssxt=0&cgname=&cgxs=0&cglevel=0&jxdata=0&jxnum=&cbs=&cbdate=0&zz=&hj='
url_0=list(range(1,3))#生成一个1到93的数字列表
urls=[]#网址列表
def require(url):
"""获取网页源码
"""
response = requests.get(url, headers=headers)
print(response.status_code)#状态码
print(response.encoding)#首选编码
'''print(response.apparent_encoding)#备选编码'''
#response.encoding=response.apparent_encoding
html=response.text#源代码文本
return html
def cut(list,n):
"""将列表按特定数量切分成小列表"""
for i in range(0,len(list),n):
yield list[i:i+n]
for i in url_0:
i=url_1+str(i)+url_2
urls.append(i)
def get_infor(one_url):
'''进入一个页面,获取该页面的信息,返回列表的列表all'''
html=require(one_url)
result_1=re.findall('<table width="100%" border="0" cellpadding="0" cellspacing="0">(.*?)</table>',html,re.S)#进入table
result_2=re.findall(' <tr>(.*?)</tr>',str(result_1),re.S)#找到所有tr标签
#项目编号、立项时间、项目负责人、所属系统
i_1=re.findall('<td width="90">(.*?)</td>',str(result_2),re.S)#找到所有td width=90的标签,得出四种不同的属性,项目编号、立项时间、项目负责人、所属系统
i_2=re.findall('<span title.*?>(.*?)</span>',str(i_1),re.S)#取出字符,i_2是一个列表
#项目类别、学科分类、专业职务
i_3=re.findall('<td width="70">(.*?)</td>',str(result_2),re.S)#找到所有td width=70的标签,得出三种不同的属性,项目类别、学科分类、专业职务
i_4=re.findall('<span title.*?>(.*?)</span>',str(i_3),re.S)#取出字符
#项目名称
i_5=re.findall('<td width="320"><span.*?>(.*?)</span></td>',str(result_2),re.S)#找到所有td width=320的标签,得出项目名称
#工作单位
i_6=re.findall('<td width="150"><span.*?>(.*?)</span></td>',str(result_2),re.S)#找到所有td width=150的标签,得出工作单位
#单位类别
i_7=re.findall('<td width="80"><span.*?>(.*?)</span></td>',str(result_2),re.S)#找到所有td width=80的标签,得出单位类别
#所在地
i_8=re.findall('<td width="100"><span.*?>(.*?)</span></td>',str(result_2),re.S)#找到所有td width=100的标签,得出所在省市区
l_1=[]
l_2=[]
for i in cut(i_2,4):#四种属性的值列表
l_1.append(i)
for i in cut(i_4,3):#三种属性的值列表
l_2.append(i)
all=[]#总的结果
#列表拼接
for i in range(len(i_8)):
all.append(l_1[i]+l_2[i]+i_5[i:i+1]+i_6[i:i+1]+i_7[i:i+1]+i_8[i:i+1])
return all
"""保存为excel"""
f=xlwt.Workbook()
sheet1=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet1.write(0,0,'项目编号')
sheet1.write(0,1,'立项时间')
sheet1.write(0,2,'项目负责人')
sheet1.write(0,3,'所属系统')
sheet1.write(0,4,'项目类别')
sheet1.write(0,5,'学科分类')
sheet1.write(0,6,'专业职务')
sheet1.write(0,7,'项目名称')
sheet1.write(0,8,'工作单位')
sheet1.write(0,9,'单位类别')
sheet1.write(0,10,'所在地')
i=1
alls=[]
for one_url in urls:
alls.append(get_infor(one_url))#全部页的数据分为一个93个子列表的列表
for all in alls:#遍历每一页
for data in all:#遍历每一行
for j in range(len(data)):#取每一单元格
sheet1.write(i,j,data[j])#写入单元格
i=i+1#往下一行
f.save('测试文件.xls')
#保存所有
2.论文的元数据爬取
由于我在学习中是将关键词按年份聚类的,所以没有对单个论文的关键词作分隔。都是一个基金的所有产出论文的,可以在源码中修改。3.论文的参考和引证的期刊文献爬取
注意事项:
1.任意网络均适用,不需要购买知网。
2.可以按原始代码从社科基金项目开始直到产出论文的参考、引证文献的爬取。
3.爬取速度可以调节,修改程序里的t.sleep()中的数值即可,建议1到6之间,可以采用random随机。
4.论文元数据爬取需要严格按照三个程序的顺序,即题名等、被引数等、论文地址。
5.所有结果均以excel方式保存,注意看文件路径。本项目中基金号为主键。
6.仅作学习使用。
以上是脚本宝典为你收集整理的基于selenium的知网爬虫(实测可用)全部内容,希望文章能够帮你解决基于selenium的知网爬虫(实测可用)所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。