更多课程 选择中心


Python培训

400-111-8989

Python爬虫百度学术文献--基于Python3.X

  • 发布: 枫叶
  • 来源:数量分析学习笔记
  • 时间:2017-11-20 17:19

为快速了解是否有用,直接先给出最终能得到的效果:

(如果没有,看它作甚)

这是我们得到的文献信息文件。

说明:

每次查询程序自动生成两个文件,一个是xlsx格式文件(方便整理信息),一个是txt文件,方便查看文献。

txt文件内容:

xlsx文件内容:

2. 文件名称是自动的生成的

既然偷懒自然要偷懒到底,所以,程序会根据你设定的查询文献篇数,中文还是英文,查询多少篇等等信心 自动生成对应的文件名称。

3. 能够查询什么内容呢。

这个和“高级搜索”的方式差不多,只是这里使用修改参数,可以一次查询任意篇文献信息并保存下来。 当然可以自定义查中文文献还是英文文献。

(说明:如果关键词是 两个以上中文词 的时候,查英文文献是查不到的,这个是学术百度自己的规则,这个“锅”不该本程序背)

另外,除了主题、起始页和终止页 必须填写外,其他参数,可以是空值。

(每页对应10篇文章信息)

4. 查询失败情况。

在不同查询的时候回存在少量的查询失败的情况,这个“锅”该扔给谁呢,扔给百度一半吧, 这主要是因为,百度学术呈现的信息来源较多,信息呈现的规范性不足,这也是比较百度学术比较大的一个“坑”。

例如:爬取 文章发表的文献名称时,有时候定义在“sc_journal”里面,但有时候又定义在"sc_conference"里面。

还有很多种情况,我发现的问题,我都兼容过了,不过还是存在一些其他参数放置位置不一致的情况,如果去查找所有的不一致规则,去修改程序兼容,工作量太大,所以,没有精力去完善,不过这样的情况相对较少,所以,谁有兴趣完善一下,那就太感谢了。

为了弥补这种情况,我专门设定了如果查询某一篇文献失败,就会显示文献信息对应的URL:

复制这个URL,到浏览器中打开:

双击-->检查(或 审查元素)-->Network-->刷新页面-->doc-->Preview

就可以得到如下界面:

查询失败文章的信息 就都在这个meta-di-info里面,可以点开补充。

(实际上,查询100篇信息,大概也就几篇文章会出现规则不一致,所以,问题不算严重,不是太严格的话,忽略不计也没有问题)

想想,其他应该也没什么了。

-------------------------------------------

利用Python3.6写了如何爬取CNKI上的主题文献信息,后来想想,似乎CNKI上的文献资源相对局限,百度学术上的文献资源更加丰富,因此,扩展了代码,用于百度学术资源的快速获取。

百度学术上能获取英文文献资源,是一个较大的优势,并且资料来源较为丰富。

--------------------------------------

完整代码如下(如果有人基于此程序程序扩展或完善,欢迎交流):

------------------------------------

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

"""

Created on Sat Nov 18 22:10:28 2017

@author: Liu Kuanbin

"""

#----------------------------------加载将会使用到的函数库

import requests # 读取网页

from lxml import etree # 用于解析网页

from openpyxl import Workbook # 创建表格并用于数据写入

import urllib

#------------------定义获取文章列表对应的链接的函数

def get_data(urllist,headers,i):

j=0 # 初始化j的取值

for urli in urllist:

try:

j=j+1

num=10*(i-pagestart)+j # 第多少篇

test='http://xueshu.baidu.com'+str(urli) # 单篇文章对应的页面网址

code=requests.get(test)

file=code.text.encode(code.encoding).decode('utf-8') # 对网页信息进行转化成为可以正常现实的 UTF-8格式

r=etree.HTML(file) # 获取网页信息,并且解析 使用xpath

#--- 因为存在不同的数据来源,有些来源无法获取数据,因此循环获取来源,直到可以获取

for k in range(0,8):

p1=r.xpath('//div[@class="allversion_content"]/span/a/@data-url')[k] # 选择不同的来源链接

p2=r.xpath('//div[@class="abstract_wr"]/p[2]/@data-sign')[0]

url_alli='http://xueshu.baidu.com/usercenter/data/schinfo?url='+p1+'&sign='+p2

if len(urllib.request.urlopen(url_alli).read())>100:

break

#---------------------------------------------------------------------

file=requests.get(url_alli).json()

ws.cell(row=num+1,column=1).value='第'+str(num)+'篇文章信息'

ws.cell(row=num+1,column=2).value=file["meta_di_info"]["sc_title"][0] # 获取 文章标题

ws.cell(row=num+1,column=3).value=file["meta_di_info"]["sc_author"][0]["sc_name"][0] # 获取第一作者

ws.cell(row=num+1,column=5).value=file["meta_di_info"]["sc_cited"][0] # 引用次数

ws.cell(row=num+1,column=6).value=file["meta_di_info"]["sc_year"][0] # 发表刊物时间

ws.cell(row=num+1,column=8).value=file["meta_di_info"]["sc_abstract"][0] # 获取 文章摘要

# 容易出问题的地方

# 1. 获取发表刊物

try:

journal=file["meta_di_info"]["sc_publish"][0]["sc_journal"][0] # 期刊

except:

journal=file["meta_di_info"]["sc_publish"][0]["sc_conference"][0]

ws.cell(row=num+1,column=4).value=str(journal)

# 3. 关键词

try:

keyw=file["meta_di_info"]["sc_keyword"]

key=''

for item in range(len(keyw)):

key=key+keyw[item]+','

except:

key=''

ws.cell(row=num+1,column=7).value=key # 关键词

# print('爬虫'+str(10*(pageend-pagestart+1))+'篇文章信息的第'+str(num)+'篇爬取成功!!')

print('爬虫第'+str(i)+'页中的第'+str(j)+'篇爬虫成功!!')

with open('百度学术关于'+'”'+liu_key+'"''前'+str(10*(pageend-pagestart+1))+'篇'+lang+'文献'+'按照'+paixu+'排序.txt','a',encoding='utf-8') as f: # 新建一个pinglun的txt文件,用二进制方式,编码方式 UTF-8 ,句柄名为f

f.write(file["meta_di_info"]["sc_title"][0]) # 文章题目

f.write('\n')

f.write(file["meta_di_info"]["sc_author"][0]["sc_name"][0]) # 作者

f.write('-')

f.write(file["meta_di_info"]["sc_year"][0]) # 年份

f.write('-')

f.write(file["meta_di_info"]["sc_cited"][0]) # 引用量

f.write('-')

f.write(str(journal)) # 文章发表刊物

f.write('\n')

f.write(file["meta_di_info"]["sc_abstract"][0]) # 获得文章摘要

f.write('\n\n')

except:

print('爬虫第'+str(i)+'页中的第'+str(j)+'篇爬虫失败')

print(url_alli)

#---创建表格,待接收数据信息---#---------------------------------------------------

wb = Workbook() # 在内存中创建一个workbook对象,而且会至少创建一个 worksheet

ws = wb.active #获取当前活跃的worksheet,默认就是第一个worksheet

ws.cell(row=1, column=1).value ="No"

ws.cell(row=1, column=2).value ="Title"

ws.cell(row=1, column=3).value ="Author"

ws.cell(row=1, column=4).value ="Journal"

ws.cell(row=1, column=5).value ="Cites"

ws.cell(row=1, column=6).value ="Year"

ws.cell(row=1, column=7).value ="Keywords"

ws.cell(row=1, column=8).value ="Abstart"

#-----------------------------------------------------------------------------参数设置区

wd='互联网' # 主题控制:此行设置搜索主题

english=0 # 关键词是 中文=0 英文=1

pagestart=1 # 起始页

pageend=2 # 终止页

sort='' # 排序控制:sc_cited=引用量 sc_time=时间 默认为相关性排序 (空值的时候 就是相关性排序查询了)

sc_tr=6 # 希望搜索文章语言类型: 1=中文 6= 英文

style='' # 类型: 1=期刊 ;2=学位论文; 3=会议论文; 4=图书; 5=专利;

autor='' # 作者姓名控制

#-----------------------------------------------------------------------------文件名称定义

liu_key=wd

if len(sort)>2:

paixu=sort

else:

paixu='相关性'

if sc_tr==1:

lang='中文'

elif sc_tr==6:

lang='英文'

#-----------------------------------------------------------------------------参数设置区

#-----排序处理

if len(sort)==0:

sort=''

else:

sort='&sort='+sort

#-----语言处理

if len(str(sc_tr))==0:

sc_tr=''

else:

sc_tr='&sc_tr='+str(sc_tr)

#-----文章筛选处理处理

if len(style)==0:

style=''

else:

style='&filter=sc_type={'+style+'}'

#-----文章类型筛选处理

if len(autor)==0:

autor=''

else:

autor='&tag_filter= authors:('+autor+')'

# 生成 URL

if english==0:

url='http://xueshu.baidu.com/s?wd='+wd+'&ie=utf-8'+sort+sc_tr+style+autor

elif english==1:

url='http://xueshu.baidu.com/s?wd='+wd+'&ie=utf-8'+sort+style+autor

#-----------------------------------------------------------------------------参数设置区

urlip = '#/nt/' # 提供代理IP的网站

headers={

'Referer':'http://hm.baidu.com/hm.js?43115ae30293b511088d3cbe41ec09',

'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',

'Cookie':'BAIDUID=D0CB679BEEF23F82EEDAF6DF18F4FEFF:FG=1; PSTM=1510625999; BIDUPSID=06E79C7EE33716F5BE38D223303FD8B2; HMACCOUNT=AF4DA2CBBA0B0EEC; pgv_pvi=8289640448; pgv_si=s5000054784; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDRCVFR[w2jhEs_Zudc]=mk3SLVN4HKm; PSINO=2; H_PS_PSSID=',

}

headers2={

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'

}

#------------------------------------------------------------------------------数据收集和处理

for i in range(pagestart,pageend+1):

# print('获得每一页里面文章的 urllist')

url_all=url+'&pn='+str(10*(i-1))

print(url_all)

#----------------------获得每一页的文章具体文章信息页面的链接

response=requests.get(url_all,headers=headers) # 获得网页源码 ,proxies=proxies

# print(utf16_response.decode('utf-16'))

file=response.text.encode(response.encoding).decode('utf-8') # 对网页信息进行转化成为可以正常现实的 UTF-8格式

r=etree.HTML(file) # 获取网页信息,并且解析 使用xpath

urllist=r.xpath('//div[@class="sc_content"]/h3/a[1]/@href') # 获得当前页所有文章的进入链接

# 获得每页urllist的文章信息,并且存到构建的表格中

get_data(urllist,headers,i)

wb.save('百度学术关于'+'”'+liu_key+'"'+'前'+str(10*(pageend-pagestart+1))+'篇'+lang+'文献'+'按照'+paixu+'排序.xlsx') # 最后保存搜集到的数据

本文内容转载自网络,本着分享与传播的原则,版权归原作者所有,如有侵权请联系我们进行删除!

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:Python爬虫爬取百度指数的关键词搜索指数教程
下一篇:Python老司机给上路新手的3点忠告

Python IDE推荐7个你可能会错过的Python IDE

Python面试题之Python中爬虫框架或模块的区别

2021年Python面试题及答案汇总详解

python数据分析,你需要这些工具

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省