Board logo

标题: [原创代码] PowerShell实现科学文库图书下载 [打印本页]

作者: went    时间: 2023-9-28 21:32     标题: PowerShell实现科学文库图书下载

科学文库图书下载,png格式,可自行转换为pdf,去除在线阅读限制
科学文库官网: https://book.sciencereading.cn/shop/main/Login/shopFrame.do
图书链接格式: https://book.sciencereading.cn/s ... E053020B0A0A1666000
侵权请通知删除,谨慎外传
带目录索引下载的更新在7楼
  1. cls
  2. <#
  3.     科学文库官网: https://book.sciencereading.cn/shop/main/Login/shopFrame.do
  4.     图书链接格式: https://book.sciencereading.cn/shop/book/Booksimple/show.do?id=B970CE8AEE3531D1DE053020B0A0A1666000
  5. #>
  6. #图书连接
  7. $book_url = Read-Host -Prompt '输入图书链接'
  8. $resp = Invoke-WebRequest -Uri $book_url
  9. #图书名称
  10. $book_name = $null
  11. $book_name = $resp.ParsedHtml.querySelector('.book_detail_title').innerText.Trim()
  12. if($book_name -eq $null){
  13.     Write-Host '图书名称解析失败' -ForegroundColor Red
  14.     pause
  15.     exit
  16. }
  17. $book_name = $book_name -replace '\<|\>|\?|\*|\:|\||\/|\\',' '
  18. #图书id
  19. $book_id = $book_url -split '=' | Select-Object -Last 1
  20. #服务器ip和端口
  21. $server_ip = '159.226.241.32'
  22. $server_port = 81
  23. #默认用户id
  24. $default_user = '825ae171eb514934b1ed2374976f4a9f'
  25. #文档编号
  26. $doc_num_api = 'https://wkobwp.sciencereading.cn/api/file/add'
  27. $resp = Invoke-WebRequest -UseBasicParsing -Method Post -Uri $doc_num_api -Headers @{
  28.     'accessToken' = 'accessToken'
  29.     'Content-Type' = 'application/x-www-form-urlencoded; charset=UTF-8'
  30. } -Body (
  31.     'params=%7B%22params%22%3A%7B%22userName%22%3A%22Guest%22%2C%22userId%22%3A%22{0}%22%2C%22file%22%3A%22http%3A%2F%2F{1}%3A{2}%2F{3}.pdf%22%7D%7D&type=http' -f $default_user,$server_ip,$server_port,$book_id
  32. )
  33. $book_number = ($resp.Content -split '"')[3]
  34. #获取图片总数量
  35. $img_count = $null
  36. while($img_count -eq $null){
  37.     $book_number
  38.     $resp = Invoke-WebRequest -UseBasicParsing -Uri ('https://wkobwp.sciencereading.cn/asserts/{0}/manifest?language=zh-CN' -f $book_number)
  39.     $json = [System.Text.UTF8Encoding]::UTF8.GetString($resp.Content) | ConvertFrom-Json
  40.     $json = $json.docinfo | ConvertFrom-Json
  41.     $img_count = $json.PageCount
  42. }
  43. #遍历下载图片
  44. [void][System.IO.Directory]::CreateDirectory($book_name)
  45. $img_url = 'https://wkobwp.sciencereading.cn/asserts/{0}/image/{1}/100?accessToken=accessToken&formMode=true';
  46. 0..($img_count-1) | foreach {
  47.     $url = $img_url -f $book_number,$_
  48.     $png = '.\{0}\{0}-{1:000}.png' -f $book_name,$_
  49.     while($true){
  50.         Write-Host ('{0}/{1}' -f $_,$img_count) -ForegroundColor Yellow
  51.         try{
  52.             $resp = Invoke-WebRequest -UseBasicParsing -Uri ($img_url -f $book_number,$_)
  53.             [System.IO.File]::WriteAllBytes($png,$resp.Content)
  54.             [System.IO.Path]::GetFileName($png)
  55.             break
  56.         } catch {
  57.             Start-Sleep -Seconds 1  
  58.         }
  59.     }
  60. }
  61. Write-Host '全部下载完成' -ForegroundColor Green
  62. pause
复制代码
$img_url = 'https://wkobwp.sciencereading.cn/asserts/{0}/image/{1}/100?accessToken=accessToken&formMode=true';

100改大点,图像更清晰。听别人说有9个级别
分辨率共有50,75,100,125,150,200,400,800,1000九个级别
作者: yyz219    时间: 2023-9-28 22:07

谢谢分享哦
作者: hlzj88    时间: 2023-9-28 22:27

谢谢分享,不知道全部下载完成多少G?
作者: pd1    时间: 2023-9-28 23:09

$img_url = 'https://wkobwp.sciencereading.cn/asserts/{0}/image/{1}/100?accessToken=accessToken&formMode=true';

100改大点,图像更清晰。听别人说有9个级别
分辨率共有50,75,100,125,150,200,400,800,1000九个级别
作者: went    时间: 2023-9-28 23:20

回复 3# hlzj88


    只下载自己需要的吧,爬虫这种事本来就不道德
作者: went    时间: 2023-9-28 23:21

回复 4# pd1


    感谢提醒,已更新到顶楼
作者: went    时间: 2023-9-29 00:50

更新一个带目录索引的
  1. cls
  2. <#
  3.     科学文库官网: https://book.sciencereading.cn/shop/main/Login/shopFrame.do
  4.     图书链接格式: https://book.sciencereading.cn/shop/book/Booksimple/show.do?id=B970CE8AEE3531D1DE053020B0A0A1666000
  5. #>
  6. #图书连接
  7. $book_url = Read-Host -Prompt '输入图书链接'
  8. $resp = Invoke-WebRequest -Uri $book_url
  9. #图书名称
  10. $book_name = $null
  11. $book_name = $resp.ParsedHtml.querySelector('.book_detail_title').innerText.Trim()
  12. if($book_name -eq $null){
  13.     Write-Host '图书名称解析失败' -ForegroundColor Red
  14.     pause
  15.     exit
  16. }
  17. $book_name = $book_name -replace '\<|\>|\?|\*|\:|\||\/|\\',' '
  18. #图书目录
  19. $menus = $null
  20. if($resp.Content -match '(?s)var zNodes=(\[{.*}\]);'){
  21.     $menus = $Matches[1] | ConvertFrom-Json
  22.     $menus = $menus | Sort-Object { $arr=$_.url -split '=';return ([int]$arr[$arr.Length-1]) }
  23. }
  24. #图书id
  25. $book_id = $book_url -split '=' | Select-Object -Last 1
  26. #服务器ip和端口
  27. $server_ip = '159.226.241.32'
  28. $server_port = 81
  29. #默认用户id
  30. $default_user = '825ae171eb514934b1ed2374976f4a9f'
  31. #文档编号
  32. $doc_num_api = 'https://wkobwp.sciencereading.cn/api/file/add'
  33. $resp = Invoke-WebRequest -UseBasicParsing -Method Post -Uri $doc_num_api -Headers @{
  34.     'accessToken' = 'accessToken'
  35.     'Content-Type' = 'application/x-www-form-urlencoded; charset=UTF-8'
  36. } -Body (
  37.     'params=%7B%22params%22%3A%7B%22userName%22%3A%22Guest%22%2C%22userId%22%3A%22{0}%22%2C%22file%22%3A%22http%3A%2F%2F{1}%3A{2}%2F{3}.pdf%22%7D%7D&type=http' -f $default_user,$server_ip,$server_port,$book_id
  38. )
  39. $book_number = ($resp.Content -split '"')[3]
  40. #获取图片总数量
  41. $img_count = $null
  42. while($img_count -eq $null){
  43.     $resp = Invoke-WebRequest -UseBasicParsing -Uri ('https://wkobwp.sciencereading.cn/asserts/{0}/manifest?language=zh-CN' -f $book_number)
  44.     $json = [System.Text.UTF8Encoding]::UTF8.GetString($resp.Content) | ConvertFrom-Json
  45.     $json = $json.docinfo | ConvertFrom-Json
  46.     $img_count = $json.PageCount
  47. }
  48. #下载资源
  49. function Get-FullDir($menus,$menu){
  50.     if($menu.pId -eq '0') {
  51.         return ('.\{0}\{1}' -f $book_name,$menu.name)
  52.     }
  53.     $p_menu = $menus | Where-Object { $_.id -eq $menu.pId }
  54.     $p_dir = Get-FullDir -menus $menus -menu $p_menu
  55.     return ('{0}\{1}' -f $p_dir,$menu.name)
  56. }
  57. function Download-Image($start_page,$end_page,$save_dir){
  58.     [void][System.IO.Directory]::CreateDirectory($save_dir)
  59.     $img_url = 'https://wkobwp.sciencereading.cn/asserts/{0}/image/{1}/100?accessToken=accessToken&formMode=true'
  60.     for($i=$start_page; $i -le $end_page; $i++){
  61.         $url = $img_url -f $book_number,($i-1)
  62.         $png = '{0}\{1}-{2:000}.png' -f $save_dir,[System.IO.Path]::GetFileName($save_dir),$i
  63.         $png
  64.         while($true){
  65.             Write-Host ('{0}/{1}' -f $i,$img_count) -ForegroundColor Yellow
  66.             try{
  67.                 $resp = Invoke-WebRequest -UseBasicParsing -Uri $url
  68.                 [System.IO.File]::WriteAllBytes($png,$resp.Content)
  69.                 [System.IO.Path]::GetFileName($png)
  70.                 break
  71.             } catch {
  72.                 Start-Sleep -Seconds 1  
  73.             }
  74.         }
  75.     }
  76. }
  77. if($menus -ne $null){
  78.     #创建主目录
  79.     [void][System.IO.Directory]::CreateDirectory($book_name)
  80.     $last_dir = '.\' + $book_name + '\封面'
  81.     #遍历子目录
  82.     $last_page = 1
  83.     $menus | foreach {
  84.         #当前目录
  85.         $cur_dir = Get-FullDir -menus $menus -menu $_
  86.         $cur_dir = $cur_dir -replace '\:|\?|\*|\"|\<|\>|\|','' -replace "'",''
  87.         [void][System.IO.Directory]::CreateDirectory($cur_dir)
  88.         #当前目录图片开始索引
  89.         $arr = $_.url -split '='
  90.         $cur_page = [int]$arr[$arr.length-1]
  91.         #下载目录对应的图片
  92.         Write-Host $last_dir
  93.         Write-Host ('pages: [{0}-{1}]' -f $last_page,$cur_page) -ForegroundColor Yellow
  94.         Download-Image -start_page $last_page -end_page $cur_page -save_dir $last_dir
  95.         #目录对应图片下载完成,设置初始化图片索引
  96.         $last_page = $cur_page
  97.         $last_dir = $cur_dir
  98.         '-------------'
  99.     }
  100.     #下载剩余所有图片到最后一个目录
  101.     Write-Host $last_dir
  102.     Write-Host ('pages: [{0}-{1}]' -f $last_page,$img_count) -ForegroundColor Yellow
  103.     Download-Image -start_page $last_page -end_page $img_count -save_dir $last_dir
  104. }
  105. Write-Host '全部下载完成' -ForegroundColor Green
  106. pause
复制代码

作者: 18311622661    时间: 2024-3-9 20:46

6666666666666666666666666666666




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2