利用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日
    浏览(63)
  • C++图书馆管理系统(简单版)

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

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

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

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

    🍅 作者主页:

    2024年02月05日
    浏览(75)
  • 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日
    浏览(50)
  • java项目-图书馆管理系统源码

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

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

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

    2024年02月06日
    浏览(87)
  • c语言课程设计(图书馆管理系统)

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

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

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

    2023年04月13日
    浏览(46)
  • 图书馆座位预约小程序系统设计与实现

    目的 :本课题主要目标是设计并能够实现一个基于微信小程序预约订座小程序,前台用户使用小程序,后台管理使用Java+Mysql开发,后台使用了springboot框架;通过后台添加座位类型、座位号,用户通过小程序登录,查看座位、提交座位预约信息。 意义 :微信小程序预约订座

    2024年02月09日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包