自然基金项目爬虫测试(已失效)

这是一个使用Python的Selenium库编写的自动化爬虫,主要用于从科学基金网站抓取并解析项目信息,包括项目名、负责人、机构、类型、批准号、立项年份、资助金额和关键词。代码能自动登录并进行多页翻页,但目前网站可能已停止对普通用户提供查询服务。
摘要由CSDN通过智能技术生成

一年前写的小爬虫,用的自动化测试。还是可以自动登录,但网站现在好像不向普通用户提供查询服务了。
写了一次不容易,代码还是保存在这里。

#coding='utf-8'
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.common.action_chains import ActionChains
import time as t
import re
from bs4 import BeautifulSoup
import xlrd
import xlwt
import os
import random
#先进入科学基金网
driver = webdriver.Firefox()
driver.maximize_window()
driver.get('http://fund.sciencenet.cn/')


def analyse_most(html):
    """进行网页解析"""
    soup = BeautifulSoup(html,'html.parser')    #解析器:html.parser
    #items=soup.select('html body div.hom div#wrapper_body div#main.wp div#mainCt div#resultLst.resultLst div.item')#一页的项目
    #print(items)
    titles=[]
    authors=[]
    inses=[]
    sorts=[]
    nums=[]
    years=[]
    mons=[]
    keys=[]
    #使用路径
    title=soup.select('html body div.hom div#wrapper_body div#main.wp div#mainCt div#resultLst.resultLst div.item p.t a')#项目名
    author=soup.select('html body div.hom div#wrapper_body div#main.wp div#mainCt div#resultLst.resultLst div.item div.d p.ico span.author i')#负责人
    #使用选择器
    ins=[]
    sort=[]
    num=[]
    year=[]
    mon=[]
    key=[]
    for i in range(1,11):
        ins_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > span:nth-child(2) > i:nth-child(1)')#机构
        sort_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > i:nth-child(3)')#类型
        num_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > b:nth-child(4)')#批准号
        year_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > span:nth-child(5) > b:nth-child(1)')#立项年份
        mon_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(2) > span:nth-child(1) > b:nth-child(1)')#资助金额
        key_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(2) > span:nth-child(2) > i:nth-child(1)')#关键词
        ins.append(ins_1)
        sort.append(sort_1)
        num.append(num_1)
        year.append(year_1)
        mon.append(mon_1)
        key.append(key_1)
    clear(title,titles)
    clear(author,authors)
    clear_l(ins,inses)
    clear_l(sort,sorts)
    clear_l(num,nums)
    clear_l(year,years)
    clear_l(mon,mons)
    clear_l(key,keys)

    page=[]#本页的所有信息
    for i in range(len(titles)):
        page.append(titles[i:i+1]+authors[i:i+1]+inses[i:i+1]+sorts[i:i+1]+nums[i:i+1]+years[i:i+1]+mons[i:i+1]+keys[i:i+1])
    return page
def analyse_end(html):
    """进行最后一页的网页解析"""
    soup = BeautifulSoup(html,'html.parser')    #解析器:html.parser
    #items=soup.select('html body div.hom div#wrapper_body div#main.wp div#mainCt div#resultLst.resultLst div.item')#一页的项目
    #print(items)
    titles=[]
    authors=[]
    inses=[]
    sorts=[]
    nums=[]
    years=[]
    mons=[]
    keys=[]
    #使用路径
    title=soup.select('html body div.hom div#wrapper_body div#main.wp div#mainCt div#resultLst.resultLst div.item p.t a')#项目名
    author=soup.select('html body div.hom div#wrapper_body div#main.wp div#mainCt div#resultLst.resultLst div.item div.d p.ico span.author i')#负责人
    #使用选择器
    ins=[]
    sort=[]
    num=[]
    year=[]
    mon=[]
    key=[]
    for i in range(1,3):
        ins_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > span:nth-child(2) > i:nth-child(1)')#机构
        sort_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > i:nth-child(3)')#类型
        num_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > b:nth-child(4)')#批准号
        year_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(1) > span:nth-child(5) > b:nth-child(1)')#立项年份
        mon_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(2) > span:nth-child(1) > b:nth-child(1)')#资助金额
        key_1=soup.select('div.item:nth-child('+str(i)+') > div:nth-child(2) > p:nth-child(2) > span:nth-child(2) > i:nth-child(1)')#关键词
        ins.append(ins_1)
        sort.append(sort_1)
        num.append(num_1)
        year.append(year_1)
        mon.append(mon_1)
        key.append(key_1)
    clear(title,titles)
    clear(author,authors)
    clear_l(ins,inses)
    clear_l(sort,sorts)
    clear_l(num,nums)
    clear_l(year,years)
    clear_l(mon,mons)
    clear_l(key,keys)

    page=[]#本页的所有信息
    for i in range(len(titles)):
        page.append(titles[i:i+1]+authors[i:i+1]+inses[i:i+1]+sorts[i:i+1]+nums[i:i+1]+years[i:i+1]+mons[i:i+1]+keys[i:i+1])
    return page
def get_one():
    """返回搜索第一页源码"""
    u_1='15691604654'
    k_1='9g8496suDFwqRfg'
    u_2='15881650047'
    k_2='zqlwx123'
    
    driver.find_element_by_xpath('/html/body/div[2]/div[1]/div/div[2]/a').click()#随便点击以转到登录页
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div/form/div/div[1]/input').send_keys(u_1)#键入用户名
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div/form/div/div[2]/input').send_keys(k_1)#键入密码
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div/form/div/div[4]/button').click()#进入
    t.sleep(2)
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div/div[2]/div[1]/form/div[1]/div[2]/div[2]/span[2]/span[1]/span/span[1]').click()#直接点击
    t.sleep(2)
    driver.find_element_by_xpath('/html/body/dialog/bd/div[1]/div[1]/ul/li[8]').click()#选中管理科学部
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/dialog/bd/div[1]/div[1]/div/ul/li[2]/label').click()#选中工商管理
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/dialog/bd/div[1]/div[1]/div/div/ul/li[6]/label').click()#选中会计
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/dialog/bd/div[2]/button').click()#确定
    t.sleep(3)
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div/div[2]/div[1]/form/div[1]/div[1]/div[3]/select[1]').click()#点击起始年份
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div/div[2]/div[1]/form/div[1]/div[1]/div[3]/select[1]/option[24]').click()#选中2000年
    t.sleep(3)
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div/div[2]/div[1]/form/div[1]/div[1]/div[3]/select[2]')#点击截止年份
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div/div[2]/div[1]/form/div[1]/div[1]/div[3]/select[2]/option[4]').click()#选中2020年
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/div[2]/div[4]/div/div[1]/div/div[2]/div[1]/form/div[2]/button').click()#点击搜索
    #成功进入搜索结果页面
    html= driver.page_source#页面源码
    return html
def get_one_mian():
    #面上项目
    get_one()#搜索首页
    driver.find_element_by_xpath('//*[@id="category"]').click()#进入类型
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="面上项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[2]/button').click()#点击筛选
    html=driver.page_source
    return html
def get_one_qing():
    #青年科学基金项目,共24页
    get_one()#搜索首页
    driver.find_element_by_xpath('//*[@id="category"]').click()#进入类型
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="青年科学基金项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[2]/button').click()#点击筛选
    html=driver.page_source
    return html
def get_one_others():
    #杂项,共9页
    get_one()#搜索首页
    driver.find_element_by_xpath('//*[@id="category"]').click()#进入类型
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="地区科学基金项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="专项基金项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="国际(地区)合作与交流项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="重点项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="应急管理项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="优秀青年科学基金项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="海外及港澳学者合作研究基金"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="重大项目"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="国家杰出青年科学基金"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('//*[@id="重大研究计划"]').click()#选定面上项目
    t.sleep(1)
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[2]/button').click()#点击筛选
    html=driver.page_source
    return html
def get_fore():
    """前6页的翻页,并返回源码"""
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[13]/a').click()#点击下一页
    html=driver.page_source
    return html
def get_fore_others():
    """前6页的翻页,并返回源码"""
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[11]/a').click()#点击下一页
    html=driver.page_source
    return html

def get_mid():
    """中间的翻页,并返回源码"""
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[15]/a ').click()#点击下一页
    html=driver.page_source
    return html
def get_after():
    """最后的翻页,并返回源码"""
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[14]/a ').click()#点击下一页
    html=driver.page_source
    return html
def clear(old_list,new_list):
        """用于清洗出纯文本"""
        for i in old_list:
            n=(i.text).strip()
            n=n.replace('\n',' ')
            new_list.append(n)
        return new_list 
def clear_l(old_list,new_list):
        """用于清洗出resultset的纯文本"""
        for i in old_list:
            i=i[0]
            n=(i.text).strip()
            n=n.replace('\n',' ')
            new_list.append(n)
        return new_list 
def save_afile(alls,count):
    os.chdir(r'F:\会计学基金项目数据代码\杂项基金')
    """将一页的基金数据保存在一个excle"""
    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,'关键词')
    i=1
    for data in alls:#遍历每一行
        for j in range(len(data)):#取每一单元格
            sheet1.write(i,j,data[j])#写入单元格
        i=i+1#往下一行
    f.save(str(count)+'.xls')
    print(str(count)+'保存成功!')
def wait():
    """返回随机等待时间"""
    s=t.sleep(random.randint(2,9))
    return s
def wait_l():
    s=t.sleep(random.randint(1,5))
    return s
def goto_10_mian():
    #跳转到10页
    get_one_mian()
    wait_l()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[9]/a').click()#转到第八页
    #for i in range(5):#转到第23页
    wait_l()
        #driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[11]/a').click()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[10]/a').click()#转到第10页
def goto_13_qing():
    #转到第13页
    get_one_qing()
    wait_l()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[9]/a').click()#转到第八页
    wait_l()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[11]/a').click()#十一页
    wait_l()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[10]/a').click()#十三页
def goto_20_mian():
    #转到第20页
    get_one_mian()
    wait_l()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[9]/a').click()#转到第八页
    for i in range(4):#转到第20页
        wait_l()
        driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[11]/a').click()
def goto_22_qing():
    #转到第22页
    get_one_qing()
    wait_l()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[9]/a').click()#转到第八页
    for i in range(4):#转到第20页
        wait_l()
        driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[11]/a').click()
    driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[11]/a').click()#22
if __name__ == '__main__':
    #进入面上项目第10页,因为已经爬到了该页数据
    #进入面上项目第20页,因为已经爬到了该页数据
    #进入青年基金第13页,因为已经爬到了该页数据
    for i in range(1,10):#循环24次
        if i==1:
            save_afile(analyse_most(get_one_others()),i)
        elif 1<i<=8:
            save_afile(analyse_most(get_fore_others()),i)
        else:
            save_afile(analyse_end(get_fore_others()),i)

    



"""
        if i==1:
            save_afile(analyse_most(get_one_mian()),i)
        elif 1<i<=7:
            wait()
            save_afile(analyse_most(get_fore()),i)
            """
#driver.find_element_by_xpath('/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[13]/a').click()#点击下一页
#/html/body/div[3]/div[4]/div/div[3]/div[2]/p/span[15]/a   7之后(最多一次弄七个,需要等待五分钟)










  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵海之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值