webscout 8.2.2__py3-none-any.whl → 2026.1.19__py3-none-any.whl
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.
- webscout/AIauto.py +524 -143
- webscout/AIbase.py +247 -123
- webscout/AIutel.py +68 -132
- webscout/Bard.py +1072 -535
- webscout/Extra/GitToolkit/__init__.py +2 -2
- webscout/Extra/GitToolkit/gitapi/__init__.py +20 -12
- webscout/Extra/GitToolkit/gitapi/gist.py +142 -0
- webscout/Extra/GitToolkit/gitapi/organization.py +91 -0
- webscout/Extra/GitToolkit/gitapi/repository.py +308 -195
- webscout/Extra/GitToolkit/gitapi/search.py +162 -0
- webscout/Extra/GitToolkit/gitapi/trending.py +236 -0
- webscout/Extra/GitToolkit/gitapi/user.py +128 -96
- webscout/Extra/GitToolkit/gitapi/utils.py +82 -62
- webscout/Extra/YTToolkit/README.md +443 -0
- webscout/Extra/YTToolkit/YTdownloader.py +953 -957
- webscout/Extra/YTToolkit/__init__.py +3 -3
- webscout/Extra/YTToolkit/transcriber.py +595 -476
- webscout/Extra/YTToolkit/ytapi/README.md +230 -0
- webscout/Extra/YTToolkit/ytapi/__init__.py +22 -6
- webscout/Extra/YTToolkit/ytapi/captions.py +190 -0
- webscout/Extra/YTToolkit/ytapi/channel.py +302 -307
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -13
- webscout/Extra/YTToolkit/ytapi/extras.py +178 -45
- webscout/Extra/YTToolkit/ytapi/hashtag.py +120 -0
- webscout/Extra/YTToolkit/ytapi/https.py +89 -88
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -61
- webscout/Extra/YTToolkit/ytapi/playlist.py +59 -59
- webscout/Extra/YTToolkit/ytapi/pool.py +8 -8
- webscout/Extra/YTToolkit/ytapi/query.py +143 -40
- webscout/Extra/YTToolkit/ytapi/shorts.py +122 -0
- webscout/Extra/YTToolkit/ytapi/stream.py +68 -63
- webscout/Extra/YTToolkit/ytapi/suggestions.py +97 -0
- webscout/Extra/YTToolkit/ytapi/utils.py +66 -62
- webscout/Extra/YTToolkit/ytapi/video.py +189 -18
- webscout/Extra/__init__.py +2 -3
- webscout/Extra/gguf.py +1298 -682
- webscout/Extra/tempmail/README.md +488 -0
- webscout/Extra/tempmail/__init__.py +28 -28
- webscout/Extra/tempmail/async_utils.py +143 -141
- webscout/Extra/tempmail/base.py +172 -161
- webscout/Extra/tempmail/cli.py +191 -187
- webscout/Extra/tempmail/emailnator.py +88 -84
- webscout/Extra/tempmail/mail_tm.py +378 -361
- webscout/Extra/tempmail/temp_mail_io.py +304 -292
- webscout/Extra/weather.py +196 -194
- webscout/Extra/weather_ascii.py +17 -15
- webscout/Provider/AISEARCH/PERPLEXED_search.py +175 -0
- webscout/Provider/AISEARCH/Perplexity.py +237 -304
- webscout/Provider/AISEARCH/README.md +106 -0
- webscout/Provider/AISEARCH/__init__.py +16 -10
- webscout/Provider/AISEARCH/brave_search.py +298 -0
- webscout/Provider/AISEARCH/iask_search.py +130 -209
- webscout/Provider/AISEARCH/monica_search.py +200 -246
- webscout/Provider/AISEARCH/webpilotai_search.py +242 -281
- webscout/Provider/Algion.py +413 -0
- webscout/Provider/Andi.py +74 -69
- webscout/Provider/Apriel.py +313 -0
- webscout/Provider/Ayle.py +323 -0
- webscout/Provider/ChatSandbox.py +329 -0
- webscout/Provider/ClaudeOnline.py +365 -0
- webscout/Provider/Cohere.py +232 -208
- webscout/Provider/DeepAI.py +367 -0
- webscout/Provider/Deepinfra.py +343 -173
- webscout/Provider/EssentialAI.py +217 -0
- webscout/Provider/ExaAI.py +274 -261
- webscout/Provider/Gemini.py +60 -54
- webscout/Provider/GithubChat.py +385 -367
- webscout/Provider/Gradient.py +286 -0
- webscout/Provider/Groq.py +556 -670
- webscout/Provider/HadadXYZ.py +323 -0
- webscout/Provider/HeckAI.py +392 -233
- webscout/Provider/HuggingFace.py +387 -0
- webscout/Provider/IBM.py +340 -0
- webscout/Provider/Jadve.py +317 -266
- webscout/Provider/K2Think.py +306 -0
- webscout/Provider/Koboldai.py +221 -381
- webscout/Provider/Netwrck.py +273 -228
- webscout/Provider/Nvidia.py +310 -0
- webscout/Provider/OPENAI/DeepAI.py +489 -0
- webscout/Provider/OPENAI/K2Think.py +423 -0
- webscout/Provider/OPENAI/PI.py +463 -0
- webscout/Provider/OPENAI/README.md +890 -0
- webscout/Provider/OPENAI/TogetherAI.py +405 -0
- webscout/Provider/OPENAI/TwoAI.py +255 -0
- webscout/Provider/OPENAI/__init__.py +148 -25
- webscout/Provider/OPENAI/ai4chat.py +348 -0
- webscout/Provider/OPENAI/akashgpt.py +436 -0
- webscout/Provider/OPENAI/algion.py +303 -0
- webscout/Provider/OPENAI/ayle.py +365 -0
- webscout/Provider/OPENAI/base.py +253 -46
- webscout/Provider/OPENAI/cerebras.py +296 -0
- webscout/Provider/OPENAI/chatgpt.py +514 -193
- webscout/Provider/OPENAI/chatsandbox.py +233 -0
- webscout/Provider/OPENAI/deepinfra.py +403 -272
- webscout/Provider/OPENAI/e2b.py +2370 -1350
- webscout/Provider/OPENAI/elmo.py +278 -0
- webscout/Provider/OPENAI/exaai.py +186 -138
- webscout/Provider/OPENAI/freeassist.py +446 -0
- webscout/Provider/OPENAI/gradient.py +448 -0
- webscout/Provider/OPENAI/groq.py +380 -0
- webscout/Provider/OPENAI/hadadxyz.py +292 -0
- webscout/Provider/OPENAI/heckai.py +100 -104
- webscout/Provider/OPENAI/huggingface.py +321 -0
- webscout/Provider/OPENAI/ibm.py +425 -0
- webscout/Provider/OPENAI/llmchat.py +253 -0
- webscout/Provider/OPENAI/llmchatco.py +378 -327
- webscout/Provider/OPENAI/meta.py +541 -0
- webscout/Provider/OPENAI/netwrck.py +110 -84
- webscout/Provider/OPENAI/nvidia.py +317 -0
- webscout/Provider/OPENAI/oivscode.py +348 -0
- webscout/Provider/OPENAI/openrouter.py +328 -0
- webscout/Provider/OPENAI/pydantic_imports.py +1 -0
- webscout/Provider/OPENAI/sambanova.py +397 -0
- webscout/Provider/OPENAI/sonus.py +126 -115
- webscout/Provider/OPENAI/textpollinations.py +218 -133
- webscout/Provider/OPENAI/toolbaz.py +136 -166
- webscout/Provider/OPENAI/typefully.py +419 -0
- webscout/Provider/OPENAI/typliai.py +279 -0
- webscout/Provider/OPENAI/utils.py +314 -211
- webscout/Provider/OPENAI/wisecat.py +103 -125
- webscout/Provider/OPENAI/writecream.py +185 -156
- webscout/Provider/OPENAI/x0gpt.py +227 -136
- webscout/Provider/OPENAI/zenmux.py +380 -0
- webscout/Provider/OpenRouter.py +386 -0
- webscout/Provider/Openai.py +337 -496
- webscout/Provider/PI.py +443 -344
- webscout/Provider/QwenLM.py +346 -254
- webscout/Provider/STT/__init__.py +28 -0
- webscout/Provider/STT/base.py +303 -0
- webscout/Provider/STT/elevenlabs.py +264 -0
- webscout/Provider/Sambanova.py +317 -0
- webscout/Provider/TTI/README.md +69 -0
- webscout/Provider/TTI/__init__.py +37 -12
- webscout/Provider/TTI/base.py +147 -0
- webscout/Provider/TTI/claudeonline.py +393 -0
- webscout/Provider/TTI/magicstudio.py +292 -0
- webscout/Provider/TTI/miragic.py +180 -0
- webscout/Provider/TTI/pollinations.py +331 -0
- webscout/Provider/TTI/together.py +334 -0
- webscout/Provider/TTI/utils.py +14 -0
- webscout/Provider/TTS/README.md +186 -0
- webscout/Provider/TTS/__init__.py +43 -7
- webscout/Provider/TTS/base.py +523 -0
- webscout/Provider/TTS/deepgram.py +286 -156
- webscout/Provider/TTS/elevenlabs.py +189 -111
- webscout/Provider/TTS/freetts.py +218 -0
- webscout/Provider/TTS/murfai.py +288 -113
- webscout/Provider/TTS/openai_fm.py +364 -0
- webscout/Provider/TTS/parler.py +203 -111
- webscout/Provider/TTS/qwen.py +334 -0
- webscout/Provider/TTS/sherpa.py +286 -0
- webscout/Provider/TTS/speechma.py +693 -180
- webscout/Provider/TTS/streamElements.py +275 -333
- webscout/Provider/TTS/utils.py +280 -280
- webscout/Provider/TextPollinationsAI.py +221 -121
- webscout/Provider/TogetherAI.py +450 -0
- webscout/Provider/TwoAI.py +309 -199
- webscout/Provider/TypliAI.py +311 -0
- webscout/Provider/UNFINISHED/ChatHub.py +219 -0
- webscout/Provider/{OPENAI/glider.py → UNFINISHED/ChutesAI.py} +160 -145
- webscout/Provider/UNFINISHED/GizAI.py +300 -0
- webscout/Provider/UNFINISHED/Marcus.py +218 -0
- webscout/Provider/UNFINISHED/Qodo.py +481 -0
- webscout/Provider/UNFINISHED/XenAI.py +330 -0
- webscout/Provider/{Youchat.py → UNFINISHED/Youchat.py} +64 -47
- webscout/Provider/UNFINISHED/aihumanizer.py +41 -0
- webscout/Provider/UNFINISHED/grammerchecker.py +37 -0
- webscout/Provider/UNFINISHED/liner.py +342 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +246 -0
- webscout/Provider/UNFINISHED/samurai.py +231 -0
- webscout/Provider/WiseCat.py +256 -196
- webscout/Provider/WrDoChat.py +390 -0
- webscout/Provider/__init__.py +115 -198
- webscout/Provider/ai4chat.py +181 -202
- webscout/Provider/akashgpt.py +330 -342
- webscout/Provider/cerebras.py +397 -242
- webscout/Provider/cleeai.py +236 -213
- webscout/Provider/elmo.py +291 -234
- webscout/Provider/geminiapi.py +343 -208
- webscout/Provider/julius.py +245 -223
- webscout/Provider/learnfastai.py +333 -266
- webscout/Provider/llama3mitril.py +230 -180
- webscout/Provider/llmchat.py +308 -213
- webscout/Provider/llmchatco.py +321 -311
- webscout/Provider/meta.py +996 -794
- webscout/Provider/oivscode.py +332 -0
- webscout/Provider/searchchat.py +316 -293
- webscout/Provider/sonus.py +264 -208
- webscout/Provider/toolbaz.py +359 -320
- webscout/Provider/turboseek.py +332 -219
- webscout/Provider/typefully.py +262 -280
- webscout/Provider/x0gpt.py +332 -256
- webscout/__init__.py +31 -38
- webscout/__main__.py +5 -5
- webscout/cli.py +585 -293
- webscout/client.py +1497 -0
- webscout/conversation.py +140 -565
- webscout/exceptions.py +383 -339
- webscout/litagent/__init__.py +29 -29
- webscout/litagent/agent.py +492 -455
- webscout/litagent/constants.py +60 -60
- webscout/models.py +505 -181
- webscout/optimizers.py +32 -378
- webscout/prompt_manager.py +376 -274
- webscout/sanitize.py +1514 -0
- webscout/scout/README.md +452 -0
- webscout/scout/__init__.py +8 -8
- webscout/scout/core/__init__.py +7 -7
- webscout/scout/core/crawler.py +330 -140
- webscout/scout/core/scout.py +800 -568
- webscout/scout/core/search_result.py +51 -96
- webscout/scout/core/text_analyzer.py +64 -63
- webscout/scout/core/text_utils.py +412 -277
- webscout/scout/core/web_analyzer.py +54 -52
- webscout/scout/element.py +872 -460
- webscout/scout/parsers/__init__.py +70 -69
- webscout/scout/parsers/html5lib_parser.py +182 -172
- webscout/scout/parsers/html_parser.py +238 -236
- webscout/scout/parsers/lxml_parser.py +203 -178
- webscout/scout/utils.py +38 -37
- webscout/search/__init__.py +47 -0
- webscout/search/base.py +201 -0
- webscout/search/bing_main.py +45 -0
- webscout/search/brave_main.py +92 -0
- webscout/search/duckduckgo_main.py +57 -0
- webscout/search/engines/__init__.py +127 -0
- webscout/search/engines/bing/__init__.py +15 -0
- webscout/search/engines/bing/base.py +35 -0
- webscout/search/engines/bing/images.py +114 -0
- webscout/search/engines/bing/news.py +96 -0
- webscout/search/engines/bing/suggestions.py +36 -0
- webscout/search/engines/bing/text.py +109 -0
- webscout/search/engines/brave/__init__.py +19 -0
- webscout/search/engines/brave/base.py +47 -0
- webscout/search/engines/brave/images.py +213 -0
- webscout/search/engines/brave/news.py +353 -0
- webscout/search/engines/brave/suggestions.py +318 -0
- webscout/search/engines/brave/text.py +167 -0
- webscout/search/engines/brave/videos.py +364 -0
- webscout/search/engines/duckduckgo/__init__.py +25 -0
- webscout/search/engines/duckduckgo/answers.py +80 -0
- webscout/search/engines/duckduckgo/base.py +189 -0
- webscout/search/engines/duckduckgo/images.py +100 -0
- webscout/search/engines/duckduckgo/maps.py +183 -0
- webscout/search/engines/duckduckgo/news.py +70 -0
- webscout/search/engines/duckduckgo/suggestions.py +22 -0
- webscout/search/engines/duckduckgo/text.py +221 -0
- webscout/search/engines/duckduckgo/translate.py +48 -0
- webscout/search/engines/duckduckgo/videos.py +80 -0
- webscout/search/engines/duckduckgo/weather.py +84 -0
- webscout/search/engines/mojeek.py +61 -0
- webscout/search/engines/wikipedia.py +77 -0
- webscout/search/engines/yahoo/__init__.py +41 -0
- webscout/search/engines/yahoo/answers.py +19 -0
- webscout/search/engines/yahoo/base.py +34 -0
- webscout/search/engines/yahoo/images.py +323 -0
- webscout/search/engines/yahoo/maps.py +19 -0
- webscout/search/engines/yahoo/news.py +258 -0
- webscout/search/engines/yahoo/suggestions.py +140 -0
- webscout/search/engines/yahoo/text.py +273 -0
- webscout/search/engines/yahoo/translate.py +19 -0
- webscout/search/engines/yahoo/videos.py +302 -0
- webscout/search/engines/yahoo/weather.py +220 -0
- webscout/search/engines/yandex.py +67 -0
- webscout/search/engines/yep/__init__.py +13 -0
- webscout/search/engines/yep/base.py +34 -0
- webscout/search/engines/yep/images.py +101 -0
- webscout/search/engines/yep/suggestions.py +38 -0
- webscout/search/engines/yep/text.py +99 -0
- webscout/search/http_client.py +172 -0
- webscout/search/results.py +141 -0
- webscout/search/yahoo_main.py +57 -0
- webscout/search/yep_main.py +48 -0
- webscout/server/__init__.py +48 -0
- webscout/server/config.py +78 -0
- webscout/server/exceptions.py +69 -0
- webscout/server/providers.py +286 -0
- webscout/server/request_models.py +131 -0
- webscout/server/request_processing.py +404 -0
- webscout/server/routes.py +642 -0
- webscout/server/server.py +351 -0
- webscout/server/ui_templates.py +1171 -0
- webscout/swiftcli/__init__.py +79 -809
- webscout/swiftcli/core/__init__.py +7 -0
- webscout/swiftcli/core/cli.py +574 -0
- webscout/swiftcli/core/context.py +98 -0
- webscout/swiftcli/core/group.py +268 -0
- webscout/swiftcli/decorators/__init__.py +28 -0
- webscout/swiftcli/decorators/command.py +243 -0
- webscout/swiftcli/decorators/options.py +247 -0
- webscout/swiftcli/decorators/output.py +392 -0
- webscout/swiftcli/exceptions.py +21 -0
- webscout/swiftcli/plugins/__init__.py +9 -0
- webscout/swiftcli/plugins/base.py +134 -0
- webscout/swiftcli/plugins/manager.py +269 -0
- webscout/swiftcli/utils/__init__.py +58 -0
- webscout/swiftcli/utils/formatting.py +251 -0
- webscout/swiftcli/utils/parsing.py +368 -0
- webscout/update_checker.py +280 -136
- webscout/utils.py +28 -14
- webscout/version.py +2 -1
- webscout/version.py.bak +3 -0
- webscout/zeroart/__init__.py +218 -55
- webscout/zeroart/base.py +70 -60
- webscout/zeroart/effects.py +155 -99
- webscout/zeroart/fonts.py +1799 -816
- webscout-2026.1.19.dist-info/METADATA +638 -0
- webscout-2026.1.19.dist-info/RECORD +312 -0
- {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info}/WHEEL +1 -1
- webscout-2026.1.19.dist-info/entry_points.txt +4 -0
- webscout-2026.1.19.dist-info/top_level.txt +1 -0
- inferno/__init__.py +0 -6
- inferno/__main__.py +0 -9
- inferno/cli.py +0 -6
- webscout/DWEBS.py +0 -477
- webscout/Extra/autocoder/__init__.py +0 -9
- webscout/Extra/autocoder/autocoder.py +0 -849
- webscout/Extra/autocoder/autocoder_utiles.py +0 -332
- webscout/LLM.py +0 -442
- webscout/Litlogger/__init__.py +0 -67
- webscout/Litlogger/core/__init__.py +0 -6
- webscout/Litlogger/core/level.py +0 -23
- webscout/Litlogger/core/logger.py +0 -165
- webscout/Litlogger/handlers/__init__.py +0 -12
- webscout/Litlogger/handlers/console.py +0 -33
- webscout/Litlogger/handlers/file.py +0 -143
- webscout/Litlogger/handlers/network.py +0 -173
- webscout/Litlogger/styles/__init__.py +0 -7
- webscout/Litlogger/styles/colors.py +0 -249
- webscout/Litlogger/styles/formats.py +0 -458
- webscout/Litlogger/styles/text.py +0 -87
- webscout/Litlogger/utils/__init__.py +0 -6
- webscout/Litlogger/utils/detectors.py +0 -153
- webscout/Litlogger/utils/formatters.py +0 -200
- webscout/Local/__init__.py +0 -12
- webscout/Local/__main__.py +0 -9
- webscout/Local/api.py +0 -576
- webscout/Local/cli.py +0 -516
- webscout/Local/config.py +0 -75
- webscout/Local/llm.py +0 -287
- webscout/Local/model_manager.py +0 -253
- webscout/Local/server.py +0 -721
- webscout/Local/utils.py +0 -93
- webscout/Provider/AI21.py +0 -177
- webscout/Provider/AISEARCH/DeepFind.py +0 -250
- webscout/Provider/AISEARCH/ISou.py +0 -256
- webscout/Provider/AISEARCH/felo_search.py +0 -228
- webscout/Provider/AISEARCH/genspark_search.py +0 -208
- webscout/Provider/AISEARCH/hika_search.py +0 -194
- webscout/Provider/AISEARCH/scira_search.py +0 -324
- webscout/Provider/Aitopia.py +0 -292
- webscout/Provider/AllenAI.py +0 -413
- webscout/Provider/Blackboxai.py +0 -229
- webscout/Provider/C4ai.py +0 -432
- webscout/Provider/ChatGPTClone.py +0 -226
- webscout/Provider/ChatGPTES.py +0 -237
- webscout/Provider/ChatGPTGratis.py +0 -194
- webscout/Provider/Chatify.py +0 -175
- webscout/Provider/Cloudflare.py +0 -273
- webscout/Provider/DeepSeek.py +0 -196
- webscout/Provider/ElectronHub.py +0 -709
- webscout/Provider/ExaChat.py +0 -342
- webscout/Provider/Free2GPT.py +0 -241
- webscout/Provider/GPTWeb.py +0 -193
- webscout/Provider/Glider.py +0 -211
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +0 -206
- webscout/Provider/HuggingFaceChat.py +0 -462
- webscout/Provider/Hunyuan.py +0 -272
- webscout/Provider/LambdaChat.py +0 -392
- webscout/Provider/Llama.py +0 -200
- webscout/Provider/Llama3.py +0 -204
- webscout/Provider/Marcus.py +0 -148
- webscout/Provider/OLLAMA.py +0 -396
- webscout/Provider/OPENAI/c4ai.py +0 -367
- webscout/Provider/OPENAI/chatgptclone.py +0 -460
- webscout/Provider/OPENAI/exachat.py +0 -433
- webscout/Provider/OPENAI/freeaichat.py +0 -352
- webscout/Provider/OPENAI/opkfc.py +0 -488
- webscout/Provider/OPENAI/scirachat.py +0 -463
- webscout/Provider/OPENAI/standardinput.py +0 -425
- webscout/Provider/OPENAI/typegpt.py +0 -346
- webscout/Provider/OPENAI/uncovrAI.py +0 -455
- webscout/Provider/OPENAI/venice.py +0 -413
- webscout/Provider/OPENAI/yep.py +0 -327
- webscout/Provider/OpenGPT.py +0 -199
- webscout/Provider/Perplexitylabs.py +0 -415
- webscout/Provider/Phind.py +0 -535
- webscout/Provider/PizzaGPT.py +0 -198
- webscout/Provider/Reka.py +0 -214
- webscout/Provider/StandardInput.py +0 -278
- webscout/Provider/TTI/AiForce/__init__.py +0 -22
- webscout/Provider/TTI/AiForce/async_aiforce.py +0 -224
- webscout/Provider/TTI/AiForce/sync_aiforce.py +0 -245
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +0 -9
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +0 -181
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +0 -180
- webscout/Provider/TTI/ImgSys/__init__.py +0 -23
- webscout/Provider/TTI/ImgSys/async_imgsys.py +0 -202
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +0 -195
- webscout/Provider/TTI/MagicStudio/__init__.py +0 -2
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +0 -111
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +0 -109
- webscout/Provider/TTI/Nexra/__init__.py +0 -22
- webscout/Provider/TTI/Nexra/async_nexra.py +0 -286
- webscout/Provider/TTI/Nexra/sync_nexra.py +0 -258
- webscout/Provider/TTI/PollinationsAI/__init__.py +0 -23
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +0 -311
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +0 -265
- webscout/Provider/TTI/aiarta/__init__.py +0 -2
- webscout/Provider/TTI/aiarta/async_aiarta.py +0 -482
- webscout/Provider/TTI/aiarta/sync_aiarta.py +0 -440
- webscout/Provider/TTI/artbit/__init__.py +0 -22
- webscout/Provider/TTI/artbit/async_artbit.py +0 -155
- webscout/Provider/TTI/artbit/sync_artbit.py +0 -148
- webscout/Provider/TTI/fastflux/__init__.py +0 -22
- webscout/Provider/TTI/fastflux/async_fastflux.py +0 -261
- webscout/Provider/TTI/fastflux/sync_fastflux.py +0 -252
- webscout/Provider/TTI/huggingface/__init__.py +0 -22
- webscout/Provider/TTI/huggingface/async_huggingface.py +0 -199
- webscout/Provider/TTI/huggingface/sync_huggingface.py +0 -195
- webscout/Provider/TTI/piclumen/__init__.py +0 -23
- webscout/Provider/TTI/piclumen/async_piclumen.py +0 -268
- webscout/Provider/TTI/piclumen/sync_piclumen.py +0 -233
- webscout/Provider/TTI/pixelmuse/__init__.py +0 -4
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +0 -249
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +0 -182
- webscout/Provider/TTI/talkai/__init__.py +0 -4
- webscout/Provider/TTI/talkai/async_talkai.py +0 -229
- webscout/Provider/TTI/talkai/sync_talkai.py +0 -207
- webscout/Provider/TTS/gesserit.py +0 -127
- webscout/Provider/TeachAnything.py +0 -187
- webscout/Provider/Venice.py +0 -219
- webscout/Provider/VercelAI.py +0 -234
- webscout/Provider/WebSim.py +0 -228
- webscout/Provider/Writecream.py +0 -211
- webscout/Provider/WritingMate.py +0 -197
- webscout/Provider/aimathgpt.py +0 -189
- webscout/Provider/askmyai.py +0 -158
- webscout/Provider/asksteve.py +0 -203
- webscout/Provider/bagoodex.py +0 -145
- webscout/Provider/chatglm.py +0 -205
- webscout/Provider/copilot.py +0 -428
- webscout/Provider/freeaichat.py +0 -271
- webscout/Provider/gaurish.py +0 -244
- webscout/Provider/geminiprorealtime.py +0 -160
- webscout/Provider/granite.py +0 -187
- webscout/Provider/hermes.py +0 -219
- webscout/Provider/koala.py +0 -268
- webscout/Provider/labyrinth.py +0 -340
- webscout/Provider/lepton.py +0 -194
- webscout/Provider/llamatutor.py +0 -192
- webscout/Provider/multichat.py +0 -325
- webscout/Provider/promptrefine.py +0 -193
- webscout/Provider/scira_chat.py +0 -277
- webscout/Provider/scnet.py +0 -187
- webscout/Provider/talkai.py +0 -194
- webscout/Provider/tutorai.py +0 -252
- webscout/Provider/typegpt.py +0 -232
- webscout/Provider/uncovr.py +0 -312
- webscout/Provider/yep.py +0 -376
- webscout/litprinter/__init__.py +0 -59
- webscout/scout/core.py +0 -881
- webscout/tempid.py +0 -128
- webscout/webscout_search.py +0 -1346
- webscout/webscout_search_async.py +0 -877
- webscout/yep_search.py +0 -297
- webscout-8.2.2.dist-info/METADATA +0 -734
- webscout-8.2.2.dist-info/RECORD +0 -309
- webscout-8.2.2.dist-info/entry_points.txt +0 -5
- webscout-8.2.2.dist-info/top_level.txt +0 -3
- webstoken/__init__.py +0 -30
- webstoken/classifier.py +0 -189
- webstoken/keywords.py +0 -216
- webstoken/language.py +0 -128
- webstoken/ner.py +0 -164
- webstoken/normalizer.py +0 -35
- webstoken/processor.py +0 -77
- webstoken/sentiment.py +0 -206
- webstoken/stemmer.py +0 -73
- webstoken/tagger.py +0 -60
- webstoken/tokenizer.py +0 -158
- {webscout-8.2.2.dist-info → webscout-2026.1.19.dist-info/licenses}/LICENSE.md +0 -0
webscout/DWEBS.py
DELETED
|
@@ -1,477 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
DWEBS - A Google search library with advanced features
|
|
3
|
-
"""
|
|
4
|
-
import random
|
|
5
|
-
from time import sleep
|
|
6
|
-
from webscout.scout import Scout
|
|
7
|
-
from requests import get
|
|
8
|
-
from urllib.parse import unquote, urlencode
|
|
9
|
-
from typing import List, Dict, Optional, Union, Iterator, Any
|
|
10
|
-
from concurrent.futures import ThreadPoolExecutor
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class SearchResult:
|
|
14
|
-
"""Class to represent a search result with metadata."""
|
|
15
|
-
|
|
16
|
-
def __init__(self, url: str, title: str, description: str):
|
|
17
|
-
"""
|
|
18
|
-
Initialize a search result.
|
|
19
|
-
|
|
20
|
-
Args:
|
|
21
|
-
url: The URL of the search result
|
|
22
|
-
title: The title of the search result
|
|
23
|
-
description: The description/snippet of the search result
|
|
24
|
-
"""
|
|
25
|
-
self.url = url
|
|
26
|
-
self.title = title
|
|
27
|
-
self.description = description
|
|
28
|
-
# Additional metadata that can be populated
|
|
29
|
-
self.metadata: Dict[str, Any] = {}
|
|
30
|
-
|
|
31
|
-
def __repr__(self) -> str:
|
|
32
|
-
"""Return string representation of search result."""
|
|
33
|
-
return f"SearchResult(url={self.url}, title={self.title}, description={self.description})"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class GoogleSearch:
|
|
37
|
-
"""Google search implementation with configurable parameters and advanced features."""
|
|
38
|
-
|
|
39
|
-
_executor: ThreadPoolExecutor = ThreadPoolExecutor()
|
|
40
|
-
|
|
41
|
-
def __init__(
|
|
42
|
-
self,
|
|
43
|
-
timeout: int = 10,
|
|
44
|
-
proxies: Optional[Dict[str, str]] = None,
|
|
45
|
-
verify: bool = True,
|
|
46
|
-
lang: str = "en",
|
|
47
|
-
sleep_interval: float = 0.0
|
|
48
|
-
):
|
|
49
|
-
"""
|
|
50
|
-
Initialize GoogleSearch with custom settings.
|
|
51
|
-
|
|
52
|
-
Args:
|
|
53
|
-
timeout: Request timeout in seconds
|
|
54
|
-
proxies: Proxy configuration for requests
|
|
55
|
-
verify: Whether to verify SSL certificates
|
|
56
|
-
lang: Search language
|
|
57
|
-
sleep_interval: Sleep time between pagination requests
|
|
58
|
-
"""
|
|
59
|
-
self.timeout = timeout
|
|
60
|
-
self.proxies = proxies if proxies else {}
|
|
61
|
-
self.verify = verify
|
|
62
|
-
self.lang = lang
|
|
63
|
-
self.sleep_interval = sleep_interval
|
|
64
|
-
self.base_url = "https://www.google.com/search"
|
|
65
|
-
|
|
66
|
-
def _get_useragent(self) -> str:
|
|
67
|
-
"""
|
|
68
|
-
Generate a random user agent string.
|
|
69
|
-
|
|
70
|
-
Returns:
|
|
71
|
-
Random user agent string
|
|
72
|
-
"""
|
|
73
|
-
lynx_version = f"Lynx/{random.randint(2, 3)}.{random.randint(8, 9)}.{random.randint(0, 2)}"
|
|
74
|
-
libwww_version = f"libwww-FM/{random.randint(2, 3)}.{random.randint(13, 15)}"
|
|
75
|
-
ssl_mm_version = f"SSL-MM/{random.randint(1, 2)}.{random.randint(3, 5)}"
|
|
76
|
-
openssl_version = f"OpenSSL/{random.randint(1, 3)}.{random.randint(0, 4)}.{random.randint(0, 9)}"
|
|
77
|
-
return f"{lynx_version} {libwww_version} {ssl_mm_version} {openssl_version}"
|
|
78
|
-
|
|
79
|
-
def _make_request(self, term: str, results: int, start: int = 0, search_type: str = None) -> str:
|
|
80
|
-
"""
|
|
81
|
-
Make a request to Google search.
|
|
82
|
-
|
|
83
|
-
Args:
|
|
84
|
-
term: Search query
|
|
85
|
-
results: Number of results to request
|
|
86
|
-
start: Start position for pagination
|
|
87
|
-
search_type: Type of search ('', 'nws', 'isch')
|
|
88
|
-
|
|
89
|
-
Returns:
|
|
90
|
-
HTML response content
|
|
91
|
-
"""
|
|
92
|
-
params = {
|
|
93
|
-
"q": term,
|
|
94
|
-
"num": results + 2, # Request slightly more than needed
|
|
95
|
-
"hl": self.lang,
|
|
96
|
-
"start": start,
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
# Add search type if specified
|
|
100
|
-
if search_type:
|
|
101
|
-
params["tbm"] = search_type
|
|
102
|
-
|
|
103
|
-
try:
|
|
104
|
-
resp = get(
|
|
105
|
-
url=self.base_url,
|
|
106
|
-
headers={
|
|
107
|
-
"User-Agent": self._get_useragent(),
|
|
108
|
-
"Accept-Language": self.lang,
|
|
109
|
-
"Accept-Encoding": "gzip, deflate, br",
|
|
110
|
-
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
|
111
|
-
},
|
|
112
|
-
params=params,
|
|
113
|
-
proxies=self.proxies if any(self.proxies) else None,
|
|
114
|
-
timeout=self.timeout,
|
|
115
|
-
verify=self.verify,
|
|
116
|
-
cookies={
|
|
117
|
-
'CONSENT': 'PENDING+987',
|
|
118
|
-
'SOCS': 'CAESHAgBEhIaAB',
|
|
119
|
-
}
|
|
120
|
-
)
|
|
121
|
-
resp.raise_for_status()
|
|
122
|
-
return resp.text
|
|
123
|
-
except Exception as e:
|
|
124
|
-
raise RuntimeError(f"Search request failed: {str(e)}")
|
|
125
|
-
|
|
126
|
-
def _extract_url(self, raw_link: str) -> Optional[str]:
|
|
127
|
-
"""
|
|
128
|
-
Extract actual URL from Google redirect URL.
|
|
129
|
-
|
|
130
|
-
Args:
|
|
131
|
-
raw_link: Raw link from Google search
|
|
132
|
-
|
|
133
|
-
Returns:
|
|
134
|
-
Actual URL or None if invalid
|
|
135
|
-
"""
|
|
136
|
-
if not raw_link:
|
|
137
|
-
return None
|
|
138
|
-
|
|
139
|
-
if raw_link.startswith("/url?"):
|
|
140
|
-
try:
|
|
141
|
-
link = unquote(raw_link.split("&")[0].replace("/url?q=", ""))
|
|
142
|
-
return link
|
|
143
|
-
except Exception:
|
|
144
|
-
return None
|
|
145
|
-
elif raw_link.startswith("http"):
|
|
146
|
-
return unquote(raw_link)
|
|
147
|
-
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
def _is_valid_result(self, link: str, fetched_links: set, unique: bool) -> bool:
|
|
151
|
-
"""
|
|
152
|
-
Check if search result is valid.
|
|
153
|
-
|
|
154
|
-
Args:
|
|
155
|
-
link: URL to check
|
|
156
|
-
fetched_links: Set of already fetched links
|
|
157
|
-
unique: Whether to filter duplicate links
|
|
158
|
-
|
|
159
|
-
Returns:
|
|
160
|
-
Boolean indicating if result is valid
|
|
161
|
-
"""
|
|
162
|
-
if any(x in link for x in ["google.", "/search?", "webcache."]):
|
|
163
|
-
return False
|
|
164
|
-
|
|
165
|
-
if link in fetched_links and unique:
|
|
166
|
-
return False
|
|
167
|
-
|
|
168
|
-
return True
|
|
169
|
-
|
|
170
|
-
def _parse_search_results(
|
|
171
|
-
self,
|
|
172
|
-
html: str,
|
|
173
|
-
num_results: int,
|
|
174
|
-
fetched_links: set,
|
|
175
|
-
unique: bool
|
|
176
|
-
) -> List[SearchResult]:
|
|
177
|
-
"""
|
|
178
|
-
Parse search results from HTML.
|
|
179
|
-
|
|
180
|
-
Args:
|
|
181
|
-
html: HTML content to parse
|
|
182
|
-
num_results: Maximum number of results to return
|
|
183
|
-
fetched_links: Set of already fetched links
|
|
184
|
-
unique: Filter duplicate links
|
|
185
|
-
|
|
186
|
-
Returns:
|
|
187
|
-
List of SearchResult objects
|
|
188
|
-
"""
|
|
189
|
-
results = []
|
|
190
|
-
soup = Scout(html, features="html.parser")
|
|
191
|
-
result_blocks = soup.find_all("div", class_="ezO2md")
|
|
192
|
-
|
|
193
|
-
if not result_blocks:
|
|
194
|
-
# Try alternative class patterns if the main one doesn't match
|
|
195
|
-
result_blocks = soup.find_all("div", attrs={"class": lambda c: c and "g" in c.split()})
|
|
196
|
-
|
|
197
|
-
for result in result_blocks:
|
|
198
|
-
# Find the link - looking for various potential Google result classes
|
|
199
|
-
link_tag = result.find("a", class_=["fuLhoc", "ZWRArf"])
|
|
200
|
-
if not link_tag:
|
|
201
|
-
link_tag = result.find("a")
|
|
202
|
-
if not link_tag:
|
|
203
|
-
continue
|
|
204
|
-
|
|
205
|
-
raw_link = link_tag.get("href", "")
|
|
206
|
-
link = self._extract_url(raw_link)
|
|
207
|
-
|
|
208
|
-
if not link:
|
|
209
|
-
continue
|
|
210
|
-
|
|
211
|
-
if not self._is_valid_result(link, fetched_links, unique):
|
|
212
|
-
continue
|
|
213
|
-
|
|
214
|
-
# Get title - it's the text content of the link tag for these results
|
|
215
|
-
title = link_tag.get_text(strip=True)
|
|
216
|
-
if not title:
|
|
217
|
-
continue
|
|
218
|
-
|
|
219
|
-
# Get description - it's in a span with class FrIlee or potentially other classes
|
|
220
|
-
description_tag = result.find("span", class_="FrIlee")
|
|
221
|
-
if not description_tag:
|
|
222
|
-
description_tag = result.find(["div", "span"], class_=lambda c: c and any(x in c for x in ["snippet", "description", "VwiC3b"]))
|
|
223
|
-
|
|
224
|
-
description = description_tag.get_text(strip=True) if description_tag else ""
|
|
225
|
-
|
|
226
|
-
# Create result object
|
|
227
|
-
search_result = SearchResult(link, title, description)
|
|
228
|
-
|
|
229
|
-
# Add extra metadata if available
|
|
230
|
-
citation = result.find("cite")
|
|
231
|
-
if citation:
|
|
232
|
-
search_result.metadata["source"] = citation.get_text(strip=True)
|
|
233
|
-
|
|
234
|
-
timestamp = result.find("span", class_=lambda c: c and "ZE5qJf" in c)
|
|
235
|
-
if timestamp:
|
|
236
|
-
search_result.metadata["date"] = timestamp.get_text(strip=True)
|
|
237
|
-
|
|
238
|
-
fetched_links.add(link)
|
|
239
|
-
results.append(search_result)
|
|
240
|
-
|
|
241
|
-
if len(results) >= num_results:
|
|
242
|
-
break
|
|
243
|
-
|
|
244
|
-
return results
|
|
245
|
-
|
|
246
|
-
def text(
|
|
247
|
-
self,
|
|
248
|
-
keywords: str,
|
|
249
|
-
region: str = None,
|
|
250
|
-
safesearch: str = "moderate",
|
|
251
|
-
max_results: int = 10,
|
|
252
|
-
start_num: int = 0,
|
|
253
|
-
unique: bool = True
|
|
254
|
-
) -> List[SearchResult]:
|
|
255
|
-
"""
|
|
256
|
-
Search Google for web results.
|
|
257
|
-
|
|
258
|
-
Args:
|
|
259
|
-
keywords: Search query
|
|
260
|
-
region: Region for search results (ISO country code)
|
|
261
|
-
safesearch: SafeSearch setting ("on", "moderate", "off")
|
|
262
|
-
max_results: Maximum number of results to return
|
|
263
|
-
start_num: Starting position for pagination
|
|
264
|
-
unique: Filter duplicate results
|
|
265
|
-
|
|
266
|
-
Returns:
|
|
267
|
-
List of SearchResult objects with search results
|
|
268
|
-
"""
|
|
269
|
-
if not keywords:
|
|
270
|
-
raise ValueError("Search keywords cannot be empty")
|
|
271
|
-
|
|
272
|
-
# Map safesearch values to Google's safe parameter
|
|
273
|
-
safe_map = {
|
|
274
|
-
"on": "active",
|
|
275
|
-
"moderate": "moderate",
|
|
276
|
-
"off": "off"
|
|
277
|
-
}
|
|
278
|
-
safe = safe_map.get(safesearch.lower(), "moderate")
|
|
279
|
-
|
|
280
|
-
# Keep track of unique results
|
|
281
|
-
fetched_results = []
|
|
282
|
-
fetched_links = set()
|
|
283
|
-
start = start_num
|
|
284
|
-
|
|
285
|
-
while len(fetched_results) < max_results:
|
|
286
|
-
response_html = self._make_request(
|
|
287
|
-
term=keywords,
|
|
288
|
-
results=max_results - len(fetched_results),
|
|
289
|
-
start=start
|
|
290
|
-
)
|
|
291
|
-
|
|
292
|
-
results = self._parse_search_results(
|
|
293
|
-
html=response_html,
|
|
294
|
-
num_results=max_results - len(fetched_results),
|
|
295
|
-
fetched_links=fetched_links,
|
|
296
|
-
unique=unique
|
|
297
|
-
)
|
|
298
|
-
|
|
299
|
-
if not results:
|
|
300
|
-
break
|
|
301
|
-
|
|
302
|
-
fetched_results.extend(results)
|
|
303
|
-
|
|
304
|
-
if len(fetched_results) >= max_results:
|
|
305
|
-
break
|
|
306
|
-
|
|
307
|
-
start += 10
|
|
308
|
-
sleep(self.sleep_interval)
|
|
309
|
-
|
|
310
|
-
return fetched_results[:max_results]
|
|
311
|
-
|
|
312
|
-
def news(
|
|
313
|
-
self,
|
|
314
|
-
keywords: str,
|
|
315
|
-
region: str = None,
|
|
316
|
-
safesearch: str = "moderate",
|
|
317
|
-
max_results: int = 10
|
|
318
|
-
) -> List[SearchResult]:
|
|
319
|
-
"""
|
|
320
|
-
Search Google News for news results.
|
|
321
|
-
|
|
322
|
-
Args:
|
|
323
|
-
keywords: Search query
|
|
324
|
-
region: Region for search results (ISO country code)
|
|
325
|
-
safesearch: SafeSearch setting ("on", "moderate", "off")
|
|
326
|
-
max_results: Maximum number of results to return
|
|
327
|
-
|
|
328
|
-
Returns:
|
|
329
|
-
List of SearchResult objects with news results
|
|
330
|
-
"""
|
|
331
|
-
if not keywords:
|
|
332
|
-
raise ValueError("Search keywords cannot be empty")
|
|
333
|
-
|
|
334
|
-
# Map safesearch values to Google's safe parameter
|
|
335
|
-
safe_map = {
|
|
336
|
-
"on": "active",
|
|
337
|
-
"moderate": "moderate",
|
|
338
|
-
"off": "off"
|
|
339
|
-
}
|
|
340
|
-
safe = safe_map.get(safesearch.lower(), "moderate")
|
|
341
|
-
|
|
342
|
-
# Keep track of unique results
|
|
343
|
-
fetched_results = []
|
|
344
|
-
fetched_links = set()
|
|
345
|
-
|
|
346
|
-
response_html = self._make_request(
|
|
347
|
-
term=keywords,
|
|
348
|
-
results=max_results,
|
|
349
|
-
search_type="nws"
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
results = self._parse_search_results(
|
|
353
|
-
html=response_html,
|
|
354
|
-
num_results=max_results,
|
|
355
|
-
fetched_links=fetched_links,
|
|
356
|
-
unique=True
|
|
357
|
-
)
|
|
358
|
-
|
|
359
|
-
return results[:max_results]
|
|
360
|
-
|
|
361
|
-
def suggestions(self, query: str, region: str = None) -> List[str]:
|
|
362
|
-
"""
|
|
363
|
-
Get search suggestions for a query term.
|
|
364
|
-
|
|
365
|
-
Args:
|
|
366
|
-
query: Search query
|
|
367
|
-
region: Region for suggestions (ISO country code)
|
|
368
|
-
|
|
369
|
-
Returns:
|
|
370
|
-
List of search suggestions
|
|
371
|
-
"""
|
|
372
|
-
if not query:
|
|
373
|
-
raise ValueError("Search query cannot be empty")
|
|
374
|
-
|
|
375
|
-
try:
|
|
376
|
-
params = {
|
|
377
|
-
"client": "firefox",
|
|
378
|
-
"q": query,
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
# Add region if specified
|
|
382
|
-
if region and region.lower() != "all":
|
|
383
|
-
params["gl"] = region
|
|
384
|
-
|
|
385
|
-
url = f"https://www.google.com/complete/search?{urlencode(params)}"
|
|
386
|
-
|
|
387
|
-
headers = {
|
|
388
|
-
"User-Agent": self._get_useragent(),
|
|
389
|
-
"Accept": "application/json, text/javascript, */*",
|
|
390
|
-
"Accept-Language": self.lang,
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
response = get(
|
|
394
|
-
url=url,
|
|
395
|
-
headers=headers,
|
|
396
|
-
timeout=self.timeout,
|
|
397
|
-
verify=self.verify
|
|
398
|
-
)
|
|
399
|
-
response.raise_for_status()
|
|
400
|
-
|
|
401
|
-
# Response format is typically: ["original query", ["suggestion1", "suggestion2", ...]]
|
|
402
|
-
data = response.json()
|
|
403
|
-
if isinstance(data, list) and len(data) > 1 and isinstance(data[1], list):
|
|
404
|
-
return data[1]
|
|
405
|
-
return []
|
|
406
|
-
|
|
407
|
-
except Exception as e:
|
|
408
|
-
# Return empty list on error instead of raising exception
|
|
409
|
-
return []
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
# Legacy function support for backward compatibility
|
|
413
|
-
def search(term, num_results=10, lang="en", proxy=None, advanced=False, sleep_interval=0, timeout=5, safe="active", ssl_verify=True, region=None, start_num=0, unique=False):
|
|
414
|
-
"""Legacy function for backward compatibility."""
|
|
415
|
-
google_search = GoogleSearch(
|
|
416
|
-
timeout=timeout,
|
|
417
|
-
proxies={"https": proxy, "http": proxy} if proxy else None,
|
|
418
|
-
verify=ssl_verify,
|
|
419
|
-
lang=lang,
|
|
420
|
-
sleep_interval=sleep_interval
|
|
421
|
-
)
|
|
422
|
-
|
|
423
|
-
results = google_search.text(
|
|
424
|
-
keywords=term,
|
|
425
|
-
region=region,
|
|
426
|
-
safesearch="on" if safe == "active" else "moderate" if safe == "moderate" else "off",
|
|
427
|
-
max_results=num_results,
|
|
428
|
-
start_num=start_num,
|
|
429
|
-
unique=unique
|
|
430
|
-
)
|
|
431
|
-
|
|
432
|
-
# Convert to simple URLs if not advanced mode
|
|
433
|
-
if not advanced:
|
|
434
|
-
return [result.url for result in results]
|
|
435
|
-
return results
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
if __name__ == "__main__":
|
|
439
|
-
from rich import print
|
|
440
|
-
google = GoogleSearch(
|
|
441
|
-
timeout=10, # Optional: Set custom timeout
|
|
442
|
-
proxies=None, # Optional: Use proxies
|
|
443
|
-
verify=True # Optional: SSL verification
|
|
444
|
-
)
|
|
445
|
-
|
|
446
|
-
# Text Search
|
|
447
|
-
print("TEXT SEARCH RESULTS:")
|
|
448
|
-
text_results = google.text(
|
|
449
|
-
keywords="Python programming",
|
|
450
|
-
region="us", # Optional: Region for results
|
|
451
|
-
safesearch="moderate", # Optional: "on", "moderate", "off"
|
|
452
|
-
max_results=3 # Optional: Limit number of results
|
|
453
|
-
)
|
|
454
|
-
for result in text_results:
|
|
455
|
-
print(f"Title: {result.title}")
|
|
456
|
-
print(f"URL: {result.url}")
|
|
457
|
-
print(f"Description: {result.description}")
|
|
458
|
-
print("---")
|
|
459
|
-
|
|
460
|
-
# News Search
|
|
461
|
-
print("\nNEWS SEARCH RESULTS:")
|
|
462
|
-
news_results = google.news(
|
|
463
|
-
keywords="artificial intelligence",
|
|
464
|
-
region="us",
|
|
465
|
-
safesearch="moderate",
|
|
466
|
-
max_results=2
|
|
467
|
-
)
|
|
468
|
-
for result in news_results:
|
|
469
|
-
print(f"Title: {result.title}")
|
|
470
|
-
print(f"URL: {result.url}")
|
|
471
|
-
print(f"Description: {result.description}")
|
|
472
|
-
print("---")
|
|
473
|
-
|
|
474
|
-
# Search Suggestions
|
|
475
|
-
print("\nSEARCH SUGGESTIONS:")
|
|
476
|
-
suggestions = google.suggestions("how to")
|
|
477
|
-
print(suggestions)
|