Eng:
https://rentry.co/vh3py
Fr:
https://rentry.co/hzpue/
Japanese:
https://crieit.net/posts/Bank-6249a7b59dfd9
Sobre lo que era un banco de manga.
El "mangabank | Manga bank" se ha ido.
Se convirtió en un nuevo sitio ilegal llamado 13dl.me, pero como el estilo de lectura en línea se abandonó y se convirtió en un tipo de ámbito de descarga, este artículo también se actualizó en la pizarra, como un nuevo paso.
Tablero pasado
Hasta que Mangabank desaparezca
https://crieit.net/boards/manga-b
Bueno, siempre me he preguntado cómo escribir Javascript
, así que escribí un programa Javascript
usando node.js
para ver cómo es este nuevo sitio ilegal.
Me tomó un tiempo porque no estaba familiarizado con Promise
, pero él tenía más documentación sobre Javascript
que Nim
, así que no pasó mucho tiempo antes de que el programa funcionara.
Instale node.js e instale axios, cheerio con el administrador de paquetes npm.
https://nodejs.org/ja/
https://github.com/axios/axios#installing
https://cheerio.js.org/
Un módulo que Axios
solicita HTTPS, es un valor de retorno de tipo promesa y puede procesar la respuesta si el 1 tiene éxito.
Cheerio
usa texto HTML como objeto y lo usa como selector de CSS.
Lo usé como Nokogiri
en Ruby
, como BueAtifulSoup4
en Python
, como Goquery
en Go
, como Nimquery
en Nim
.
Estos selectores de conveniencia tienen usos similares y son diferentes, por lo que si no está acostumbrado a no poder usarlos correctamente a menos que los mire detenidamente, puede arreglárselas con expresiones regulares incluso si no las usa, así que en este caso es lo mismo incluso si el idioma es diferente. El estilo de expresión regular estándar se puede escribir de la misma manera.
Go
también tiene un módulo de expresión regular estilo perl
, aunque no es una biblioteca estándar.
RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library.
License
BSD-3-Clause license
https://github.com/google/re2/
Base
| const cheerio = require('cheerio'),
axios = require('axios');
// url = `https://13dl.me/`;
var url = `https://13dl.me/list/popular/`;
var counter = 0;
function recursive(url){
let temp_url = url;
axios.get(url)
.then((response) => {
if (response.status == 200){
let $ = cheerio.load(response.data);
$('a').each(function (i, e) {
let title = $(e).attr('title');
let link = $(e).attr('href');
if (title !== undefined){
let h = /^Home/.test(title),
po = /^Popular\s/.test(title),
p = /^Prev/.test(title),
pa = /^Page/.test(title),
n = /^Next/.test(title);
if (h || po || p || pa || n || title === ``){
//unless
} else {
counter++;
console.log(counter + `{` + title +`{` + link);
// console.log(counter,title);
// console.log(`____________________`);
}
}
if (title === `Next`){
url = link;
// recursive(url);
}
})
if (url !== temp_url){
recursive(url);
}
}
}).catch(function (e) {
console.log(e);
recursive(url);
});
}
recursive(url);
|
Qué tipo de programa es, enumera el contenido en el sitio.
Llama a la función de forma recursiva, pero no sabía cómo escribirlo en Javascript
, pero funcionó, así que guardemos el contenido en la lista de la base de datos SQLite
.
Si lo usa con awk
, también puede crear archivos de base de datos SQLite3
con este programa básico. Establézcalo en csv
con el delimitador {
, lea csv
con SQLite3
y guárdelo, y será un archivo de base de datos.
https://rentry.co/i542t
Ruby
Si escribe un código de programa Ruby
similar a este,
| require 'nokogiri'
require 'open-uri'
url = 'https://13dl.me/list/popular/'
counter = 0
threads = []
def recursive(counter,url,threads)
html = URI.open(url).read
doc = Nokogiri::HTML.parse(html)
html = nil
doc.css('a').each do |x|
xx = x.attr('title')
pa = /^Page/.match?("#{xx}")
p = /^Prev/.match?("#{xx}")
if xx && xx !='' && xx !='Home' && xx !='Popular Manga' then
unless pa | p then
n = /^Next/.match?("#{xx}")
link = ''
if n then
link = x.attr('href')
threads << Thread.new do
recursive(counter,link,threads)
end
else
counter += 1
puts "#{counter} #{xx}"
end
end
end
end
doc = nil
end
recursive(counter,url,threads)
threads.each(&:join)
|
2. SQLite3 + db.close()
| const cheerio = require('cheerio'),
axios = require('axios');
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('13dlme_test1-1.db',(err) => {
if(err) {
return console.error(err.message);
}
console.log('Connect to SQLite database.');
});
db.serialize(() => {
db.run(`CREATE TABLE manga(id interger,title string,link string)`)
});
;
var url = `https://13dl.me/list/popular/`;
var counter = 0;
function recursive(url){
const temp_url = url;
const promise1 = axios.get(url)
const promiseData1 = promise1.then((response) => {
if (response.status == 200){
let $ = cheerio.load(response.data);
$('a').each(function (i, e) {
const title = $(e).attr('title');
const link = $(e).attr('href');
if (title !== undefined){
const h = /^Home/.test(title),
po = /^Popular\s/.test(title),
p = /^Prev/.test(title),
pa = /^Page/.test(title),
n = /^Next/.test(title);
if (h || po || p || pa || n || title === ``){
//unless
} else {
counter++;
// console.log(counter + ` ** ` + title + ` ** ` + link);
db.serialize(() => {
db.run(`insert into manga(id,title) VALUES(?,?)`,[counter,title]);
});
console.log(counter,title);
console.log(`____________________`);
}
}
if ((title === `Next`) && (link != undefined)){
url = link;
}
})
} else {
console.log(response);
}
if (temp_url !== url){
return recursive(url);
// `:keep going:`;
} else {
console.log('Close SQLite database.');
return `:stop:`;
}
}).catch(function (e) {
console.log(e);
});
Promise.all([promiseData1]).then((value) => {
if (value[0] === `:stop:`){
db.close((err) => {
if(err) {
console.error(err.message);
}
});
}
});
}
recursive(url);
|
3. async/await
| const cheerio = require('cheerio'),
axios = require('axios');
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('13dlme_test2.db',(err) => {
if(err) {
return console.error(err.message);
}
console.log('Connect to SQLite database.');
});
db.serialize(() => {
db.run(`CREATE TABLE manga(id interger,title string,link string)`)
});
var url = `https://13dl.me/list/popular/`;
var counter = 0;
const recursive = async (url) => {
console.log(url);
const temp_url = url;
try {
const {data} = await axios.get(url);
const $ = cheerio.load(data)
$('a').each(function (i, e) {
const title = $(e).attr('title');
const link = $(e).attr('href');
if (title !== undefined){
const h = /^Home/.test(title),
po = /^Popular\s/.test(title),
p = /^Prev/.test(title),
pa = /^Page/.test(title),
n = /^Next/.test(title);
if (h || po || p || pa || n || title === ``){
//unless
} else {
counter++;
// console.log(counter + ` ** ` + title + ` ** ` + link);
db.run(`insert into manga(id,title) VALUES(?,?)`,[counter,title]);
console.log(counter,title);
console.log(`____________________`);
}
}
if ((title === `Next`) && (link != undefined)){
url = link;
}
});
if (temp_url !== url) {
recursive(url);
//`:keep going:`;
}else{
console.log('Close SQLite database.');
db.close();
//`:stop:`;
}
} catch(error) {
throw error;
}
}
recursive(url);
|
Ruby SQLite3
| require 'nokogiri'
require 'open-uri'
require 'sqlite3'
url = 'https://13dl.me/list/popular/'
counter = 0
threads = []
SQL =<<EOS
create table manga(
id INTEGER PRIMARY KEY,
title text
);
EOS
db = SQLite3::Database.open("13dlme.db")
db.execute(SQL)
def recursive(counter,url,threads,db)
html = URI.open(url).read
doc = Nokogiri::HTML.parse(html)
html = nil
doc.css('a').each do |x|
xx = x.attr('title')
pa = /^Page/.match?("#{xx}")
p = /^Prev/.match?("#{xx}")
if xx && xx !='' && xx !='Home' && xx !='Popular Manga' then
unless pa | p then
n = /^Next/.match?("#{xx}")
link = ''
if n then
link = x.attr('href')
threads << Thread.new do
recursive(counter,link,threads,db)
end
else
counter += 1
puts "#{counter} #{xx}"
db.execute("insert into manga(id,title) values('#{counter}','#{xx}') ;")
end
end
end
end
doc = nil
end
recursive(counter,url,threads,db)
threads.each(&:join)
db.close
|
Como programa, si la aplicación termux
o userland
funciona en un teléfono inteligente, etc., node.js
se puede instalar como un paquete incluso si no está rooteado, por lo que funciona.