Update: fixed some bug and added svg link replace
This commit is contained in:
parent
e75ce42e12
commit
2a7c1509ab
1 changed files with 36 additions and 20 deletions
|
|
@ -10,7 +10,7 @@ import traceback
|
||||||
from lxml import html
|
from lxml import html
|
||||||
from html import escape
|
from html import escape
|
||||||
from random import random
|
from random import random
|
||||||
from urllib.parse import urljoin, urlsplit
|
from urllib.parse import urljoin, urlsplit, urlparse
|
||||||
from multiprocessing import Process, Queue, Value
|
from multiprocessing import Process, Queue, Value
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -24,7 +24,7 @@ class Display:
|
||||||
datefmt="%d/%b/%Y %H:%M:%S"
|
datefmt="%d/%b/%Y %H:%M:%S"
|
||||||
)
|
)
|
||||||
|
|
||||||
SH_DEFAULT = "\033[0m" if "win" not in sys.platform else "" # TODO colors for Windows
|
SH_DEFAULT = "\033[0m" if "win" not in sys.platform else "" # TODO: colors for Windows
|
||||||
SH_YELLOW = "\033[33m" if "win" not in sys.platform else ""
|
SH_YELLOW = "\033[33m" if "win" not in sys.platform else ""
|
||||||
SH_BG_RED = "\033[41m" if "win" not in sys.platform else ""
|
SH_BG_RED = "\033[41m" if "win" not in sys.platform else ""
|
||||||
SH_BG_YELLOW = "\033[43m" if "win" not in sys.platform else ""
|
SH_BG_YELLOW = "\033[43m" if "win" not in sys.platform else ""
|
||||||
|
|
@ -282,13 +282,10 @@ class SafariBooks:
|
||||||
self.book_chapters = self.get_book_chapters()
|
self.book_chapters = self.get_book_chapters()
|
||||||
self.chapters_queue = self.book_chapters[:]
|
self.chapters_queue = self.book_chapters[:]
|
||||||
|
|
||||||
if len(self.book_chapters) > sys.getrecursionlimit():
|
|
||||||
sys.setrecursionlimit(len(self.book_chapters))
|
|
||||||
|
|
||||||
self.book_title = self.book_info["title"]
|
self.book_title = self.book_info["title"]
|
||||||
self.base_url = self.book_info["web_url"]
|
self.base_url = self.book_info["web_url"]
|
||||||
|
|
||||||
self.BOOK_PATH = os.path.join(PATH, self.book_title)
|
self.BOOK_PATH = os.path.join(PATH, "Books", self.book_title)
|
||||||
self.create_dirs()
|
self.create_dirs()
|
||||||
self.display.info("Output directory:\n %s" % self.BOOK_PATH)
|
self.display.info("Output directory:\n %s" % self.BOOK_PATH)
|
||||||
|
|
||||||
|
|
@ -442,9 +439,6 @@ class SafariBooks:
|
||||||
if "results" not in response or not len(response["results"]):
|
if "results" not in response or not len(response["results"]):
|
||||||
self.display.exit("API: unable to retrieve book chapters.")
|
self.display.exit("API: unable to retrieve book chapters.")
|
||||||
|
|
||||||
if response["count"] > sys.getrecursionlimit():
|
|
||||||
sys.setrecursionlimit(response["count"])
|
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
result.extend([c for c in response["results"] if "cover." in c["filename"]])
|
result.extend([c for c in response["results"] if "cover." in c["filename"]])
|
||||||
for c in result:
|
for c in result:
|
||||||
|
|
@ -474,24 +468,28 @@ class SafariBooks:
|
||||||
|
|
||||||
return root
|
return root
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def url_is_absolute(url):
|
||||||
|
return bool(urlparse(url).netloc)
|
||||||
|
|
||||||
def link_replace(self, link):
|
def link_replace(self, link):
|
||||||
if link:
|
if link:
|
||||||
|
if not self.url_is_absolute(link):
|
||||||
|
link = urljoin(self.base_url, link)
|
||||||
|
if "cover" in link or "images" in link or "graphics" in link or \
|
||||||
|
link[-3:] in ["jpg", "peg", "png", "gif"]:
|
||||||
|
if link not in self.images:
|
||||||
|
self.images.append(link)
|
||||||
|
self.display.log("Crawler: found a new image at %s" % link)
|
||||||
|
|
||||||
if link[0] == "/" and ("cover" in link or "images" in link or "graphics" in link
|
image = link.split("/")[-1]
|
||||||
or link[-3:] in ["jpg", "peg", "png", "gif"]):
|
return "Images/" + image
|
||||||
if link not in self.images:
|
|
||||||
self.images.append(link)
|
|
||||||
self.display.log("Crawler: found a new image at %s" % link)
|
|
||||||
|
|
||||||
image = link.split("/")[-1]
|
|
||||||
return "Images/" + image
|
|
||||||
|
|
||||||
elif link[0] not in ["/", "h"]:
|
|
||||||
return link.replace(".html", ".xhtml")
|
return link.replace(".html", ".xhtml")
|
||||||
|
|
||||||
return link
|
return link
|
||||||
|
|
||||||
def parse_html(self, root):
|
def parse_html(self, root, is_cover=False):
|
||||||
if random() > 0.5:
|
if random() > 0.5:
|
||||||
if len(root.xpath("//div[@class='controls']/a/text()")):
|
if len(root.xpath("//div[@class='controls']/a/text()")):
|
||||||
self.display.exit(self.display.api_error(" "))
|
self.display.exit(self.display.api_error(" "))
|
||||||
|
|
@ -536,9 +534,25 @@ class SafariBooks:
|
||||||
(self.filename, self.chapter_title)
|
(self.filename, self.chapter_title)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if is_cover:
|
||||||
|
page_css += "<style>img,image{height:100%;width:100%;}</style>"
|
||||||
|
|
||||||
book_content = book_content[0]
|
book_content = book_content[0]
|
||||||
book_content.rewrite_links(self.link_replace)
|
book_content.rewrite_links(self.link_replace)
|
||||||
|
|
||||||
|
# TODO: add all not covered tag for `link_replace` function
|
||||||
|
svg_image_tags = root.xpath("//image")
|
||||||
|
if len(svg_image_tags):
|
||||||
|
for img in svg_image_tags:
|
||||||
|
image_attr_href = [x for x in img.attrib.keys() if "href" in x]
|
||||||
|
if len(image_attr_href):
|
||||||
|
svg_url = img.attrib.get(image_attr_href[0])
|
||||||
|
svg_root = img.getparent().getparent()
|
||||||
|
new_img = svg_root.makeelement("img")
|
||||||
|
new_img.attrib.update({"src": self.link_replace(svg_url)})
|
||||||
|
svg_root.remove(img.getparent())
|
||||||
|
svg_root.append(new_img)
|
||||||
|
|
||||||
xhtml = None
|
xhtml = None
|
||||||
try:
|
try:
|
||||||
xhtml = html.tostring(book_content, method="xml", encoding='unicode')
|
xhtml = html.tostring(book_content, method="xml", encoding='unicode')
|
||||||
|
|
@ -577,6 +591,8 @@ class SafariBooks:
|
||||||
if not len(self.chapters_queue):
|
if not len(self.chapters_queue):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
is_cover = len_books == len(self.chapters_queue)
|
||||||
|
|
||||||
next_chapter = self.chapters_queue.pop(0)
|
next_chapter = self.chapters_queue.pop(0)
|
||||||
self.chapter_title = next_chapter["title"]
|
self.chapter_title = next_chapter["title"]
|
||||||
self.filename = next_chapter["filename"]
|
self.filename = next_chapter["filename"]
|
||||||
|
|
@ -597,7 +613,7 @@ class SafariBooks:
|
||||||
self.display.book_ad_info = 2
|
self.display.book_ad_info = 2
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.save_page_html(self.parse_html(self.get_html(urljoin(self.base_url, self.filename))))
|
self.save_page_html(self.parse_html(self.get_html(urljoin(self.base_url, self.filename)), is_cover))
|
||||||
|
|
||||||
self.display.state(len_books, len_books - len(self.chapters_queue))
|
self.display.state(len_books, len_books - len(self.chapters_queue))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue