scrapy-seleniumbase-cdp 2.0.3__tar.gz → 2.0.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.
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/.github/workflows/bump-version-create-tag.yml +1 -1
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/.github/workflows/create-gh-release.yml +2 -2
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/PKG-INFO +1 -1
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/pyproject.toml +2 -2
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/scrapy_seleniumbase_cdp/middleware_async.py +9 -11
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/.github/copilot-instructions.md +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/.github/workflows/publish-to-pypi.yml +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/.gitignore +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/LICENSE +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/README.md +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/cliff.toml +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/docs/ARCHITECTURE.md +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/renovate.json +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/scrapy_seleniumbase_cdp/__init__.py +0 -0
- {scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/scrapy_seleniumbase_cdp/request.py +0 -0
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
- name: Set up Python
|
|
21
21
|
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
|
|
22
22
|
with:
|
|
23
|
-
python-version: '3.14.
|
|
23
|
+
python-version: '3.14.4'
|
|
24
24
|
|
|
25
25
|
- name: Install build tools
|
|
26
26
|
run: |
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
run: python -m build
|
|
32
32
|
|
|
33
33
|
- name: Generate changelog
|
|
34
|
-
uses: orhun/git-cliff-action@
|
|
34
|
+
uses: orhun/git-cliff-action@f50e11560dce63f7c33227798f90b924471a88b5 # v4
|
|
35
35
|
with:
|
|
36
36
|
args: -vv --latest --strip all
|
|
37
37
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scrapy-seleniumbase-cdp
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.4
|
|
4
4
|
Summary: Scrapy downloader middleware that uses SeleniumBase's pure CDP mode to make requests.
|
|
5
5
|
Project-URL: Homepage, https://github.com/nyg/scrapy-seleniumbase-cdp
|
|
6
6
|
Project-URL: Issues, https://github.com/nyg/scrapy-seleniumbase-cdp/issues
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "scrapy-seleniumbase-cdp"
|
|
3
|
-
version = "2.0.
|
|
3
|
+
version = "2.0.4"
|
|
4
4
|
authors = [
|
|
5
5
|
{ name = "nyg" },
|
|
6
6
|
]
|
|
@@ -34,7 +34,7 @@ build-backend = "hatchling.build"
|
|
|
34
34
|
|
|
35
35
|
[tool.commitizen]
|
|
36
36
|
name = "cz_conventional_commits"
|
|
37
|
-
version = "2.0.
|
|
37
|
+
version = "2.0.4"
|
|
38
38
|
tag_format = "v$version"
|
|
39
39
|
bump_message = "chore(release): bump version from $current_version to $new_version"
|
|
40
40
|
version_files = [
|
|
@@ -9,7 +9,6 @@ from mycdp.accessibility import LoadComplete
|
|
|
9
9
|
from mycdp.network import ResponseReceived
|
|
10
10
|
from scrapy import Request, signals
|
|
11
11
|
from scrapy.crawler import Crawler
|
|
12
|
-
from scrapy.exceptions import IgnoreRequest
|
|
13
12
|
from scrapy.http import HtmlResponse
|
|
14
13
|
from seleniumbase.undetected import cdp_driver
|
|
15
14
|
from seleniumbase.undetected.cdp_driver.browser import Browser
|
|
@@ -125,11 +124,11 @@ class SeleniumBaseAsyncCDPMiddleware:
|
|
|
125
124
|
|
|
126
125
|
try:
|
|
127
126
|
return await self._process_request(request, status_event, page_loaded_event, status)
|
|
128
|
-
except
|
|
127
|
+
except TimeoutError:
|
|
129
128
|
raise
|
|
130
129
|
except Exception as e:
|
|
131
130
|
logger.exception(f'Error processing request: {e}')
|
|
132
|
-
raise
|
|
131
|
+
raise
|
|
133
132
|
finally:
|
|
134
133
|
tab.handlers.get(ResponseReceived, []).remove(on_response_received)
|
|
135
134
|
tab.handlers.get(LoadComplete, []).remove(on_load_complete)
|
|
@@ -154,7 +153,7 @@ class SeleniumBaseAsyncCDPMiddleware:
|
|
|
154
153
|
try:
|
|
155
154
|
await asyncio.wait_for(asyncio.gather(status_event.wait(), page_loaded_event.wait()), timeout=request.page_load_timeout)
|
|
156
155
|
except TimeoutError:
|
|
157
|
-
logger.warning(f'
|
|
156
|
+
logger.warning(f'timed out waiting for page to load: {request.url}')
|
|
158
157
|
|
|
159
158
|
status_code = status['code']
|
|
160
159
|
if status_code in request.captcha_blocked_codes:
|
|
@@ -169,7 +168,7 @@ class SeleniumBaseAsyncCDPMiddleware:
|
|
|
169
168
|
break
|
|
170
169
|
logger.debug(f'captcha solved on attempt {attempt + 1}/{request.captcha_max_attempts}: {request.url}')
|
|
171
170
|
else:
|
|
172
|
-
logger.warning(f'
|
|
171
|
+
logger.warning(f'max captcha solve attempts ({request.captcha_max_attempts}) reached for {request.url}')
|
|
173
172
|
|
|
174
173
|
await self._wait_for_element(tab, request)
|
|
175
174
|
await self._execute_callback(request)
|
|
@@ -200,14 +199,13 @@ class SeleniumBaseAsyncCDPMiddleware:
|
|
|
200
199
|
if not request.wait_for_element:
|
|
201
200
|
return
|
|
202
201
|
|
|
203
|
-
logger.debug(f'waiting for element "{request.wait_for_element}" (timeout: {request.element_timeout}s): {request.url}')
|
|
204
|
-
|
|
205
202
|
try:
|
|
203
|
+
logger.debug(f'waiting for element "{request.wait_for_element}" (timeout: {request.element_timeout}s): {request.url}')
|
|
206
204
|
await tab.wait_for(selector=request.wait_for_element, timeout=request.element_timeout)
|
|
207
205
|
except TimeoutError:
|
|
208
|
-
logger.error(f'
|
|
206
|
+
logger.error(f'timed out waiting for element "{request.wait_for_element}" on {request.url}')
|
|
209
207
|
await SeleniumBaseAsyncCDPMiddleware._take_error_screenshot(tab, request)
|
|
210
|
-
raise
|
|
208
|
+
raise
|
|
211
209
|
|
|
212
210
|
@_handle_errors("Error executing browser callback")
|
|
213
211
|
async def _execute_callback(self, request: SeleniumBaseRequest):
|
|
@@ -243,11 +241,11 @@ class SeleniumBaseAsyncCDPMiddleware:
|
|
|
243
241
|
|
|
244
242
|
if request.screenshot.get('path'):
|
|
245
243
|
path = await tab.save_screenshot(request.screenshot.get('path'), image_format, full_page)
|
|
246
|
-
logger.debug(f'
|
|
244
|
+
logger.debug(f'screenshot saved in {path}')
|
|
247
245
|
else:
|
|
248
246
|
command = mycdp.page.capture_screenshot(format_=image_format, capture_beyond_viewport=full_page)
|
|
249
247
|
request.meta['screenshot'] = b64decode(await tab.send(command))
|
|
250
|
-
logger.debug('
|
|
248
|
+
logger.debug('screenshot saved in response.meta["screenshot"]')
|
|
251
249
|
|
|
252
250
|
@staticmethod
|
|
253
251
|
@_handle_errors("Error taking error screenshot")
|
{scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/.github/copilot-instructions.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/scrapy_seleniumbase_cdp/__init__.py
RENAMED
|
File without changes
|
{scrapy_seleniumbase_cdp-2.0.3 → scrapy_seleniumbase_cdp-2.0.4}/scrapy_seleniumbase_cdp/request.py
RENAMED
|
File without changes
|