mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-09-21 02:16:27 +00:00
* fix(oxylabs): report scrape failures instead of raising IndexError
The oxylabs SDK logs HTTP errors and returns an empty response rather than
raising, so the unchecked `response.results[0]` in every Oxylabs tool turned a
rejected request into `IndexError: list index out of range`. Invalid credentials
-- the most likely first-run mistake -- gave no indication of the cause. A
result carrying a non-2xx `status_code` had the same problem one level down: the
job ran, the page did not come back, and the tool returned its empty content as
though the scrape had succeeded, handing the agent "[]".
Both are now reported as a `ToolFailure` naming what went wrong, so the agent
gets something it can act on and the framework records the call as failed:
401 Unauthorized
400 Bad Request - Parameter `parsing_instructions` can be used just with
`parse` parameter set to `true`.
Because the SDK keeps the cause only in its own log, the failing call is run
with a handler attached to the `oxylabs` logger and the status, the API's
explanation and timeouts are read back off it. `code` and `retryable` are set
from the status, so 429 and 5xx are marked worth retrying. Nothing about the
caller's logging configuration is changed; an application that has silenced the
SDK still gets the generic failure.
Content that is neither a string nor a dict is also serialized properly:
`parsing_instructions` commonly yields a list, and the previous `str()`
fallback produced a Python repr with single quotes instead of JSON.
The client construction and response handling these four tools duplicated
verbatim now live in a shared `OxylabsBaseTool`, following the existing
`SerpApiBaseTool` pattern, so the handling above exists in one place. The
generated tool specs change only by the new `locale` field, confirming the
tools' public surface is otherwise untouched.
Also add the `locale` option to the Google Search config, which the docs
already documented but the config model silently dropped, and correct two
copy-paste errors in the docs across all four locales.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(oxylabs): keep concurrent scrape diagnoses apart
The error capture attached a fresh handler to the shared `oxylabs` logger for
each scrape, so two scrapes in flight at once each saw both errors. `_diagnose`
reads the first HTTP status it finds, so a timeout could be reported as the
other request's 400 -- `retryable=False` on a failure that was worth retrying.
One handler now serves every scrape and routes each record to the capture of
the call that caused it via a `ContextVar`, which isolates threads and asyncio
tasks alike. Serializing the captures would have fixed the cross-talk too, but
at the cost of running every scrape one at a time. The handler stays attached
once installed: it is inert outside a capture, and detaching it would race with
concurrent scrapes.
The regression test forces the interleaving -- one capture is held open while
the other call logs -- and fails against the previous implementation.
Also drive `config` through the public constructor in the tests instead of
assigning `__dict__["config"]`, so they would catch `__init__` dropping a
supplied config.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
237 lines
7.9 KiB
Plaintext
237 lines
7.9 KiB
Plaintext
---
|
||
title: أدوات استخراج Oxylabs
|
||
description: >
|
||
تتيح أدوات استخراج Oxylabs الوصول بسهولة إلى المعلومات من المصادر المعنية. يرجى الاطلاع على قائمة المصادر المتاحة أدناه:
|
||
- `Amazon Product`
|
||
- `Amazon Search`
|
||
- `Google Search`
|
||
- `Universal`
|
||
icon: globe
|
||
mode: "wide"
|
||
---
|
||
|
||
## التثبيت
|
||
|
||
احصل على بيانات الاعتماد بإنشاء حساب Oxylabs [هنا](https://oxylabs.io).
|
||
```shell
|
||
pip install 'crewai[tools]' oxylabs
|
||
```
|
||
راجع [توثيق Oxylabs](https://developers.oxylabs.io/scraping-solutions/web-scraper-api/targets) للحصول على مزيد من المعلومات حول معاملات API.
|
||
|
||
# `OxylabsAmazonProductScraperTool`
|
||
|
||
### مثال
|
||
|
||
```python
|
||
from crewai_tools import OxylabsAmazonProductScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsAmazonProductScraperTool()
|
||
|
||
result = tool.run(query="AAAAABBBBCC")
|
||
|
||
print(result)
|
||
```
|
||
|
||
### المعاملات
|
||
|
||
- `query` - رمز ASIN المكون من 10 رموز.
|
||
- `domain` - توطين النطاق لـ Amazon.
|
||
- `geo_location` - موقع _التوصيل إلى_.
|
||
- `user_agent_type` - نوع الجهاز والمتصفح.
|
||
- `render` - يفعّل تصيير JavaScript عند التعيين إلى `html`.
|
||
- `callback_url` - عنوان URL لنقطة نهاية الاستدعاء الخاصة بك.
|
||
- `context` - إعدادات وضوابط متقدمة إضافية للمتطلبات المتخصصة.
|
||
- `parse` - يُرجع بيانات مُحلّلة عند التعيين إلى true.
|
||
- `parsing_instructions` - حدد منطق التحليل وتحويل البيانات الخاص بك الذي سيُنفّذ على نتيجة استخراج HTML.
|
||
|
||
### مثال متقدم
|
||
|
||
```python
|
||
from crewai_tools import OxylabsAmazonProductScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsAmazonProductScraperTool(
|
||
config={
|
||
"domain": "com",
|
||
"parse": True,
|
||
"context": [
|
||
{
|
||
"key": "autoselect_variant",
|
||
"value": True
|
||
}
|
||
]
|
||
}
|
||
)
|
||
|
||
result = tool.run(query="AAAAABBBBCC")
|
||
|
||
print(result)
|
||
```
|
||
|
||
# `OxylabsAmazonSearchScraperTool`
|
||
|
||
### مثال
|
||
|
||
```python
|
||
from crewai_tools import OxylabsAmazonSearchScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsAmazonSearchScraperTool()
|
||
|
||
result = tool.run(query="headsets")
|
||
|
||
print(result)
|
||
```
|
||
|
||
### المعاملات
|
||
|
||
- `query` - مصطلح بحث Amazon.
|
||
- `domain` - توطين النطاق لـ Amazon.
|
||
- `start_page` - رقم صفحة البداية.
|
||
- `pages` - عدد الصفحات المراد استرجاعها.
|
||
- `geo_location` - موقع _التوصيل إلى_.
|
||
- `user_agent_type` - نوع الجهاز والمتصفح.
|
||
- `render` - يفعّل تصيير JavaScript عند التعيين إلى `html`.
|
||
- `callback_url` - عنوان URL لنقطة نهاية الاستدعاء الخاصة بك.
|
||
- `context` - إعدادات وضوابط متقدمة إضافية للمتطلبات المتخصصة.
|
||
- `parse` - يُرجع بيانات مُحلّلة عند التعيين إلى true.
|
||
- `parsing_instructions` - حدد منطق التحليل وتحويل البيانات الخاص بك الذي سيُنفّذ على نتيجة استخراج HTML.
|
||
|
||
### مثال متقدم
|
||
|
||
```python
|
||
from crewai_tools import OxylabsAmazonSearchScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsAmazonSearchScraperTool(
|
||
config={
|
||
"domain": 'nl',
|
||
"start_page": 2,
|
||
"pages": 2,
|
||
"parse": True,
|
||
"context": [
|
||
{'key': 'category_id', 'value': 16391693031}
|
||
],
|
||
}
|
||
)
|
||
|
||
result = tool.run(query='nirvana tshirt')
|
||
|
||
print(result)
|
||
```
|
||
|
||
# `OxylabsGoogleSearchScraperTool`
|
||
|
||
### مثال
|
||
|
||
```python
|
||
from crewai_tools import OxylabsGoogleSearchScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsGoogleSearchScraperTool()
|
||
|
||
result = tool.run(query="iPhone 16")
|
||
|
||
print(result)
|
||
```
|
||
|
||
### المعاملات
|
||
|
||
- `query` - كلمة البحث المفتاحية.
|
||
- `domain` - توطين النطاق لـ Google.
|
||
- `start_page` - رقم صفحة البداية.
|
||
- `pages` - عدد الصفحات المراد استرجاعها.
|
||
- `limit` - عدد النتائج المراد استرجاعها في كل صفحة.
|
||
- `locale` - قيمة رأس `Accept-Language` التي تغيّر لغة واجهة صفحة بحث Google.
|
||
- `geo_location` - الموقع الجغرافي الذي يجب تكييف النتيجة له. استخدام هذا المعامل بشكل صحيح مهم للغاية للحصول على البيانات الصحيحة.
|
||
- `user_agent_type` - نوع الجهاز والمتصفح.
|
||
- `render` - يفعّل تصيير JavaScript عند التعيين إلى `html`.
|
||
- `callback_url` - عنوان URL لنقطة نهاية الاستدعاء الخاصة بك.
|
||
- `context` - إعدادات وضوابط متقدمة إضافية للمتطلبات المتخصصة.
|
||
- `parse` - يُرجع بيانات مُحلّلة عند التعيين إلى true.
|
||
- `parsing_instructions` - حدد منطق التحليل وتحويل البيانات الخاص بك الذي سيُنفّذ على نتيجة استخراج HTML.
|
||
|
||
### مثال متقدم
|
||
|
||
```python
|
||
from crewai_tools import OxylabsGoogleSearchScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsGoogleSearchScraperTool(
|
||
config={
|
||
"parse": True,
|
||
"geo_location": "Paris, France",
|
||
"user_agent_type": "tablet",
|
||
}
|
||
)
|
||
|
||
result = tool.run(query="iPhone 16")
|
||
|
||
print(result)
|
||
```
|
||
|
||
# `OxylabsUniversalScraperTool`
|
||
|
||
### مثال
|
||
|
||
```python
|
||
from crewai_tools import OxylabsUniversalScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsUniversalScraperTool()
|
||
|
||
result = tool.run(url="https://ip.oxylabs.io")
|
||
|
||
print(result)
|
||
```
|
||
|
||
### المعاملات
|
||
|
||
- `url` - عنوان URL للموقع المراد استخراجه.
|
||
- `user_agent_type` - نوع الجهاز والمتصفح.
|
||
- `geo_location` - يعيّن الموقع الجغرافي للبروكسي لاسترجاع البيانات.
|
||
- `render` - يفعّل تصيير JavaScript عند التعيين إلى `html`.
|
||
- `callback_url` - عنوان URL لنقطة نهاية الاستدعاء الخاصة بك.
|
||
- `context` - إعدادات وضوابط متقدمة إضافية للمتطلبات المتخصصة.
|
||
- `parse` - يُرجع بيانات مُحلّلة عند التعيين إلى `true`، طالما يوجد مُحلّل مخصص لنوع صفحة عنوان URL المقدم.
|
||
- `parsing_instructions` - حدد منطق التحليل وتحويل البيانات الخاص بك الذي سيُنفّذ على نتيجة استخراج HTML.
|
||
|
||
|
||
### مثال متقدم
|
||
|
||
```python
|
||
from crewai_tools import OxylabsUniversalScraperTool
|
||
|
||
# make sure OXYLABS_USERNAME and OXYLABS_PASSWORD variables are set
|
||
tool = OxylabsUniversalScraperTool(
|
||
config={
|
||
"render": "html",
|
||
"user_agent_type": "mobile",
|
||
"context": [
|
||
{"key": "force_headers", "value": True},
|
||
{"key": "force_cookies", "value": True},
|
||
{
|
||
"key": "headers",
|
||
"value": {
|
||
"Custom-Header-Name": "custom header content",
|
||
},
|
||
},
|
||
{
|
||
"key": "cookies",
|
||
"value": [
|
||
{"key": "NID", "value": "1234567890"},
|
||
{"key": "1P JAR", "value": "0987654321"},
|
||
],
|
||
},
|
||
{"key": "http_method", "value": "get"},
|
||
{"key": "follow_redirects", "value": True},
|
||
{"key": "successful_status_codes", "value": [808, 909]},
|
||
],
|
||
}
|
||
)
|
||
|
||
result = tool.run(url="https://ip.oxylabs.io")
|
||
|
||
print(result)
|
||
``` |