рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рддрдХрдиреАрдХреА рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд╢рд╛рдпрдж рдЖрд▓реЛрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдпрд╛ рд╢рд╛рдпрдж рдХреЛрдИ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рдЦреАрдВрдЪреЗрдЧрд╛ред
рдЯрд╛рд╕реНрдХред рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
рдЫрд╡рд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдирд╛:- рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╕реНрд░реЛрдд рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░реНрд╕ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред
- рд╕реНрд░реЛрдд рд╕реЗ рдЖрдкрдХреЛ рдЕрдзрд┐рдХрддрдо рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╢реНрд░реЗрдгреА, рдирд╛рдо, рдХреАрд╡рд░реНрдбред
- рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдордиреЗ рдЗрд╕ рдЫрд╡рд┐ рдХреЛ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рд╣реИред
- рдордХрдбрд╝реА рдореБрдЦреНрдп рд╕рд░реНрд╡рд░ рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХреБрдЫ рднреА рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕реЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХрддрд╛рд░ рдореЗрдВ рдЧрд┐рд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ рдореЗрдВ рдЦреЛрдЬреЗрдВ:- рдХреАрд╡рд░реНрдб рдЦреЛрдЬ
- рд░рдВрдЧ рд╕реЗ рдЦреЛрдЬреЗрдВ
- рдЫрд╡рд┐ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬреЗрдВ (рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо)
- рд╡рд░реНрдЧреАрдХрд░рдг
- рдЕрдзрд┐рдХрддрдо рдЦреЛрдЬ рд╕рдордп 0.05 - 0.08ms
рдПрдХ рдХрд╛рд░реНрдп рд╣реИред рд╣рдо рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ?
- рдореБрдЦреНрдп PL: рдкрд╛рдпрдерди, рд╕рд╛рдЗрдерди (+ рдореБрдбрд╝)
- рдЫрд╡рд┐ рд╕реВрдЪрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕: MySQL, рд╕реНрдлрд┐рдВрдХреНрд╕, рд░реЗрдбрд┐рд╕
- рд╡реЗрдм рд╕рд░реНрд╡рд░: рдЯреНрд╡рд┐рд╕реНрдЯреЗрдб-рд╡реЗрдм + рдиреЗрдЧреНрдиреЗрдХреНрд╕
рдордХрдбрд╝рд┐рдпреЛрдВ
"рд╕реНрдкрд╛рдЗрдбрд░" рдЕрд▓рдЧ-рдЕрд▓рдЧ "рдЫреЛрдЯреЗ" (рд╕рд╕реНрддреЗ) рд╡реАрдкреАрдПрд╕-рд╕рд░реНрд╡рд░ рдкрд░ рд╣реИрдВред рд▓рдЧрднрдЧ рдореБрдлреНрдд рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рд╛рде рд╣реА рдХреБрдЫ "рд╕реНрд░реЛрдд" рд╣рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдордХрдбрд╝реА рдкрджрд╛рдиреБрдХреНрд░рдо:
p0is0n @ localhost: ~ / рдбреЗрд╡рд▓рдкрд░ / arx- рдЪрд┐рддреНрд░ $ ls -la ./spiders/
base.py
indexers.py
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
- рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╕рдХреИрдо рдореЗрдВ рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ twisted.application.service.Service рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВред
- indexers.py рд╕рднреА рдордХрдбрд╝рд┐рдпреЛрдВ рдХрд╛ рд╕реАрдзрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╣реИред
- рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рд╕реНрд╡рдпрдВ "рд╕реНрд░реЛрдд" рдХреЗ рдкрд╛рд░реНрд╕рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд▓рдЧрднрдЧ рд╕рд╛рдЗрдЯ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдмрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП)ред
p0is0n @ localhost: ~ / рдбреЗрд╡рд▓рдкрд░ / рдЖрд░рдПрдХреНрд╕-рдЗрдореЗрдЬ $ ls -la/spiders/ster
bikewalls.py
carwalls.py
...
...
рд╕рднреА
рдкрд╛рд░рд░реНрд╕ рдмреЗрд╕ рдмреЗрд╕рд┐рдХреНрд╕ рдореЗрдВ рдШреЛрд╖рд┐рдд
рдмреЗрд╕рдЗрдВрдбреЗрдХреНрд╕рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВ
рдирдореВрдирд╛ carwalls.py рд╕реНрд░реЛрдд рдХреЛрдб (рдЬреИрд╕рд╛ рд╣реИ рдХреЛрдб)import sys import random import re import os from itertools import cycle, chain from types import ListType, TupleType from pprint import pprint from cStringIO import StringIO from hashlib import md5 from twisted.python.log import msg, err from twisted.internet.defer import Deferred, DeferredQueue, inlineCallbacks, returnValue from core.queues import httpQueue from core.utils import sleep, get_best_resolution from core.constants import DEBUG from core.models import ImageModel, contextModel from core.html import normalize, normalize_title from base import sources, BaseIndexer class CarwallsIndexer(BaseIndexer): """CarwallsIndexer class""" name = 'Carwalls.com' charset = 'utf8' index = 'http://www.desktopmachine.com/' source = sources.add(4) pages = cycle(chain(*( ('?p={0}'.format(page) for page in xrange(0, 500, 18)), ))) reFindImagesList = re.compile(u'<a href=([\S]+framepic\.php\?id=\d+&size=[\S]+)[^>]+>2560\s*x\s*1600<\/a>', re.S).findall reFindTitle = re.compile(u"<title>(.+?)2560\s*x\s*1600 wallpaper<\/title>", re.S).search reFindPhoto = re.compile(u'<td colspan=2>\s*<img src=([\S]+\/pics\/[\S]+2560x1600\.(?:jpg))>\s*<\/td>', re.S).search @inlineCallbacks def _findImages(self): self._stats.page = self.pages.next()
рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ indexers.py рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
from twisted.application.service import Application, MultiService from core import constants from sources.carwalls import CarwallsIndexer from sources.bikewalls import BikewallsIndexer application = Application("ARX-Images Indexers") services = MultiService() services.setServiceParent(application) services.addService(CarwallsIndexer()) services.addService(BikewallsIndexer())
"рд╕реНрд░реЛрдд" рдиреЗ рд╕рднреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдФрд░ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж,
BaseIndexer.imageQueuePut рд╡рд┐рдзрд┐
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП "рд╕реНрдерд╛рдиреАрдп" рдХрддрд╛рд░ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рд╣реЛрддреА рд╣реИ: рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ, рдЦреЛрдЬрд╢рдмреНрдж, рд╢реАрд░реНрд╖рдХред рдЗрд╕рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛рдмреЗрд╕ (рдпрд╛ рдореБрдЦреНрдп рдХрддрд╛рд░) рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рддреЛ рдЫрд╡рд┐ рдХреЛ рдореБрдЦреНрдп рд╕рд░реНрд╡рд░ рдкрд░ рдХрддрд╛рд░ рдореЗрдВ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЦреНрдп рд╕рд░реНрд╡рд░ рдкрд░, рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИ: рд╣рдо рдХреАрд╡рд░реНрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЫрд╡рд┐ (рд░рдВрдЧ, рдЖрдХрд╛рд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рдердВрдмрдиреЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЫрд╡рд┐ рдХреЛ рдореБрдЦреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЫрд╡рд┐ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛ред рдЫрд╡рд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдлреЗрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЖрдзрд╛рд░ (
рд╣реИрдмрд░ рдкрд░ рд▓реЗрдЦ ) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣реИрд╢ рдлрдВрдХреНрд╢рди def getImageHash(image): cdef unsigned int lefts, row, i cdef unsigned long long bits cdef list results = [] if not isinstance(image, Image.Image): image = Image.open(image) image = image.resize((128, 128)) image = image.filter(ImageFilter.Kernel( (5, 5), ( 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1 ), 8, 0 )) image = ImageOps.grayscale(image) image = image.resize((16, 16)).convert('P', dither=Image.NONE) lefts = (sum(image.getdata()) / HASH_BITS) datas = image.getdata() for i in xrange(0, 256, 32): bits = int(''.join('1' if row > lefts else '0' for row in islice(datas, i, i + 32)), 2)
рд╣реИрд╢ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВ:
- рд╣реИрд╢ рдЬреЛрдбрд╝реЗрдВ
- рд╣рдЯрд╛рдирд╛
- рд╣реИрд╢ рджреНрд╡рд╛рд░рд╛ "рд╕рдорд╛рди" рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ
рдЦреЛрдЬ рдПрдХ рд╕рд╛рдзрд╛рд░рдг
рдмреНрд░реВрдЯ-рдлреЛрд░реНрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЦреЛрдЬ рд╣реИред
рд╕рднреА "рднрд╛рд░реА" рд╕рд░реНрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдЗрдереЙрди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред
рдкреБрдирд╢реНрдЪ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рдЕрдЧрд▓реА рдХрдбрд╝реА рд▓рд┐рдЦреВрдВрдЧрд╛ред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреБрдж:
picsfab.com