Python自动化查询CNKI并获取查询结果

来源:互联网 发布:淘宝扒皮精灵家 编辑:程序博客网 时间:2024/05/20 03:39

最初是由GIS才认识Python,给朋友帮忙,写了个爬取CNKI的脚本,主要运用了selenium下的webdriver以及BeautifulSoup模块。运行下来,发现频繁的访问会导致验证码的出现,暂时没解决这个问题,有知道的大神请不吝赐教。

上代码:

#!/usr/bin/env python

# -*- coding:utf-8-*-
__author__='Alex Gu'
__time__='20160121'

#解决提交后出现汉字转码问题用下面三行代码
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
#导入必要的模块
from selenium import webdriver
from time import sleep
from BeautifulSoup import BeautifulSoup
#定义提取单个网页中所需信息的函数
def Ex_CNKImesg(wy):
    soup=BeautifulSoup(wy)
    top_div=soup.find("div",{"id":"main"})
    aa_=top_div.find("div",{"id":"content"})
    bb_=aa_.find("div")
    cc_=bb_.find('div',{"class":"summary pad10"})
    dd_=cc_.find('div',{"class":"author summaryRight"})
    ee_=dd_.findAll('p')[2]
    ff_=ee_.findAll('a')
    for gg in ff_:
        dw=''.join(gg)
        with open('dw.txt','a')as e:
            e.write(dw.encode('utf-8')+',')
    sleep(1)
    e.close()
#提取页面信息,嵌套了单个网页提取函数
def Get_cnkimesg():
    driver.switch_to_frame('iframeResult')
    #通过class name找出所有链接,注意这里是find_elements,是因为结果不唯一,所以是复数形式!
    links=driver.find_elements_by_class_name('fz14')
    for link in links:
        html=link.click()
        #sleep(3)
        break
    all_handles=driver.window_handles#得到所有窗口句柄
    for handle in all_handles:
        if handle != now_handle:
            driver.switch_to_window(handle)
            html=driver.page_source
            Ex_CNKImesg(html)
            sleep(2)
            driver.close()#提取完信息后就关闭该页面,释放内存
            sleep(1)
        else:
            continue
            
#webdriver自动化打开网页,输入关键字查询
driver=webdriver.Firefox()
#最大化浏览器,optional
driver.maximize_window()
#打开网页地址,也可以打开html,具体方法以后再说先记着。。
driver.get("http://epub.cnki.net/kns/brief/result.aspx?dbprefix=scdb&action=scdbsearch&db_opt=SCDB")
#这个休眠是为了以防网络卡顿,网页还没打开就提交数据导致出错
sleep(2)
#id是html里面唯一的身份证,通过它找到要输入的空,输入词语,这个是下拉框
driver.find_element_by_id('allselectdblistbtn').click()
driver.find_element_by_id('clearSelectBtn').click()
sleep(1)
driver.find_element_by_id('allselectdblistbtn').click()
sleep(1)
all_options=driver.find_elements_by_tag_name("input")
for option in all_options:
    if option.get_attribute('value') in ['CJFQ','CPFD','IPFD']:
        option.click()
        sleep(1)
m=driver.find_element_by_id("txt_1_sel")
m.find_element_by_xpath("//option[@value='TI']").click()#这一句很NB
#同上
driver.find_element_by_id("txt_1_value1").send_keys("RS")
#同上,点击查询按钮
driver.find_element_by_id("btnSearch").click()
#同样是等查询结果出来
sleep(2)
#将查询结果页面保存为“当前页”,方便后面寻找下一页句柄
now_handle = driver.current_window_handle
#查询结果是以frame的形式嵌入主站,所以要想对它操作,得切换到这里面来
Get_cnkimesg()
driver.switch_to_window(now_handle)
while True:
    driver.switch_to_window(now_handle)
    driver.switch_to_frame('iframeResult')
    driver.find_element_by_link_text("下一页").click()
    sleep(3)
    now_handle = driver.current_window_handle
    driver.switch_to_window(now_handle)
    Get_cnkimesg()
    sleep(2)

0 0
原创粉丝点击