aio-scrapy 2.1.3__tar.gz → 2.1.4__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 (141) hide show
  1. {aio-scrapy-2.1.3/aio_scrapy.egg-info → aio-scrapy-2.1.4}/PKG-INFO +2 -1
  2. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4/aio_scrapy.egg-info}/PKG-INFO +2 -1
  3. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aio_scrapy.egg-info/requires.txt +1 -0
  4. aio-scrapy-2.1.4/aioscrapy/VERSION +1 -0
  5. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/__init__.py +1 -1
  6. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/__init__.py +1 -1
  7. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/aiohttp.py +1 -1
  8. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/curl_cffi.py +1 -1
  9. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/httpx.py +1 -1
  10. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/playwright/__init__.py +8 -3
  11. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/playwright/driverpool.py +7 -1
  12. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/pyhttpx.py +1 -1
  13. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/requests.py +1 -1
  14. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/exceptions.py +19 -1
  15. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/downloader/retry.py +1 -1
  16. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/setup.py +1 -0
  17. aio-scrapy-2.1.3/aioscrapy/VERSION +0 -1
  18. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/LICENSE +0 -0
  19. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/MANIFEST.in +0 -0
  20. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/README.md +0 -0
  21. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aio_scrapy.egg-info/SOURCES.txt +0 -0
  22. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aio_scrapy.egg-info/dependency_links.txt +0 -0
  23. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aio_scrapy.egg-info/entry_points.txt +0 -0
  24. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aio_scrapy.egg-info/not-zip-safe +0 -0
  25. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aio_scrapy.egg-info/top_level.txt +0 -0
  26. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/__init__.py +0 -0
  27. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/__main__.py +0 -0
  28. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/cmdline.py +0 -0
  29. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/__init__.py +0 -0
  30. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/crawl.py +0 -0
  31. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/genspider.py +0 -0
  32. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/list.py +0 -0
  33. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/runspider.py +0 -0
  34. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/settings.py +0 -0
  35. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/startproject.py +0 -0
  36. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/commands/version.py +0 -0
  37. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/__init__.py +0 -0
  38. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/downloader/handlers/playwright/webdriver.py +0 -0
  39. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/engine.py +0 -0
  40. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/scheduler.py +0 -0
  41. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/core/scraper.py +0 -0
  42. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/crawler.py +0 -0
  43. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/db/__init__.py +0 -0
  44. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/db/absmanager.py +0 -0
  45. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/db/aiomongo.py +0 -0
  46. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/db/aiomysql.py +0 -0
  47. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/db/aiopg.py +0 -0
  48. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/db/aiorabbitmq.py +0 -0
  49. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/db/aioredis.py +0 -0
  50. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/dupefilters/__init__.py +0 -0
  51. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/dupefilters/disk.py +0 -0
  52. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/dupefilters/redis.py +0 -0
  53. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/__init__.py +0 -0
  54. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/headers.py +0 -0
  55. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/request/__init__.py +0 -0
  56. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/request/form.py +0 -0
  57. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/request/json_request.py +0 -0
  58. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/response/__init__.py +0 -0
  59. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/response/html.py +0 -0
  60. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/response/playwright.py +0 -0
  61. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/response/text.py +0 -0
  62. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/http/response/xml.py +0 -0
  63. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/__init__.py +0 -0
  64. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/downloader/__init__.py +0 -0
  65. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/downloader/defaultheaders.py +0 -0
  66. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/downloader/downloadtimeout.py +0 -0
  67. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/downloader/ja3fingerprint.py +0 -0
  68. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/downloader/stats.py +0 -0
  69. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/downloader/useragent.py +0 -0
  70. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/extensions/__init__.py +0 -0
  71. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/extensions/closespider.py +0 -0
  72. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/extensions/corestats.py +0 -0
  73. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/extensions/logstats.py +0 -0
  74. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/extensions/metric.py +0 -0
  75. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/extensions/throttle.py +0 -0
  76. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/pipelines/__init__.py +0 -0
  77. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/pipelines/csv.py +0 -0
  78. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/pipelines/execl.py +0 -0
  79. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/pipelines/mongo.py +0 -0
  80. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/pipelines/mysql.py +0 -0
  81. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/pipelines/pg.py +0 -0
  82. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/spider/__init__.py +0 -0
  83. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/spider/depth.py +0 -0
  84. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/spider/httperror.py +0 -0
  85. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/spider/offsite.py +0 -0
  86. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/spider/referer.py +0 -0
  87. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/libs/spider/urllength.py +0 -0
  88. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/link.py +0 -0
  89. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/logformatter.py +0 -0
  90. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/middleware/__init__.py +0 -0
  91. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/middleware/absmanager.py +0 -0
  92. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/middleware/downloader.py +0 -0
  93. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/middleware/extension.py +0 -0
  94. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/middleware/itempipeline.py +0 -0
  95. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/middleware/spider.py +0 -0
  96. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/process.py +0 -0
  97. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/proxy/__init__.py +0 -0
  98. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/proxy/redis.py +0 -0
  99. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/queue/__init__.py +0 -0
  100. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/queue/memory.py +0 -0
  101. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/queue/rabbitmq.py +0 -0
  102. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/queue/redis.py +0 -0
  103. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/scrapyd/__init__.py +0 -0
  104. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/scrapyd/runner.py +0 -0
  105. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/serializer.py +0 -0
  106. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/settings/__init__.py +0 -0
  107. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/settings/default_settings.py +0 -0
  108. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/signalmanager.py +0 -0
  109. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/signals.py +0 -0
  110. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/spiderloader.py +0 -0
  111. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/spiders/__init__.py +0 -0
  112. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/statscollectors.py +0 -0
  113. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/project/aioscrapy.cfg +0 -0
  114. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/project/module/__init__.py +0 -0
  115. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/project/module/middlewares.py.tmpl +0 -0
  116. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/project/module/pipelines.py.tmpl +0 -0
  117. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/project/module/settings.py.tmpl +0 -0
  118. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/project/module/spiders/__init__.py +0 -0
  119. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/spiders/basic.tmpl +0 -0
  120. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/templates/spiders/single.tmpl +0 -0
  121. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/__init__.py +0 -0
  122. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/conf.py +0 -0
  123. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/curl.py +0 -0
  124. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/decorators.py +0 -0
  125. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/deprecate.py +0 -0
  126. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/httpobj.py +0 -0
  127. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/log.py +0 -0
  128. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/misc.py +0 -0
  129. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/ossignal.py +0 -0
  130. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/project.py +0 -0
  131. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/python.py +0 -0
  132. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/reqser.py +0 -0
  133. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/request.py +0 -0
  134. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/response.py +0 -0
  135. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/signal.py +0 -0
  136. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/spider.py +0 -0
  137. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/template.py +0 -0
  138. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/tools.py +0 -0
  139. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/trackref.py +0 -0
  140. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/aioscrapy/utils/url.py +0 -0
  141. {aio-scrapy-2.1.3 → aio-scrapy-2.1.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aio-scrapy
3
- Version: 2.1.3
3
+ Version: 2.1.4
4
4
  Summary: A high-level Web Crawling and Web Scraping framework based on Asyncio
5
5
  Home-page: https://github.com/conlin-huang/aio-scrapy.git
6
6
  Author: conlin
@@ -28,6 +28,7 @@ Requires-Dist: zope.interface>=5.1.0
28
28
  Requires-Dist: redis>=4.3.1
29
29
  Requires-Dist: aiomultiprocess>=0.9.0
30
30
  Requires-Dist: loguru>=0.7.0
31
+ Requires-Dist: anyio>=3.6.2
31
32
  Provides-Extra: all
32
33
  Requires-Dist: aiomysql>=0.1.1; extra == "all"
33
34
  Requires-Dist: httpx[http2]>=0.23.0; extra == "all"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aio-scrapy
3
- Version: 2.1.3
3
+ Version: 2.1.4
4
4
  Summary: A high-level Web Crawling and Web Scraping framework based on Asyncio
5
5
  Home-page: https://github.com/conlin-huang/aio-scrapy.git
6
6
  Author: conlin
@@ -28,6 +28,7 @@ Requires-Dist: zope.interface>=5.1.0
28
28
  Requires-Dist: redis>=4.3.1
29
29
  Requires-Dist: aiomultiprocess>=0.9.0
30
30
  Requires-Dist: loguru>=0.7.0
31
+ Requires-Dist: anyio>=3.6.2
31
32
  Provides-Extra: all
32
33
  Requires-Dist: aiomysql>=0.1.1; extra == "all"
33
34
  Requires-Dist: httpx[http2]>=0.23.0; extra == "all"
@@ -7,6 +7,7 @@ zope.interface>=5.1.0
7
7
  redis>=4.3.1
8
8
  aiomultiprocess>=0.9.0
9
9
  loguru>=0.7.0
10
+ anyio>=3.6.2
10
11
 
11
12
  [aio-pika]
12
13
  aio-pika>=8.1.1
@@ -0,0 +1 @@
1
+ 2.1.4
@@ -143,7 +143,7 @@ class Downloader(BaseDownloader):
143
143
  crawler.spider.dupefilter = df # 将指纹绑定到Spider 在解析成功的时候 调用DUPEFILTER_CLASS的success方法
144
144
  return cls(
145
145
  crawler,
146
- await call_helper(DownloadHandlerManager.for_crawler, crawler),
146
+ await call_helper(DownloadHandlerManager.from_crawler, crawler),
147
147
  await call_helper(DownloaderMiddlewareManager.from_crawler, crawler),
148
148
  proxy=crawler.settings.get("PROXY_HANDLER") and await load_instance(crawler.settings["PROXY_HANDLER"],
149
149
  crawler=crawler),
@@ -37,7 +37,7 @@ class DownloadHandlerManager:
37
37
  crawler.signals.connect(self._close, signals.engine_stopped)
38
38
 
39
39
  @classmethod
40
- def for_crawler(cls, crawler) -> "DownloadHandlerManager":
40
+ def from_crawler(cls, crawler) -> "DownloadHandlerManager":
41
41
  return cls(crawler)
42
42
 
43
43
  async def _get_handler(self, scheme: str) -> Optional[BaseDownloadHandler]:
@@ -37,7 +37,7 @@ class AioHttpDownloadHandler(BaseDownloadHandler):
37
37
  try:
38
38
  return await self._download_request(request)
39
39
  except ClientError as e:
40
- raise DownloadError(e) from e
40
+ raise DownloadError(real_error=e) from e
41
41
 
42
42
  async def _download_request(self, request: Request) -> HtmlResponse:
43
43
  kwargs = {
@@ -24,7 +24,7 @@ class CurlCffiDownloadHandler(BaseDownloadHandler):
24
24
  try:
25
25
  return await self._download_request(request)
26
26
  except CurlError as e:
27
- raise DownloadError(e) from e
27
+ raise DownloadError(real_error=e) from e
28
28
 
29
29
  async def _download_request(self, request: Request) -> HtmlResponse:
30
30
  kwargs = {
@@ -32,7 +32,7 @@ class HttpxDownloadHandler(BaseDownloadHandler):
32
32
  try:
33
33
  return await self._download_request(request)
34
34
  except HttpxError as e:
35
- raise DownloadError(e) from e
35
+ raise DownloadError(real_error=e) from e
36
36
 
37
37
  async def _download_request(self, request: Request) -> HtmlResponse:
38
38
  kwargs = {
@@ -1,6 +1,10 @@
1
1
  from functools import wraps
2
2
 
3
- from playwright._impl._api_types import Error
3
+ try:
4
+ from playwright._impl._errors import Error
5
+ except ImportError:
6
+ from playwright._impl._api_types import Error
7
+
4
8
  from playwright.async_api._generated import Response as EventResponse
5
9
 
6
10
  from aioscrapy import Request, Spider
@@ -17,10 +21,11 @@ class PlaywrightHandler(BaseDownloadHandler):
17
21
  def __init__(self, settings: Settings):
18
22
  self.settings = settings
19
23
  playwright_client_args = settings.getdict('PLAYWRIGHT_CLIENT_ARGS')
24
+ use_pool = settings.getbool('PLAYWRIGHT_USE_POOL', True)
20
25
  self.wait_until = playwright_client_args.get('wait_until', 'domcontentloaded')
21
26
  self.url_regexes = playwright_client_args.pop('url_regexes', [])
22
27
  pool_size = playwright_client_args.pop('pool_size', settings.getint("CONCURRENT_REQUESTS", 1))
23
- self._webdriver_pool = WebDriverPool(pool_size=pool_size, driver_cls=PlaywrightDriver, **playwright_client_args)
28
+ self._webdriver_pool = WebDriverPool(use_pool=use_pool, pool_size=pool_size, driver_cls=PlaywrightDriver, **playwright_client_args)
24
29
 
25
30
  @classmethod
26
31
  def from_settings(cls, settings: Settings):
@@ -30,7 +35,7 @@ class PlaywrightHandler(BaseDownloadHandler):
30
35
  try:
31
36
  return await self._download_request(request, spider)
32
37
  except Error as e:
33
- raise DownloadError(e) from e
38
+ raise DownloadError(real_error=e) from e
34
39
 
35
40
  async def _download_request(self, request: Request, spider) -> PlaywrightResponse:
36
41
  cookies = dict(request.cookies)
@@ -9,8 +9,9 @@ from aioscrapy.utils.tools import singleton
9
9
  @singleton
10
10
  class WebDriverPool:
11
11
  def __init__(
12
- self, pool_size=5, driver_cls=None, **kwargs
12
+ self, use_pool=True, pool_size=5, driver_cls=None, **kwargs
13
13
  ):
14
+ self.use_pool = use_pool
14
15
  self.pool_size = pool_size
15
16
  self.driver_cls = driver_cls
16
17
  self.kwargs = kwargs
@@ -32,6 +33,8 @@ class WebDriverPool:
32
33
 
33
34
  async def get(self, **kwargs):
34
35
  async with self.lock:
36
+ if not self.use_pool:
37
+ return await self.create_driver(**kwargs)
35
38
  if not self.is_full:
36
39
  driver = await self.create_driver(**kwargs)
37
40
  self.driver_count += 1
@@ -40,6 +43,9 @@ class WebDriverPool:
40
43
  return driver
41
44
 
42
45
  async def release(self, driver):
46
+ if not self.use_pool:
47
+ await driver.quit()
48
+ return
43
49
  await self.queue.put(driver)
44
50
 
45
51
  async def remove(self, driver):
@@ -27,7 +27,7 @@ class PyhttpxDownloadHandler(BaseDownloadHandler):
27
27
  try:
28
28
  return await self._download_request(request)
29
29
  except PyHttpxError as e:
30
- raise DownloadError(e) from e
30
+ raise DownloadError(real_error=e) from e
31
31
 
32
32
  async def _download_request(self, request: Request) -> HtmlResponse:
33
33
  kwargs = {
@@ -25,7 +25,7 @@ class RequestsDownloadHandler(BaseDownloadHandler):
25
25
  try:
26
26
  return await self._download_request(request)
27
27
  except RequestsError as e:
28
- raise DownloadError(e) from e
28
+ raise DownloadError(real_error=e) from e
29
29
 
30
30
  async def _download_request(self, request: Request) -> HtmlResponse:
31
31
  kwargs = {
@@ -5,6 +5,7 @@ These exceptions are documented in docs/topics/exceptions.rst. Please don't add
5
5
  new exceptions here without documenting them there.
6
6
  """
7
7
 
8
+
8
9
  # Internal
9
10
 
10
11
 
@@ -95,4 +96,21 @@ class ProxyException(Exception):
95
96
 
96
97
  class DownloadError(Exception):
97
98
  """下载页面时发生的错误"""
98
- pass
99
+
100
+ def __init__(self, *args, real_error=None):
101
+ self.real_error = real_error
102
+ super().__init__(*args)
103
+
104
+ def __str__(self):
105
+ if not self.real_error:
106
+ return "DownloadError"
107
+
108
+ return f"{self.real_error.__class__.__module__}.{self.real_error.__class__.__name__}: {str(self.real_error)}"
109
+
110
+
111
+ if __name__ == '__main__':
112
+ e = Exception("xxx")
113
+ reason = DownloadError(real_error=e)
114
+ print(reason)
115
+ obj = reason.real_error.__class__
116
+ print(f"{obj.__module__}.{obj.__name__}")
@@ -51,7 +51,7 @@ def get_retry_request(
51
51
  if callable(reason):
52
52
  reason = reason()
53
53
  if isinstance(reason, Exception):
54
- reason = global_object_name(reason.__class__)
54
+ reason = global_object_name((getattr(reason, "real_error", None) or reason).__class__)
55
55
 
56
56
  logger.info(
57
57
  "Retrying %(request)s (failed %(retry_times)d times): %(reason)s" % {
@@ -14,6 +14,7 @@ install_requires = [
14
14
  "redis>=4.3.1",
15
15
  "aiomultiprocess>=0.9.0",
16
16
  "loguru>=0.7.0",
17
+ "anyio>=3.6.2"
17
18
  ]
18
19
  extras_require = {
19
20
  "all": [
@@ -1 +0,0 @@
1
- 2.1.3
File without changes
File without changes
File without changes
File without changes
File without changes