利用ISBN/书名爬取“全国图书馆参考咨询联盟”网站从而得到图书学科、中图分类号、主题等信息

这篇具有很好参考价值的文章主要介绍了利用ISBN/书名爬取“全国图书馆参考咨询联盟”网站从而得到图书学科、中图分类号、主题等信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先把代码的坑说一下哈哈,尽管代码做了很多异常处理相对健壮,仍然有一个问题就是每次抓取八十条左右的数据时就会弹出验证码,代码经过微调从原来的一次性抓取十几条到八十多条,差不多半小时G一次。如果介意的话慎重订阅哈,也可私信联系我

一、需求

利用ISBN/书名抓取“全国图书馆参考咨询联盟”网站从而得到图书学科、中图分类号、主题等信息。

二、技术

selenium模拟登录,需要在代码里修改成你自己的账号密码,并且模拟滑块滑动登录。

三、技术难点

①处理了很多异常种类(查不到图书、没有学科信息,学科信息不足四级,讲到关于验证码的处理方法,虽然并没有直接处理验证码,但也描述了避免验证码弹出的一种方式,并做了相关验证,可按照文档自行修改寻求一个较为好的解决方式),文档里面图文并茂,有问题可私我要微信或直接提出问题

四、巧妙设计

①代码被反爬了之后,原来已经检索完成的内容是已经存好的,再次运行代码不会影响已经存好的信息,只从没有检索过的ISBN开始检索

②当爬取一定数量的图书信息时,就会有验证码,经过实验发现与每次模拟点击后time.sleep(??)的时间有很大关系。

ps:尝试过模拟输入验证码,首先这个验证码有很多不清晰,甚至人眼都很难区分,其次这个验证码的链接是动态变化的,复制其链接回车一次图片就改变一次,除非右键点击保存,利用图像处理返回一个字符串,填入验证码输入框,感觉挺麻烦。后来还是用time.sleep(??)调节了一下。

大概是

随机3-5s:一次能爬取17条

随机4-7s:一次能爬取25条

随机4-10s:一次能爬取86条

五、代码及详细介绍我直接放word文档里了,复制链接即可查看编辑

【金山文档】 爬取全国图书馆参考咨询联盟信息
https://kdocs.cn/l/cvYt2Bg9X0r1

代码:文章来源地址https://www.toymoban.com/news/detail-454136.html

import random
import xlrd
import pandas as pd
from selenium import webdriver
import time
from selenium.webdriver import Chrome
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
browser=Chrome(options=options)
url = "http://www.ucdrs.superlib.net/login/login.action"
browser.get(url)     

def login():
    #输入用户名
    input_user = browser.find_element_by_id("userName")     #查找输入框
    input_user.send_keys("XXXXXX")              #模拟输入用户名,宝子答应我改成你自己的账号
    time.sleep(2)
    #输入密码
    input_pwd = browser.find_element_by_id("passWord")  #查找密码框
    input_pwd.send_keys("XXXXXXX")               #模拟输入密码,宝子答应我改成你自己的密码
    time.sleep(2)
    #模拟点击登录
    browser.find_element_by_xpath('//*[@id="loginFrom"]/div/div[3]/input').click()  
    time.sleep(8)                         #等待八秒,手动滑动滑块,宝子答应我八秒之内滑完

def get_fenlei():#取到分类号以及主题词
    #点击图书链接
    browser.find_element_by_xpath('//[@id="noscroll"]/table/tbody/tr/td[2]/form/table/tbody/tr/td[3]/table/tbody/tr/td/a').click()
    time.sleep(3)
    #新的页面需要调用如下代码切换window
    browser.switch_to.window(browser.window_handles[1])
    fenleihao = ''
    zhuti = ''
    #遍历表单信息,提取中图法分类号及主题词
    for j in browser.find_elements_by_xpath('//*[@id="wrap2"]/div/div[5]/div[4]/div[1]/dl/dd'):
        if '【中图法分类号】' in j.text:
            fenleihao = j.text
            print(fenleihao)
        elif '【主题词】' in j.text:
            zhuti = j.text
            print(zhuti)
    #关闭当前窗口
    browser.close()
    #视角切换到原始窗口
    browser.switch_to.window(browser.window_handles[0])
    return zhuti,fenleihao
def get_xueke(lst):
    print(len(lst))
    for i in range(len(lst)):
        print(i)
        #Sub用来存储学科信息,zhuti用来存储主题,fenleihao用来存储中图分类号
        Sub, zhuti, fenleihao='','',''
        #看一下表格中这条图书有没有查询过,未查询的时候对应”xueke“字段是空的状态
        if pd.isnull(df.iat[i,1]):
            print(lst[i],'成功')
            search_text = browser.find_element_by_xpath('//*[@id="sw"]')    #查找检索框
            search_text.send_keys(lst[i])                                #模拟输入ISBN
            #点击”中文搜索“
            browser.find_element_by_xpath('//*[@id="f2"]/div[2]/input[1]').click()      
            time.sleep(random.randint(4,10))
            if '0 种,用时' in browser.find_element_by_xpath('//*[@id="searchinfo"]/b').text:#查不到此图书
                print(lst[i], '异常')
                browser.back()                                           #回退网页一次
                Sub = '无此图书'
                browser.find_element_by_xpath('//*[@id="sw"]').clear()        #清空检索框
                time.sleep(random.randint(4, 10))
            else:
                try:#正常情况下图书有学科信息向下点击
                    yiji = browser.find_element_by_xpath('//*[@id="leftcata"]/div[3]/div[2]/a')
                    Sub+=yiji.text
                    yiji.click()
                    time.sleep(random.randint(4, 10))
                    try:#正常情况下图书有二级学科向下点击
                        erji = browser.find_element_by_xpath('//*[@id="leftcata"]/div[3]/div[2]/a')
                        Sub+=erji.text
                        erji.click()
                        time.sleep(random.randint(4, 10))
                        try:#正常情况下图书有三级学科向下点击
                            sanji = browser.find_element_by_xpath('//*[@id="leftcata"]/div[3]/div[2]/a')
                            Sub+=sanji.text
                            sanji.click()
                            time.sleep(random.randint(4, 10))
                            try:#正常情况下图书有四级学科向下点击,并回退五次返回检索首页
                                siji = browser.find_element_by_xpath('//*[@id="leftcata"]/div[3]/div[2]/a')
                                Sub+=siji.text
                                siji.click()
                                time.sleep(random.randint(4, 10))
                                zhuti, fenleihao = get_fenlei()
                                browser.back()
                                browser.back()
                                browser.back()
                                browser.back()
                                browser.back()
                                browser.find_element_by_xpath('//*[@id="sw"]').clear()
                            except:#此异常是为了处理只有三级学科的情况
                                zhuti, fenleihao = get_fenlei()   #点击图书链接,获取相应信息,关闭当前窗口
                                browser.back()                    #回退四次
                                browser.back()
                                browser.back()
                                browser.back()
                                browser.find_element_by_xpath('//*[@id="sw"]').clear()  #清空检索框
                        except:#此异常是为了处理只有二级学科的情况
                            zhuti, fenleihao = get_fenlei() #点击图书链接,获取相应信息,关闭当前窗口
                            browser.back()                  #回退三次
                            browser.back()
                            browser.back()
                            browser.find_element_by_xpath('//*[@id="sw"]').clear()      #清空检索框
                    except:#此异常是为了处理只有一级学科的情况
                        zhuti, fenleihao = get_fenlei()     #点击图书链接,获取相应信息,关闭当前窗口
                        browser.back()                      #回退两次
                        browser.back()
                        browser.find_element_by_xpath('//*[@id="sw"]').clear()         #清空检索框
                except:#此异常是为了处理没有学科的情况
                    Sub='无学科分类信息'
                    zhuti, fenleihao = get_fenlei()          #点击图书链接,获取相应信息,关闭当前窗口
                    browser.back()                           #回退一次
                    browser.find_element_by_xpath('//*[@id="sw"]').clear()            #清空检索框
            #每检索一本图书就存入表格一次
            df.loc[i, 'xueke'] = str(Sub)
            df.loc[i, 'fenleihao'] = fenleihao
            df.loc[i, 'zhutici'] = zhuti
            df.to_excel('book.xlsx',index=False)
        #”xueke"不为空值表示是查询过的图书,则开始下一本图书检索
        else:
            continue
if __name__ == '__main__':
    # 利用openpyxl读取表格,在你相应的环境里要安装openpyxl:pip install openpyxl
    df = pd.read_excel('book.xlsx', header=0, engine='openpyxl')
    Isbn_set = list(df['ISBN'])  # 读取表格的ISBN这一列存为列表
    login()  # 登录需要手动滑动
    get_xueke(Isbn_set)  

到了这里,关于利用ISBN/书名爬取“全国图书馆参考咨询联盟”网站从而得到图书学科、中图分类号、主题等信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓期末大作业-图书馆借书系统、图书借阅app(附下载链接)

    安卓期末大作业,图书借阅APP,老师给了95分,可以注册登录,借阅书籍,还书,含数据库存储借书记录,导入AndroidStudio即可使用,代码注释详细 点我下载项目源码 进入APP界面: 注册登录界面如下所示: 登录界面: 注册部分代码: @Override protected void onStop() { super.onStop();

    2024年02月03日
    浏览(46)
  • java项目-图书馆管理系统源码

    作者主页:夜未央5788  简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码   项目介绍 本毕业设计运用了使用技术:spring mvc+spring+hibernate,数据库使用了当前较为流行的Mysql5.7。根据本校图书馆的工作流程与实际的需求和特色,本系统需满足以下几个方

    2024年02月08日
    浏览(37)
  • C++图书馆管理系统(简单版)

    实用的图书馆管理系统应该至少包括一下功能: 1、上传:新进图书以及基本信息的输入 2、删除:旧图书以及基本信息的删除 3、显示:显示图书馆已有的所有图书 4、查找:查询要借阅的图书信息 5、借阅:实现用户办理借阅手续 6、归还:实现用户办理归还手续 系统以菜单

    2024年02月09日
    浏览(38)
  • 用C++实现图书馆管理系统

    该程序包含一个 `Book` 类,代表图书馆中的书籍,具有标题、作者、出版商、出版年份和可用性属性。程序中还定义了一个 `bookList` 向量,用于存储图书馆中的所有书籍。 程序的 `main` 函数通过循环显示菜单,然后根据用户的选择调用相应的函数。用户可以选择添加新书籍、

    2024年02月12日
    浏览(36)
  • Android Studio实现图书馆订座系统

    在校园生活中,图书馆是很多人选择的学习圣地,这里不仅充满书香气息,而且还十分静谧。这样的学习环境,必然会很抢手,导致很多学生早早就来图书馆占座,渐渐地因为一直占不到座的同学就失去了学习的动力。 针对这样的实际问题,我们设计了一款图书馆订座系统。

    2024年02月06日
    浏览(67)
  • 基于JavaWeb的图书馆管理系统

    🍅 作者主页:

    2024年02月05日
    浏览(34)
  • JavaWeb期末项目 图书馆管理系统

    1 项目基本信息 1.1 项目名称 图书馆管理系统 1.2 开发运行环境 Window 10 64位 JDK 1.8.0 Eclipse 4.8版本 MySql 5.5 Tomcat 9.0 2 项目需求分析 2.1 学生登录部分 (1)学生注册:在进入图书馆前必须要登录,如果没有学号则要注册,注册时系统会将用户填写的学号与数据库里面的数据对比,

    2024年02月10日
    浏览(37)
  • 搭建个人图书馆!一个简单的在线个人书库

    大家好,我是 Java陈序员 。 今天,给大家介绍一个在线的个人图书管理系统,支持在线阅读。 关注微信公众号:【Java陈序员】,获取 开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 talebook —— 一个基于Calibre的简单的个人图书管理系统,支持在线阅读。 友情提

    2024年04月15日
    浏览(37)
  • c语言课程设计(图书馆管理系统)

    大一c语言课程设计:图书馆管理系统。 图书管理系统,功能齐全拿来就能用 1.主界面   代码段  2.图书录入界面 运用文件录入多次使用   代码段  3.图书查询界面 根据输入书的数据与文件中数据进行比对 ,查找后输出。 代码段 4.图书修改 输入修改图书数据并在文件中查找

    2024年02月11日
    浏览(28)
  • 用C++实现一个图书馆管理系统

    下图为普通读者的功能 下图为图书馆管理员所拥有的功能 图中所示功能均已实现,不再一一展示,文末有项目源码 1 、 用户进入系统 用户进入系统的前提是必须先登录或者注册 2、 不同身份有不同功能的使用权 普通读者权限较小,图书管理者拥有较高权限,还设有高级管

    2023年04月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包