fix some display issues & add scrape url logger
This commit is contained in:
parent
1ecb9d08c7
commit
af1eba56b2
11 changed files with 176 additions and 43 deletions
|
@ -15,6 +15,7 @@
|
|||
<meta property="og:url" content="{{ request.build_absolute_uri }}">
|
||||
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}{{ book.cover.url }}">
|
||||
<meta property="og:site_name" content="NiceDB">
|
||||
<meta property="og:description" content="{{ book.brief }}">
|
||||
{% if book.author %}
|
||||
<meta property="og:book:author" content="{% for author in book.author %}{{ author }}{% if not forloop.last %},{% endif %}{% endfor %}">
|
||||
{% endif %}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
import requests
|
||||
import functools
|
||||
import random
|
||||
import logging
|
||||
from lxml import html
|
||||
import re
|
||||
from boofilsic.settings import LUMINATI_USERNAME, LUMINATI_PASSWORD, DEBUG
|
||||
|
@ -30,6 +32,25 @@ TIMEOUT = 10
|
|||
# luminati account credentials
|
||||
PORT = 22225
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def log_url(func):
|
||||
"""
|
||||
Catch exceptions and log then pass the exceptions.
|
||||
First postion argument of decorated function must be the url.
|
||||
"""
|
||||
@functools.wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
try:
|
||||
return func(*args, **kwargs)
|
||||
except Exception as e:
|
||||
# log the url
|
||||
logger.error(f"Scrape Failed URL: {args[0]}")
|
||||
raise e
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def download_page(url, regex, headers):
|
||||
url = regex.findall(url)
|
||||
|
@ -85,6 +106,7 @@ def download_image(url):
|
|||
return raw_img
|
||||
|
||||
|
||||
@log_url
|
||||
def scrape_douban_book(url):
|
||||
regex = RE_DOUBAN_BOOK_URL
|
||||
headers = DEFAULT_REQUEST_HEADERS.copy()
|
||||
|
@ -214,6 +236,7 @@ def scrape_douban_book(url):
|
|||
return data, raw_img
|
||||
|
||||
|
||||
@log_url
|
||||
def scrape_douban_movie(url):
|
||||
regex = RE_DOUBAN_MOVIE_URL
|
||||
headers = DEFAULT_REQUEST_HEADERS.copy()
|
||||
|
|
|
@ -2180,3 +2180,7 @@ select::placeholder {
|
|||
.ms-parent > .ms-drop > ul > li > label > span {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.ms-parent > .ms-drop > ul > li > label > input {
|
||||
width: unset;
|
||||
}
|
||||
|
|
|
@ -32,5 +32,9 @@
|
|||
&:hover, &:focus
|
||||
color: black
|
||||
|
||||
.ms-parent > .ms-drop > ul > li > label > span
|
||||
margin-left: 10px
|
||||
.ms-parent > .ms-drop > ul > li > label
|
||||
& > span
|
||||
margin-left: 10px
|
||||
& > input
|
||||
width: unset
|
||||
|
||||
|
|
18
common/templatetags/strip_protocol.py
Normal file
18
common/templatetags/strip_protocol.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
from django import template
|
||||
from django.template.defaultfilters import stringfilter
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.filter(is_safe=True)
|
||||
@stringfilter
|
||||
def strip_protocol(value):
|
||||
""" Strip the `https://.../` part of urls"""
|
||||
if value.startswith("https://"):
|
||||
value = value.replace("https://", '')
|
||||
elif value.startswith("http://"):
|
||||
value = value.replace("http://", '')
|
||||
|
||||
if value.endswith('/'):
|
||||
value = value[0:-1]
|
||||
return value
|
|
@ -51,10 +51,24 @@
|
|||
{% endif %}
|
||||
</a></h5>
|
||||
<div>{% if movie.director %}{% trans '导演:' %}
|
||||
{% for director in movie.director %}
|
||||
<span>{{ director }}</span>{% if not forloop.last %} / {% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}</div>
|
||||
{% for director in movie.director %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;" {% endif %}>
|
||||
<span class="director">{{ director }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% endfor %}
|
||||
{% if movie.director|length > 5 %}
|
||||
<a href="javascript:void(0);" id="directorMore">{% trans '更多' %}</a>
|
||||
<script>
|
||||
$("#directorMore").click(function (e) {
|
||||
$("span.director:not(:visible)").each(function (e) {
|
||||
$(this).parent().removeAttr('style');
|
||||
});
|
||||
$(this).remove();
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.genre %}{% trans '类型:' %}
|
||||
{% for genre in movie.get_genre_display %}
|
||||
<span>{{ genre }}</span>{% if not forloop.last %} / {% endif %}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
{% load mastodon %}
|
||||
{% load oauth_token %}
|
||||
{% load truncate %}
|
||||
{% load strip_protocol %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
|
@ -88,35 +89,61 @@
|
|||
</div>
|
||||
<div>{% if movie.director %}{% trans '导演:' %}
|
||||
{% for director in movie.director %}
|
||||
<span>{{ director }}</span>{% if not forloop.last %} / {% endif %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;" {% endif %}>
|
||||
<span class="director">{{ director }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% endfor %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.playwright %}{% trans '编剧:' %}
|
||||
{% for playwright in movie.playwright %}
|
||||
<span>{{ playwright }}</span>{% if not forloop.last %} / {% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.actor %}{% trans '主演:' %}
|
||||
{% for actor in movie.actor %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;"{% endif %}>
|
||||
<span class="actor">{{ actor }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% if forloop.counter <= 5 %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
{% if movie.actor|length > 5 %}
|
||||
<a href="javascript:void(0);" id="actorMore">{% trans '更多' %}</a>
|
||||
{% if movie.director|length > 5 %}
|
||||
<a href="javascript:void(0);" id="directorMore">{% trans '更多' %}</a>
|
||||
<script>
|
||||
$("#actorMore").click(function(e) {
|
||||
$("span.actor:not(:visible)").each(function(e){
|
||||
$("#directorMore").click(function (e) {
|
||||
$("span.director:not(:visible)").each(function (e) {
|
||||
$(this).parent().removeAttr('style');
|
||||
});
|
||||
$(this).remove();
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.playwright %}{% trans '编剧:' %}
|
||||
{% for playwright in movie.playwright %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;" {% endif %}>
|
||||
<span class="playwright">{{ playwright }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% endfor %}
|
||||
{% if movie.playwright|length > 5 %}
|
||||
<a href="javascript:void(0);" id="playwrightMore">{% trans '更多' %}</a>
|
||||
<script>
|
||||
$("#playwrightMore").click(function (e) {
|
||||
$("span.playwright:not(:visible)").each(function (e) {
|
||||
$(this).parent().removeAttr('style');
|
||||
});
|
||||
$(this).remove();
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.actor %}{% trans '主演:' %}
|
||||
{% for actor in movie.actor %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;"{% endif %}>
|
||||
<span class="actor">{{ actor }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% endfor %}
|
||||
|
||||
{% if movie.actor|length > 5 %}
|
||||
<a href="javascript:void(0);" id="actorMore">{% trans '更多' %}</a>
|
||||
<script>
|
||||
$("#actorMore").click(function(e) {
|
||||
$("span.actor:not(:visible)").each(function(e){
|
||||
$(this).parent().removeAttr('style');
|
||||
});
|
||||
$(this).remove();
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.genre %}{% trans '类型:' %}
|
||||
|
@ -156,7 +183,7 @@
|
|||
{% endfor %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.site %}{% trans '网站:' %}
|
||||
<a href="{{ movie.site }}" target="_blank">{{ movie.site }}</a>
|
||||
<a href="{{ movie.site }}" target="_blank">{{ movie.site|strip_protocol }}</a>
|
||||
{% endif %}</div>
|
||||
{% if movie.other_info %}
|
||||
{% for k, v in movie.other_info.items %}
|
||||
|
|
|
@ -120,10 +120,24 @@
|
|||
</a></h5>
|
||||
|
||||
<div>{% if movie.director %}{% trans '导演:' %}
|
||||
{% for director in movie.director %}
|
||||
<span>{{ director }}</span>{% if not forloop.last %} / {% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}</div>
|
||||
{% for director in movie.director %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;" {% endif %}>
|
||||
<span class="director">{{ director }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% endfor %}
|
||||
{% if movie.director|length > 5 %}
|
||||
<a href="javascript:void(0);" id="directorMore">{% trans '更多' %}</a>
|
||||
<script>
|
||||
$("#directorMore").click(function (e) {
|
||||
$("span.director:not(:visible)").each(function (e) {
|
||||
$(this).parent().removeAttr('style');
|
||||
});
|
||||
$(this).remove();
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.genre %}{% trans '类型:' %}
|
||||
{% for genre in movie.get_genre_display %}
|
||||
<span>{{ genre }}</span>{% if not forloop.last %} / {% endif %}
|
||||
|
|
|
@ -99,10 +99,24 @@
|
|||
</a></h5>
|
||||
|
||||
<div>{% if movie.director %}{% trans '导演:' %}
|
||||
{% for director in movie.director %}
|
||||
<span>{{ director }}</span>{% if not forloop.last %} / {% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}</div>
|
||||
{% for director in movie.director %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;" {% endif %}>
|
||||
<span class="director">{{ director }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% endfor %}
|
||||
{% if movie.director|length > 5 %}
|
||||
<a href="javascript:void(0);" id="directorMore">{% trans '更多' %}</a>
|
||||
<script>
|
||||
$("#directorMore").click(function (e) {
|
||||
$("span.director:not(:visible)").each(function (e) {
|
||||
$(this).parent().removeAttr('style');
|
||||
});
|
||||
$(this).remove();
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.genre %}{% trans '类型:' %}
|
||||
{% for genre in movie.get_genre_display %}
|
||||
<span>{{ genre }}</span>{% if not forloop.last %} / {% endif %}
|
||||
|
|
|
@ -106,10 +106,24 @@
|
|||
</a></h5>
|
||||
|
||||
<div>{% if movie.director %}{% trans '导演:' %}
|
||||
{% for director in movie.director %}
|
||||
<span>{{ director }}</span>{% if not forloop.last %} / {% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}</div>
|
||||
{% for director in movie.director %}
|
||||
<span {% if forloop.counter > 5 %}style="display: none;" {% endif %}>
|
||||
<span class="director">{{ director }}</span>
|
||||
{% if not forloop.last %} / {% endif %}
|
||||
</span>
|
||||
{% endfor %}
|
||||
{% if movie.director|length > 5 %}
|
||||
<a href="javascript:void(0);" id="directorMore">{% trans '更多' %}</a>
|
||||
<script>
|
||||
$("#directorMore").click(function (e) {
|
||||
$("span.director:not(:visible)").each(function (e) {
|
||||
$(this).parent().removeAttr('style');
|
||||
});
|
||||
$(this).remove();
|
||||
})
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endif %}</div>
|
||||
<div>{% if movie.genre %}{% trans '类型:' %}
|
||||
{% for genre in movie.get_genre_display %}
|
||||
<span>{{ genre }}</span>{% if not forloop.last %} / {% endif %}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<img src="{% static 'img/logo.svg' %}" class="logo" alt="boofilsic logo">
|
||||
|
||||
<div id="loginButton">
|
||||
<p>欢迎来到里瓣书影音(其实现在只有书)!</p>
|
||||
<p>欢迎来到里瓣书影音(其实现在只有书汗电影)!</p>
|
||||
<p>
|
||||
里瓣书影音继承了长毛象的用户关系,比如您在里瓣屏蔽了某人,那您将不会在书影音的公共区域看到TA的痕迹。
|
||||
这里仍是一片处女地,丰富的内容需要大家共同创造!
|
||||
|
@ -26,7 +26,7 @@
|
|||
BTW欧盟惯例本站使用了Cookie,请理解!
|
||||
</p>
|
||||
<p>
|
||||
此外里瓣书影音现处于“公开阿尔法测试”阶段,您的数据存在丢失的可能
|
||||
此外里瓣书影音现处于“公开阿尔法测试”阶段,您的数据存在丢失的可能。
|
||||
|
||||
<form action="{% url 'users:register' %}" method="post">
|
||||
{% csrf_token %}
|
||||
|
|
Loading…
Add table
Reference in a new issue