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

时间:2017-12-05 16:24来源:成都达内 作者:成都达内 点击:

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

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

  (如果没有,看它作甚)

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

  成都Python培训

  说明:

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

  txt文件内容:

  成都Python培训

  xlsx文件内容:

  成都Python培训

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

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

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

  成都Python培训

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

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

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

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

  4. 查询失败情况。

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

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

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

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

  成都Python培训

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

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

  就可以得到如下界面:

  成都Python培训

  成都Python培训

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

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

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

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

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

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

  成都Python培训

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

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

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

  #!/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 = 'http://www.xicidaili.com/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培训,成都软件测试培训,成都php培训,成都java培训,成都安卓培训,成都会计实操培训,web前端开发,成都网络营销培训,成都it培训,成都编程培训,成都程序员培训等IT培训,专业的成都软件培训机构,专业师资授课,真实项目实战、零首付、低押金、名企就业,达内培训,成都Python培训学校www.cdtedu.com/pxkc/py/

(责任编辑:成都达内)

未获取畅言代码,错误消息:sign error

CopyRight © 2002-2016 成都达内科技职业技能培训学校 (www.cdtedu.com) 版权所有 成都达内 川公网安备 51019002000307号 网站地图