Free ebook von Springer

Gute Links und Tutorials könnt ihr hier posten.
Antworten
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Schnell zusammenhacktes um die Englischsprachigen Bücher herunterzuladen. Dazu die Exceltabelle als CSV-Datei im `DOWNLOADS_PATH`-Verzeichnis speichern. Und sowas um die 15 GiB Platz auf der Platte frei haben. :-)

Code: Alles auswählen

#!/usr/bin/env python3
import csv
import re
import time
from pathlib import Path
from shutil import copyfileobj
from urllib.parse import urljoin

import bs4
import requests
from loguru import logger

DOWNLOADS_PATH = Path.home() / "Downloads"
CSV_FILE_PATH = DOWNLOADS_PATH / "Free+English+textbooks.csv"
DELAY_BETWEEN_BOOKS = 5  # in seconds.


def process_book(url, download_path):
    response = requests.get(url)
    if not response.ok:
        logger.error(
            "Can not load book page: {} {}",
            response.status_code,
            response.reason,
        )
    else:
        soup = bs4.BeautifulSoup(response.text, "lxml")
        button_div_node = soup.find(
            "div", "main-body__content"
        ).find_next_sibling("div")
        if not button_div_node:
            logger.error("No buttons found.")
        else:
            download_urls = [
                urljoin(url, node["href"])
                for node in button_div_node("a", "c-button")
            ]
            if not download_urls:
                logger.warning("No download urls found!")
            else:
                logger.info(
                    "Found {} url(s): {}", len(download_urls), download_urls
                )
                for download_url in download_urls:
                    logger.info("Downloading {}", download_url)
                    response = requests.get(download_url, stream=True)
                    if not response.ok:
                        logger.error(
                            "Can not download book: {} {}",
                            response.status_code,
                            response.reason,
                        )
                    else:
                        #
                        # This is an ugly hack!
                        #
                        filename = re.sub(
                            r"^filename\*?=",
                            "",
                            response.headers["Content-Disposition"],
                            re.IGNORECASE,
                        )
                        logger.info("Saving as {!r}", filename)
                        with (download_path / filename).open(
                            "wb"
                        ) as book_file:
                            copyfileobj(response.raw, book_file, 1024 * 1024)
                logger.success("Processed {}", url)


@logger.catch
def main():
    logger.add("test.log")
    download_path = CSV_FILE_PATH.with_suffix("")
    download_path.mkdir(exist_ok=True)
    with CSV_FILE_PATH.open(encoding="utf-8") as csv_file:
        rows = csv.reader(csv_file)
        headers = next(rows)
        open_url_index = headers.index("OpenURL")
        for row_number, row in enumerate(rows, 1):
            url = row[open_url_index]
            logger.info("Processing {}: {}", row_number, url)
            process_book(url, download_path)
            time.sleep(DELAY_BETWEEN_BOOKS)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
nuhakan
User
Beiträge: 51
Registriert: Donnerstag 11. August 2016, 11:42

Uy! Aber nicht alles ist über Programmierung. Schon bemerkt? Gut wäre zu wissen, ob irgendwelches besonders empfehlenswert ist.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nuhakan: Jo, das ist (bei weitem) nicht alles über Programmierung, aber so eine virtuelle Bibliothek nimmt ja zumindest physisch keinen zusätzlichen Platz weg.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
pixewakb
User
Beiträge: 1405
Registriert: Sonntag 24. April 2011, 19:43

In der Kategorie Quick&Dirty ein weiteres Skript, auch hier müssen die Excel-Dateien in csv-Dateien umgewandelt werden:

Code: Alles auswählen

import csv
import os
from pathlib import Path
import shutil

import requests
from bs4 import BeautifulSoup

csv_files = [file for file in os.listdir() if file.endswith(".csv")]

def webpage2soup(url):
    webpage = requests.get(url).text
    soup = BeautifulSoup(webpage, "html5lib")
    return soup

def get_url(soup):
    div_box = soup.find("div", attrs={"class": "cta-button-container__item"})
    a = 'https://link.springer.com' + '/' + div_box.find("a")["href"]
    return a
                    
    
def get_title(soup):
    title = soup.find("div", attrs={"class": "page-title"}).find("h1").text.replace("/", "+").replace(": ", " - ")
    return title

for csv_file in csv_files:
    os.mkdir(csv_file.replace(".csv",""))

for csv_file in csv_files:
    # Wir laden die csv_files und extrahieren hier die doi.org-URLs
    with open(csv_file, "r", encoding="utf-8") as f:
        bookreader = csv.reader(f, delimiter=';', quotechar='"')
        for row in bookreader:
            if row[17] != 'DOI URL':
                print(row[17])
                url = row[17]

                soup = webpage2soup(url)

                title = get_title(soup)

                pdf_url = get_url(soup)                           

                response = requests.get(pdf_url, stream=True)

                with open(Path(csv_file.replace(".csv", "")) / Path(title + ".pdf"), 'wb') as out_file:
                    shutil.copyfileobj(response.raw, out_file)
Ich lade nur die PDF-Dateien herunter, ich mache gerade noch einen Testlauf.
Benutzeravatar
pixewakb
User
Beiträge: 1405
Registriert: Sonntag 24. April 2011, 19:43

PS Es gibt doppelte Einträge, weil Springer mehrere Auflagen anbietet. Mein Skript kann das nicht automatisch fixen, ich arbeite das gerade händisch nach, weil ich teils die ältere Auflage erwischt hatte.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1011
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die Quick&Dirty-Scripts sind immer die besten :-)

Um die Excel-Dateien zu lesen könnte man pyexcel oder pandas verwenden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten