bhfutils 0.2.4__tar.gz → 0.2.7__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.
Files changed (115) hide show
  1. {bhfutils-0.2.4 → bhfutils-0.2.7}/PKG-INFO +1 -1
  2. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/pipelines.py +43 -11
  3. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/settings_template.py +14 -0
  4. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils.egg-info/PKG-INFO +1 -1
  5. {bhfutils-0.2.4 → bhfutils-0.2.7}/setup.py +1 -1
  6. {bhfutils-0.2.4 → bhfutils-0.2.7}/MANIFEST.in +0 -0
  7. {bhfutils-0.2.4 → bhfutils-0.2.7}/README.rst +0 -0
  8. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/__init__.py +0 -0
  9. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/__init__.py +0 -0
  10. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/bhf_signals.py +0 -0
  11. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/config/__init__.py +0 -0
  12. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/config/file_pusher.py +0 -0
  13. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/custom_cookies.py +0 -0
  14. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/distributed_scheduler.py +0 -0
  15. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/expire.py +0 -0
  16. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/items.py +0 -0
  17. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/log_retry_middleware.py +0 -0
  18. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/meta_passthrough_middleware.py +0 -0
  19. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/__init__.py +0 -0
  20. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/__init__.py +0 -0
  21. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/do_async/__init__.py +0 -0
  22. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/do_async/_mouse_helper.py +0 -0
  23. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/do_async/_spoof.py +0 -0
  24. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/do_sync/__init__.py +0 -0
  25. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/do_sync/_mouse_helper.py +0 -0
  26. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/do_sync/_spoof.py +0 -0
  27. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/js/mouseHelper.js +0 -0
  28. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/shared/__init__.py +0 -0
  29. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/shared/math.py +0 -0
  30. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/cursor/shared/spoof.py +0 -0
  31. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/handler.py +0 -0
  32. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/headers.py +0 -0
  33. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/__init__.py +0 -0
  34. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/chrome.app.js +0 -0
  35. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/chrome.csi.js +0 -0
  36. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/chrome.loadtimes.js +0 -0
  37. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/chrome.runtime.js +0 -0
  38. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/hairline.js +0 -0
  39. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/iframe.contentWindow.js +0 -0
  40. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/magic-arrays.js +0 -0
  41. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/media.codecs.js +0 -0
  42. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.deviceMemory.js +0 -0
  43. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.hardwareConcurrency.js +0 -0
  44. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.languages.js +0 -0
  45. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.permissions.js +0 -0
  46. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.platform.js +0 -0
  47. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.plugins.js +0 -0
  48. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.userAgent.js +0 -0
  49. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.vendor.js +0 -0
  50. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/navigator.webdriver.js +0 -0
  51. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/screen.touch.js +0 -0
  52. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/user-agent-override.js +0 -0
  53. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/utils.js +0 -0
  54. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/webgl.vendor.js +0 -0
  55. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/js/window.dimensions.js +0 -0
  56. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/page.py +0 -0
  57. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/playwright/stealth.py +0 -0
  58. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/policy.py +0 -0
  59. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/proxy_rotate.py +0 -0
  60. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/redis_domain_max_page_filter.py +0 -0
  61. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/redis_dupefilter.py +0 -0
  62. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/redis_global_page_per_domain_filter.py +0 -0
  63. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/redis_retry_middleware.py +0 -0
  64. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/redis_stats_middleware.py +0 -0
  65. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/spiders/__init__.py +0 -0
  66. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/spiders/redis_spider.py +0 -0
  67. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/__init__.py +0 -0
  68. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/online.py +0 -0
  69. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_distributed_scheduler.py +0 -0
  70. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_link_spider.py +0 -0
  71. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_log_retry_middleware.py +0 -0
  72. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_meta_passthrough_middleware.py +0 -0
  73. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_pipelines.py +0 -0
  74. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_redis_dupefilter.py +0 -0
  75. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_redis_page_limit_filters.py +0 -0
  76. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_redis_retry_middleware.py +0 -0
  77. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_redis_stats_middleware.py +0 -0
  78. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/crawler/tests/test_wandering_spider.py +0 -0
  79. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/__init__.py +0 -0
  80. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_ah.py +0 -0
  81. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_lf.py +0 -0
  82. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_mt.py +0 -0
  83. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_rq.py +0 -0
  84. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_rtq.py +0 -0
  85. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_sc.py +0 -0
  86. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_sw.py +0 -0
  87. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/examples/example_zw.py +0 -0
  88. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/__init__.py +0 -0
  89. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/argparse_helper.py +0 -0
  90. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/log_factory.py +0 -0
  91. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/method_timer.py +0 -0
  92. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/redis_queue.py +0 -0
  93. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/redis_throttled_queue.py +0 -0
  94. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/settings_wrapper.py +0 -0
  95. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/stats_collector.py +0 -0
  96. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/scutils/zookeeper_watcher.py +0 -0
  97. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/__init__.py +0 -0
  98. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/default_settings.py +0 -0
  99. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/online.py +0 -0
  100. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/override_defaults.py +0 -0
  101. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_argparse_helper.py +0 -0
  102. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_log_factory.py +0 -0
  103. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_method_timer.py +0 -0
  104. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_redis_queue.py +0 -0
  105. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_redis_throttled_queue.py +0 -0
  106. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_settings_wrapper.py +0 -0
  107. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_stats_collector.py +0 -0
  108. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/test_zookeeper_watcher.py +0 -0
  109. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils/tests/throttled_queue.py +0 -0
  110. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils.egg-info/SOURCES.txt +0 -0
  111. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils.egg-info/dependency_links.txt +0 -0
  112. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils.egg-info/requires.txt +0 -0
  113. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils.egg-info/top_level.txt +0 -0
  114. {bhfutils-0.2.4 → bhfutils-0.2.7}/bhfutils.egg-info/zip-safe +0 -0
  115. {bhfutils-0.2.4 → bhfutils-0.2.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bhfutils
3
- Version: 0.2.4
3
+ Version: 0.2.7
4
4
  Summary: Utilities that are used by any spider of Behoof project
5
5
  Home-page: https://behoof.app/
6
6
  Author: Teplygin Vladimir
@@ -109,19 +109,51 @@ class KafkaPipeline(object):
109
109
  bytes=my_bytes,
110
110
  backups=my_backups)
111
111
 
112
+ # Security settings are optional: a spider running inside the VPC talks to the
113
+ # PLAINTEXT listener and defines none of them, while one running outside needs
114
+ # SASL_SSL. Defaults keep existing projects working without touching them.
115
+ producer_kwargs = dict(bootstrap_servers=settings['KAFKA_HOSTS'],
116
+ retries=3,
117
+ linger_ms=settings['KAFKA_PRODUCER_BATCH_LINGER_MS'],
118
+ buffer_memory=settings['KAFKA_PRODUCER_BUFFER_BYTES'],
119
+ value_serializer=lambda m: m.encode('utf-8'),
120
+ max_request_size=settings['KAFKA_PRODUCER_MAX_REQUEST_SIZE'])
121
+
122
+ security_protocol = settings.get('KAFKA_SECURITY_PROTOCOL', 'PLAINTEXT')
123
+ if security_protocol != 'PLAINTEXT':
124
+ producer_kwargs['security_protocol'] = security_protocol
125
+ if 'SASL' in security_protocol:
126
+ producer_kwargs['sasl_mechanism'] = settings.get('KAFKA_SASL_MECHANISM', 'PLAIN')
127
+ producer_kwargs['sasl_plain_username'] = settings.get('KAFKA_SASL_USERNAME')
128
+ producer_kwargs['sasl_plain_password'] = settings.get('KAFKA_SASL_PASSWORD')
129
+ if 'SSL' in security_protocol:
130
+ # Left as None for a certificate issued by a public CA: kafka-python then
131
+ # falls back to the system trust store. Set it only for a private CA.
132
+ producer_kwargs['ssl_cafile'] = settings.get('KAFKA_SSL_CAFILE')
133
+
134
+ # Only passed when set explicitly, so the client keeps its own default: on for
135
+ # kafka-python 3.x, absent in 2.x. Verified working against the 3.4.1 broker
136
+ # both ways, so there is no reason to force either.
137
+ enable_idempotence = settings.get('KAFKA_PRODUCER_ENABLE_IDEMPOTENCE')
138
+ if enable_idempotence is not None and 'enable_idempotence' in KafkaProducer.DEFAULT_CONFIG:
139
+ producer_kwargs['enable_idempotence'] = enable_idempotence
140
+
141
+ # Tuning options come and go between client releases - kafka-python 3.x dropped
142
+ # buffer_memory, for one - and an unknown key makes the constructor fail outright.
143
+ # Drop what this client does not know about instead, and say so.
144
+ for key in [k for k in producer_kwargs if k not in KafkaProducer.DEFAULT_CONFIG]:
145
+ logger.warning("Kafka client does not support setting, ignoring it",
146
+ extra={'setting': key})
147
+ producer_kwargs.pop(key)
148
+
112
149
  try:
113
- producer = KafkaProducer(bootstrap_servers=settings['KAFKA_HOSTS'],
114
- retries=3,
115
- linger_ms=settings['KAFKA_PRODUCER_BATCH_LINGER_MS'],
116
- buffer_memory=settings['KAFKA_PRODUCER_BUFFER_BYTES'],
117
- value_serializer=lambda m: m.encode('utf-8'),
118
- max_request_size=settings['KAFKA_PRODUCER_MAX_REQUEST_SIZE'])
150
+ producer = KafkaProducer(**producer_kwargs)
119
151
  except Exception as e:
120
- logger.error("Unable to connect to Kafka in Pipeline"", raising exit flag.")
121
- # this is critical so we choose to exit.
122
- # exiting because this is a different thread from the crawlers
123
- # and we want to ensure we can connect to Kafka when we boot
124
- sys.exit(1)
152
+ # Raise rather than sys.exit(): this runs inside the Twisted reactor while
153
+ # Scrapy builds the pipelines, where SystemExit leaves the process hanging
154
+ # with nothing in the crawl log. An exception aborts the crawl visibly.
155
+ logger.error("Unable to connect to Kafka in Pipeline", extra={'error': str(e)})
156
+ raise
125
157
  topic_prefix = settings['KAFKA_TOPIC_PREFIX']
126
158
  use_base64 = settings['KAFKA_BASE_64_ENCODE']
127
159
 
@@ -22,6 +22,20 @@ KAFKA_PRODUCER_BATCH_LINGER_MS = 25 # 25 ms before flush
22
22
  KAFKA_PRODUCER_BUFFER_BYTES = 4 * 1024 * 1024 # 4MB before blocking
23
23
  KAFKA_PRODUCER_MAX_REQUEST_SIZE = 1024 * 1024 # 1MB
24
24
 
25
+ # Security for the Kafka connection. PLAINTEXT is right for a spider running inside
26
+ # the VPC, which reaches the broker's INTERNAL listener. A spider running anywhere
27
+ # else must go through the EXTERNAL listener and set SASL_SSL plus credentials.
28
+ KAFKA_SECURITY_PROTOCOL = 'PLAINTEXT'
29
+ KAFKA_SASL_MECHANISM = 'PLAIN'
30
+ KAFKA_SASL_USERNAME = None
31
+ KAFKA_SASL_PASSWORD = None
32
+ # Only needed for a certificate from a private CA; leave None for a public one.
33
+ KAFKA_SSL_CAFILE = None
34
+
35
+ # Leave None to keep whatever the installed kafka-python defaults to. Set True or False
36
+ # only to override it deliberately.
37
+ KAFKA_PRODUCER_ENABLE_IDEMPOTENCE = None
38
+
25
39
  ZOOKEEPER_ASSIGN_PATH = '/scrapy-cluster/crawler/'
26
40
  ZOOKEEPER_ID = 'all'
27
41
  ZOOKEEPER_HOSTS = 'localhost:2181'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bhfutils
3
- Version: 0.2.4
3
+ Version: 0.2.7
4
4
  Summary: Utilities that are used by any spider of Behoof project
5
5
  Home-page: https://behoof.app/
6
6
  Author: Teplygin Vladimir
@@ -43,7 +43,7 @@ if 'nosetests' in sys.argv[1:]:
43
43
 
44
44
  setup(
45
45
  name='bhfutils',
46
- version='0.2.4',
46
+ version='0.2.7',
47
47
  description='Utilities that are used by any spider of Behoof project',
48
48
  long_description=readme(),
49
49
  long_description_content_type='text/x-rst',
File without changes
File without changes
File without changes
File without changes