modis-crawler-utils 0.3.0__tar.gz → 0.3.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/PKG-INFO +1 -1
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/echo.py +1 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/requests_middleware.py +8 -5
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/files.py +30 -7
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/pyproject.toml +1 -1
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/README.md +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/cloudflare_captcha_bypass.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/credential.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/manager.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/store/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/store/local.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/store/talisman.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/deploy/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/deploy/bump_version.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/deploy/create_egg.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/deploy/make_arguments_md_file.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/domains.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/dupefilter.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/dupefilter_strategies/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/dupefilter_strategies/delta_fetch_items.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/dupefilter_strategies/depth_based.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/dupefilter_strategies/drop_unproductive_requests.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/items_pipeline.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/request_fingerprint.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/storage.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/images.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/kafka.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/logstash.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/misc.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/mongodb.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/proxypy.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/social_media/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/social_media/items.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/socks.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/splash_proxy.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/states/__init__.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/states/local_store.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/states/talisman_states_api.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/talisman_controller.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/talisman_job_env.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/talisman_proxy.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/talisman_spider_state.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/timestamp.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/trust_level.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/uuid.py +0 -0
- {modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/validate_input.py +0 -0
|
@@ -28,9 +28,12 @@ class ElasticRequestsDownloaderMiddleware:
|
|
|
28
28
|
return mid
|
|
29
29
|
|
|
30
30
|
def process_request(self, request, spider):
|
|
31
|
-
request.meta
|
|
31
|
+
if not request.meta.get('dont_index'):
|
|
32
|
+
request.meta['request_timer/start'] = time.time()
|
|
32
33
|
|
|
33
34
|
def process_response(self, request, response, spider):
|
|
35
|
+
if request.meta.get('dont_index') or 'request_timer/start' not in request.meta:
|
|
36
|
+
return response
|
|
34
37
|
item = self._request_item_base(request)
|
|
35
38
|
item['url'] = response.url
|
|
36
39
|
item['http_status'] = response.status
|
|
@@ -39,10 +42,10 @@ class ElasticRequestsDownloaderMiddleware:
|
|
|
39
42
|
return response
|
|
40
43
|
|
|
41
44
|
def process_exception(self, request, exception, spider):
|
|
42
|
-
if 'request_timer/start' in request.meta:
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
if request.meta.get('dont_index') or 'request_timer/start' not in request.meta:
|
|
46
|
+
return
|
|
47
|
+
item = self._request_item_base(request)
|
|
48
|
+
self.es_storage.index(self.index, item)
|
|
46
49
|
|
|
47
50
|
def _request_item_base(self, request):
|
|
48
51
|
timestamp = time.time()
|
|
@@ -9,7 +9,7 @@ from collections.abc import Iterable
|
|
|
9
9
|
from contextlib import suppress
|
|
10
10
|
from io import BytesIO
|
|
11
11
|
from os.path import basename, join, splitext
|
|
12
|
-
from typing import BinaryIO, Union
|
|
12
|
+
from typing import BinaryIO, MutableMapping, Optional, Union
|
|
13
13
|
from urllib.parse import quote_plus, unquote, urlsplit
|
|
14
14
|
|
|
15
15
|
from itemadapter import ItemAdapter
|
|
@@ -24,10 +24,31 @@ from scrapy.utils.misc import md5sum
|
|
|
24
24
|
from twisted.internet.defer import DeferredList, maybeDeferred
|
|
25
25
|
|
|
26
26
|
from crawler_utils.elasticsearch.request_fingerprint import default_request_fingerprint
|
|
27
|
+
from crawler_utils.social_media.items import AttachmentType
|
|
27
28
|
|
|
28
29
|
logger = logging.getLogger(__name__)
|
|
29
30
|
|
|
30
31
|
|
|
32
|
+
def set_attachment_type(attachment: MutableMapping, attachment_type: Optional[str]):
|
|
33
|
+
if attachment_type is None:
|
|
34
|
+
attachment.pop('attachment_type', None)
|
|
35
|
+
attachment.pop('attachment_type_raw', None)
|
|
36
|
+
return
|
|
37
|
+
try:
|
|
38
|
+
attachment['attachment_type'] = AttachmentType(attachment_type).value
|
|
39
|
+
attachment.pop('attachment_type_raw', None)
|
|
40
|
+
except ValueError:
|
|
41
|
+
attachment['attachment_type_raw'] = attachment_type
|
|
42
|
+
attachment.pop('attachment_type', None)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_attachment_type(attachment: MutableMapping) -> Optional[str]:
|
|
46
|
+
attachment_type = attachment.get('attachment_type')
|
|
47
|
+
if isinstance(attachment_type, AttachmentType):
|
|
48
|
+
attachment_type = attachment_type.value
|
|
49
|
+
return attachment_type or attachment.get('attachment_type_raw')
|
|
50
|
+
|
|
51
|
+
|
|
31
52
|
class FilesPipeline(ImagesPipelineBase, FilesPipelineBase):
|
|
32
53
|
""" Pipeline for downloading files.
|
|
33
54
|
|
|
@@ -363,7 +384,7 @@ class FilesPipeline(ImagesPipelineBase, FilesPipelineBase):
|
|
|
363
384
|
'attachment': attachment,
|
|
364
385
|
'resource_tag': resource_tag,
|
|
365
386
|
'is_image_request': (self._process_images
|
|
366
|
-
and attachment
|
|
387
|
+
and get_attachment_type(attachment) in self._image_attachment_types)
|
|
367
388
|
}
|
|
368
389
|
)
|
|
369
390
|
|
|
@@ -423,9 +444,10 @@ class FilesPipeline(ImagesPipelineBase, FilesPipelineBase):
|
|
|
423
444
|
|
|
424
445
|
def thumb_path(self, request, thumb_id, response=None, info=None, *, item=None):
|
|
425
446
|
attachment = request.meta.get('attachment') or {'url': request.url}
|
|
426
|
-
type_tag = attachment
|
|
447
|
+
type_tag = get_attachment_type(attachment) or self._default_type_tag
|
|
427
448
|
thumb_type_tag = f'{type_tag}-{thumb_id}' if type_tag else thumb_id
|
|
428
|
-
thumb_attachment = {**attachment
|
|
449
|
+
thumb_attachment = {**attachment}
|
|
450
|
+
set_attachment_type(thumb_attachment, thumb_type_tag)
|
|
429
451
|
thumb_request = request.replace(meta={**request.meta, 'attachment': thumb_attachment})
|
|
430
452
|
return self.file_path(thumb_request, response, info)
|
|
431
453
|
|
|
@@ -455,7 +477,8 @@ class FilesPipeline(ImagesPipelineBase, FilesPipelineBase):
|
|
|
455
477
|
raise ValueError('Either url or store_path must be provided')
|
|
456
478
|
if not filename:
|
|
457
479
|
filename = self._filename_from_url(url)
|
|
458
|
-
attachment = {'url': url, 'filename': filename
|
|
480
|
+
attachment = {'url': url, 'filename': filename}
|
|
481
|
+
set_attachment_type(attachment, type_tag)
|
|
459
482
|
request = Request(url, meta={'attachment': attachment, 'resource_tag': resource_tag})
|
|
460
483
|
store_path = self.file_path(request, info=self.spiderinfo)
|
|
461
484
|
|
|
@@ -559,7 +582,7 @@ class FilesPipeline(ImagesPipelineBase, FilesPipelineBase):
|
|
|
559
582
|
return False
|
|
560
583
|
if attachment.get('status'):
|
|
561
584
|
return False # already processed
|
|
562
|
-
attachment_type = attachment
|
|
585
|
+
attachment_type = get_attachment_type(attachment)
|
|
563
586
|
if not attachment_type:
|
|
564
587
|
return True
|
|
565
588
|
if self._allow_attachment_types:
|
|
@@ -608,7 +631,7 @@ class FilesPipeline(ImagesPipelineBase, FilesPipelineBase):
|
|
|
608
631
|
path = ''
|
|
609
632
|
if resource_tag := request.meta.get('resource_tag') or self._default_resource_tag:
|
|
610
633
|
path += '/' + resource_tag
|
|
611
|
-
if type_tag := request.meta.get('attachment', {})
|
|
634
|
+
if type_tag := get_attachment_type(request.meta.get('attachment', {})) or self._default_type_tag:
|
|
612
635
|
path += '/' + type_tag
|
|
613
636
|
if self._digest_path_segment_lengths:
|
|
614
637
|
digest = self._digest_func(request.url.encode('utf-8')).digest()
|
|
File without changes
|
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/cloudflare_captcha_bypass.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/__init__.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/credential.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/manager.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/store/__init__.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/store/local.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/credentials/store/talisman.py
RENAMED
|
File without changes
|
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/deploy/bump_version.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/__init__.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/dupefilter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/elasticsearch/storage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/social_media/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/states/talisman_states_api.py
RENAMED
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/talisman_controller.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{modis_crawler_utils-0.3.0 → modis_crawler_utils-0.3.2}/crawler_utils/talisman_spider_state.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|