刚刚开始学习Python,今天一周整,浏览了站内一些大侠博客相关内容,自己也尝试着写了一个爬虫。

直接借鉴了几位大侠的经验,如有冒犯之处恳请海涵。

先说说目的吧,本爬虫的目的是根据EXCEL文件的作者名字信息,以及设定的单位信息来自动循环爬取文章题目、作者姓名、期刊名称、发表时间(刊次)、下载量、被引量等信息并保存到CSV文件中。

用到了chromedriver、selenium、xlrd、pandas

因为我爬取的作者发文量比较少,万方、维普部分,没有做分页查询。

因为太懒,查询函数没有做成模块,我知道这是一种不好的习惯,以后我会改(也不一定)。

三个查询函数中所用的获取目标信息的方式不是很统一。

还请大家谅解一个快40的人,写代码写的这么乱。

代码仅供大家学习交流,请勿用于违法用途,如有侵权请联系我,我会及时删除。

代码还有很多不足的地方,请大家批评指正!

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import xlrd
from urllib.parse import urljoin
import time
import random
import json
import csv
import pandas as pd
from itertools import zip_longest
# 设置谷歌驱动器的环境
options = webdriver.ChromeOptions()
# 设置chrome不加载图片,提高速度
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
# 创建一个谷歌驱动器
browser = webdriver.Chrome()
data_list = [] # 声明一个全局列表,用来存储字典
def start_spider(aurname):  #爬取知网信息# 请求urlurl = 'https://kns.cnki.net/kns/brief/result.aspx?dbprefix=SCDB&crossDbcodes=CJFQ,CDFD,CMFD,CPFD,IPFD,CCND,CCJD'browser.get(url)# 显示等待输入框是否加载完成WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.ID, 'iframeResult')))browser.find_element_by_id('au_1_value1').send_keys(aurname)browser.find_element_by_id('au_1_value2').send_keys('清华大学')# 在input框内输入回车实现  search_btn.click()效果browser.find_element_by_id('txt_2_value1').send_keys(Keys.ENTER)# 显示等待文献是否加载完成,等待iframe加载完成time.sleep(5)browser.switch_to.default_content()browser.switch_to.frame('iframeResult') # 定位到页面元素df = []for page in range(1, 2):try:browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')paper_name = browser.find_elements_by_css_selector('a.fz14')author = browser.find_elements_by_css_selector('td.author_flag')source = browser.find_elements_by_css_selector('td.author_flag+td')datetime = browser.find_elements_by_css_selector('td.author_flag+td+td')database = browser.find_elements_by_css_selector('td.author_flag+td+td+td')beiyin=browser.find_elements_by_css_selector('span.KnowledgeNetcont')download = browser.find_elements_by_css_selector('span.downloadCount')for k, v, m, n, q,b, w in zip_longest(paper_name, author, source, datetime, database, beiyin,download, fillvalue=0):if w == 0:df.append([k.text, v.text, m.text, n.text, q.text,b.text, w])else:df.append([k.text, v.text, m.text, n.text, q.text,b.text, w.text])print('第{}页爬取完毕'.format(page))browser.find_element_by_link_text('下一页').click()time.sleep(random.randint(2, 5))except:print('未爬到数据')time.sleep(5)time.sleep(10)inf=pd.DataFrame(df)inf.to_csv('paper_information.csv',mode='a', header=False,index=False,encoding='utf-8-sig')#----爬取万方-------------------------#def start_wf_spider(aurname):  #爬取万方信息# 请求urlwfurl = 'http://www.wanfangdata.com.cn/searchResult/getAdvancedSearch.do?searchType=all'browser.get(wfurl)# 显示等待输入框是否加载完成WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.ID, 'help_div')))time.sleep(1)browser.find_element_by_xpath("//div[@id='search_condition_input']/div/div[@class='info3']/input").send_keys(aurname)browser.find_element_by_xpath("//div[@name='search_condition_div'and not(@id)]/div/div[@class='info3']/input").send_keys("清华大学")browser.find_element_by_id('set_advanced_search_btn').click() #点击检索time.sleep(5) #页面加载等待wftitle=[]wflb=[]wfauthor=[]wfdownl=[]wfquate=[]wfsource=[]wffbtime=[]try:browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')  # 滑轮到页面底部左下角divs = browser.find_elements_by_xpath('//div[@class="ResultCont"]/div[@class="title"]/strong')  # 定位文献类型ddivs = browser.find_elements_by_xpath('//div[@class="ResultCont"]/div[@class="title"]/a')  # 定位文献名称authdiv = browser.find_elements_by_xpath('//div[@class="ResultCont"]/div/div[@class="author"]')  # 定位作者信息obdivs = browser.find_elements_by_xpath('//div[@class="use obtain"]/span/b')  # 定位下载信息obqdivs = browser.find_elements_by_xpath('//div[@class="use spread"]/span/b')  # 定位被引信息iconclicks = browser.find_elements_by_xpath('//i[@class="icon icon_Miner"]')  # 定位到含有下载及被引信息的小M图标sources = browser.find_elements_by_xpath('//div[@class="ResultCont"]/div/div[@class="Source"]')  # 定位期刊名称信息fbtimes = browser.find_elements_by_xpath('//div[@class="ResultCont"]/div/div[@class="Volume"]')  # 定位期刊刊次信息t = 0# 获取文献信息数据for iconclick in iconclicks:wfauthor.append(authdiv[t].text)wflb.append(divs[t].text)wftitle.append(ddivs[t].text)iconclick.click()  # 点击激活M小图标wfdownl.append(obdivs[t].text)  # 获取下载量数据wfquate.append(obqdivs[t].text)  # 获取被引量数据wfsource.append(sources[t].text)  # 获取期刊名称wffbtime.append(fbtimes[t].text)  # 获取期刊刊次t += 1df = []for k, v, m, n, q, b, w in zip_longest(wftitle, wfauthor, wfsource, wffbtime, wflb, wfquate, wfdownl,fillvalue=0):if w == 0:df.append([k, v, m, n, q, b, w])else:df.append([k, v, m, n, q, b, w])inf = pd.DataFrame(df)inf.to_csv('paper_wf_information.csv', mode='a', header=False, index=False, encoding='utf-8-sig')time.sleep(2)except:print('未爬到数据')time.sleep(2)#----------爬取维普-------------------#
def start_cqvip_spider(aurname):  #爬取维普信息# 请求urlcqvipurl = 'http://qikan.cqvip.com/Qikan/Search/Advance?from=index'browser.get(cqvipurl)# 显示等待输入框是否加载完成WebDriverWait(browser, 1000).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'advance-submit')))time.sleep(2)#设置第一查询条件,第一查询条件为单位名称browser.find_element_by_xpath("//div[@id='basic_searchdomainfilter']/div/div/div/div/div/input").click() #点击第一个检索条件下拉框browser.find_element_by_xpath("//div[@id='basic_searchdomainfilter']/div/div/div/div/dl/dd[@lay-value='S']").click() #选择检索条件为机构暨单位browser.find_element_by_xpath("//div[@id='basic_searchdomainfilter']/div/div/div/input").send_keys("清华大学")# 设置第二查询条件,第二查询条件为第一作者名称browser.find_element_by_xpath("//div[@id='basic_searchdomainfilter']/div/div[3]/div[2]/div/div/input").click() #点击第二个检索条件下拉框browser.find_element_by_xpath("//div[@id='basic_searchdomainfilter']/div/div[3]/div[2]/div/dl/dd[@lay-value='A']").click() #选择检索条件为作者browser.find_element_by_xpath("//div[@id='basic_searchdomainfilter']/div/div[3]/div/input").send_keys(aurname)browser.find_element_by_xpath("//div[@id='basic_searchdomainfilter']/div[@class='advance-submit']/button").click() #点击检索按钮time.sleep(3)  #检索后等待3秒,等待结果载入#如需更多查询条件可自行添加count=1name=[]try:divs = browser.find_elements_by_xpath('//div[@id="tabDiv"]/div/div/div/div[@id="remark"]/dl'.format(2 * count - 1))i = 0for div in divs:  # 获取到文献标题信息namet = div.find_elements_by_xpath('//div[@id="tabDiv"]/div/div/div/div[@id="remark"]/dl/dt/a')name.append(namet[i].text)  # 获取文献名称i += 1authortt = div.find_elements_by_xpath('//div[@id="tabDiv"]/div/div/div/div[@class="simple-list"]/dl')t = 1authort = []  # 作者名字zazhititle = []  # 杂志名称zazhitime = []  # 出版时间for divaut in authortt:  # 获取对应文献作者信息aimulable = '//div[@id="tabDiv"]/div/div/div/div[@class="simple-list"]/dl[' + str(t) + ']/dd[3]/span/span'authortmp = div.find_elements_by_xpath(aimulable)aut = ""i = 0for audiv in authortmp:if audiv.text != '' and audiv.text != '作者':if i == 0:aut = audiv.texti += 1else:aut = aut + ',' + audiv.textauthort.append(aut)  # 作者姓名集合# -获取对应杂志名名称-#zzaimulable = '//div[@id="tabDiv"]/div/div/div/div[@class="simple-list"]/dl[' + str(t) + ']/dd[3]/span[2]/a'zztmp = div.find_element_by_xpath(zzaimulable)zazhititle.append(zztmp.text)# -----------------## -获取对应杂志名名称-#zzaimtime = '//div[@id="tabDiv"]/div/div/div/div[@class="simple-list"]/dl[' + str(t) + ']/dd[3]/span[3]'zztimetmp = div.find_element_by_xpath(zzaimtime)zazhitime.append(zztimetmp.text)# -----------------#t += 1# 将查询到信息写入CSV文件#inf = pd.DataFrame(columns=['论文名', '作者', '来源', '发表日期'])inf.to_csv('paper_cqvipinformation.csv', index=False, encoding='utf-8-sig')df = []for k, v, m, n in zip_longest(name, authort, zazhititle, zazhitime, fillvalue=0):df.append([k, v, m, n])inf = pd.DataFrame(df)inf.to_csv('paper_cqvipinformation.csv', mode='a', header=False, index=False, encoding='utf-8-sig')time.sleep(2)except:print('未爬到数据')time.sleep(2)def main():inf = pd.DataFrame(columns=['论文名', '作者', '来源', '发表日期', '数据库', '被引','下载次数'])inf.to_csv('paper_information.csv', index=False, encoding='utf-8-sig')authorsouce='dict.xls' #要检索的作者名字wb = xlrd.open_workbook(authorsouce)  # 打开Excel文件sheet = wb.sheet_by_name('Sheet3')  # 通过excel表格名称(rank)获取工作表for a in range(sheet.nrows):  # 循环读取表格内容(每次读取一行数据)cells = sheet.row_values(a)  # 每行数据赋值给cellsaurname= cells[0]  # 因为表内可能存在多列数据,0代表第一列数据,1代表第二列,以此类推#start_spider(aurname)#start_wf_spider(aurname)  # 万方文献信息查询start_cqvip_spider(aurname) #维普文献信息查询print(aurname,'完成')if __name__ == '__main__':main()

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

  1. 『重磅』免费无限量下载知网/万方/维普等数据库文献的正规渠道

    本文链接("因果关系推断"微信公众号) 疫情期间迟迟不能返校,科研汪们都渴望可以像以前在学校那样,依旧自由地下载知网/万方/维普文献.今天就向大家推荐一种**『免费无限量』下载学术 ...

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

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

  3. 中国知网 万方 维普下载文献说明

    问: 如果我想把文献内容和文献题录连在一起,必须得用附件吗?能不能直接通过打开题录,打开文献?导入题录后,还得一个一个文献的自己下载下来吗? 我来帮他解答 1.这种方法就很方便啊: 2.从附件里打开文 ...

  4. 【zotero】从知网万方维普WOS等数据库上导出格式引文-引文格式到zotero中

    一.问题背景 最近新中特课要交课程论文作业了,老师说要有参考文献引注. 于是我找了很多参考文献,但是不打算放在我的zotero文献库中,因为我不想我的zotero文献库中包括与我专业学习不相关的东西. ...

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

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

  6. python爬虫爬取知网

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

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

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

  8. python爬虫scrapy爬取新闻标题及链接_python爬虫框架scrapy爬取梅花网资讯信息

    原标题:python爬虫框架scrapy爬取梅花网资讯信息 一.介绍 本例子用scrapy-splash爬取梅花网(http://www.meihua.info/a/list/today)的资讯信息, ...

  9. Python 网络爬虫实战:爬取知乎回答中的全部图片

    平时逛知乎的时候,经常能看到很多很棒的图片,精美的壁纸,搞笑的表情包,有趣的截图等等,总有想全部保存下来的冲动. 于是在一个小老弟的拜托之下,我把之前的知乎爬虫改造了一下,改装成了一个可以下载知乎回答 ...

最新文章

  1. 电子电路基础复习 —— 电感
  2. 【Win8启动后自动进入传统桌面设置】
  3. python详细安装教程linux-Linux手动安装新版本Python教程(CentOS)
  4. 2017年9月2日普级组T2 跳格子
  5. Teradata天睿公司推出适用各种部署环境的全球最强分析数据库
  6. java爬虫自动识别验证码_简单Java爬虫(一)爬取手机号码
  7. 面向多星多任务的大数据处理系统设计
  8. link标签的几个用法,帮助提高页面性能
  9. win8卸载mysql数据库,彻底卸载win8自带的metro应用的方法
  10. The Classic IQ Test
  11. python中的作用域_python中作用域
  12. 【 Codeforces Round #547 (Div. 3) F2】Same Sum Blocks (Hard)【思维贪心】
  13. 论文的英文文献在哪找(除了知网)?
  14. iOS框架引见--媒体层
  15. 一篇文章带你入门python基础开发
  16. 附解决方案,小程序用户昵称突然变成了“微信用户”,而且头像也显示不了?
  17. 【论文阅读】【三维目标检测】Pseudo-LiDAR from Visual Depth Estimation
  18. 解决w950播放RM视频的问题[转]
  19. k8s cpu 和内存资源说明
  20. 用html5 js实现浏览器全屏

热门文章

  1. 播音主持学习心得之锻炼口才的方法
  2. 鸡兔同笼40个头100只脚c语言,鸡兔同笼,上有40个头,下有100只脚,问鸡兔各有多少只?...
  3. [转帖]高清下载新体验:PT下载的魅力
  4. ISO PAS 21448 SOTIF(预期功能安全)笔记(二)
  5. 如何将CAJ文件转换成PDF格式
  6. Open3D法线双边滤波, 利用法向信息提高点云滤波效果
  7. linux内核模块调试信息,linux内核模块调试
  8. 大数据技术原理与应用作业十
  9. 想要学习人工智能,有哪些大学专业可以选择?
  10. Win8系统设置WiFi热点的方法