From cc28d5a64f6e0e061f697262302403db875bc6fe Mon Sep 17 00:00:00 2001 From: Marco Perini Date: Wed, 8 May 2024 13:09:08 +0200 Subject: [PATCH 01/19] docs: fixed unused param and install --- docs/source/conf.py | 1 - docs/source/getting_started/installation.rst | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 8c46d4c2..3f323d6a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -30,4 +30,3 @@ # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = 'sphinx_rtd_theme' -html_static_path = ['_static'] diff --git a/docs/source/getting_started/installation.rst b/docs/source/getting_started/installation.rst index 9dc896d6..e3a859d8 100644 --- a/docs/source/getting_started/installation.rst +++ b/docs/source/getting_started/installation.rst @@ -8,8 +8,8 @@ Prerequisites ^^^^^^^^^^^^^ - `Python 3.8+ `_ -- `pip ` -- `ollama ` *optional for local models +- `pip `_ +- `ollama `_ *optional for local models Install the library From ae5655fdde810e80d20d7918b0b2232e29ee3f56 Mon Sep 17 00:00:00 2001 From: Marco Perini Date: Wed, 8 May 2024 19:00:13 +0200 Subject: [PATCH 02/19] docs(readme): improve main readme --- README.md | 148 +++++++++++++----------------------------------------- 1 file changed, 36 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index 88171c91..e46696dc 100644 --- a/README.md +++ b/README.md @@ -48,11 +48,16 @@ The documentation for ScrapeGraphAI can be found [here](https://scrapegraph-ai.r Check out also the docusaurus [documentation](https://scrapegraph-doc.onrender.com/). ## πŸ’» Usage -You can use the `SmartScraper` class to extract information from a website using a prompt. +There are three main scraping pipelines that can be used to extract information from a website (or local file): +- `SmartScraperGraph`: single-page scraper that only needs a user prompt and an input source; +- `SearchGraph`: multi-page scraper that extracts information from the top n search results of a search engine; +- `SpeechGraph`: single-page scraper that extracts information from a website and generates an audio file. -The `SmartScraper` class is a direct graph implementation that uses the most common nodes present in a web scraping pipeline. For more information, please see the [documentation](https://scrapegraph-ai.readthedocs.io/en/latest/). -### Case 1: Extracting information using Ollama -Remember to download the model on Ollama separately! +It is possible to use different LLM through APIs, such as **OpenAI**, **Groq**, **Azure** and **Gemini**, or local models using **Ollama**. + +### Case 1: SmartScraper using Local Models + +Remember to have [Ollama](https://ollama.com/) installed and download the models using the **ollama pull** command. ```python from scrapegraphai.graphs import SmartScraperGraph @@ -67,11 +72,12 @@ graph_config = { "embeddings": { "model": "ollama/nomic-embed-text", "base_url": "http://localhost:11434", # set Ollama URL - } + }, + "verbose": True, } smart_scraper_graph = SmartScraperGraph( - prompt="List me all the articles", + prompt="List me all the projects with their descriptions", # also accepts a string with the already downloaded HTML code source="https://perinim.github.io/projects", config=graph_config @@ -82,159 +88,77 @@ print(result) ``` -### Case 2: Extracting information using Docker +The output will be a list of projects with their descriptions like the following: -Note: before using the local model remember to create the docker container! -```text - docker-compose up -d - docker exec -it ollama ollama pull stablelm-zephyr -``` -You can use which models avaiable on Ollama or your own model instead of stablelm-zephyr ```python -from scrapegraphai.graphs import SmartScraperGraph - -graph_config = { - "llm": { - "model": "ollama/mistral", - "temperature": 0, - "format": "json", # Ollama needs the format to be specified explicitly - # "model_tokens": 2000, # set context length arbitrarily - }, -} - -smart_scraper_graph = SmartScraperGraph( - prompt="List me all the articles", - # also accepts a string with the already downloaded HTML code - source="https://perinim.github.io/projects", - config=graph_config -) - -result = smart_scraper_graph.run() -print(result) +{'projects': [{'title': 'Rotary Pendulum RL', 'description': 'Open Source project aimed at controlling a real life rotary pendulum using RL algorithms'}, {'title': 'DQN Implementation from scratch', 'description': 'Developed a Deep Q-Network algorithm to train a simple and double pendulum'}, ...]} ``` +### Case 2: SearchGraph using Mixed Models -### Case 3: Extracting information using Openai model -```python -from scrapegraphai.graphs import SmartScraperGraph -OPENAI_API_KEY = "YOUR_API_KEY" - -graph_config = { - "llm": { - "api_key": OPENAI_API_KEY, - "model": "gpt-3.5-turbo", - }, -} +We use **Groq** for the LLM and **Ollama** for the embeddings. -smart_scraper_graph = SmartScraperGraph( - prompt="List me all the articles", - # also accepts a string with the already downloaded HTML code - source="https://perinim.github.io/projects", - config=graph_config -) - -result = smart_scraper_graph.run() -print(result) -``` - -### Case 4: Extracting information using Groq ```python -from scrapegraphai.graphs import SmartScraperGraph -from scrapegraphai.utils import prettify_exec_info - -groq_key = os.getenv("GROQ_APIKEY") +from scrapegraphai.graphs import SearchGraph +# Define the configuration for the graph graph_config = { "llm": { "model": "groq/gemma-7b-it", - "api_key": groq_key, + "api_key": "GROQ_API_KEY", "temperature": 0 }, "embeddings": { "model": "ollama/nomic-embed-text", - "temperature": 0, - "base_url": "http://localhost:11434", + "base_url": "http://localhost:11434", # set ollama URL arbitrarily }, - "headless": False + "max_results": 5, } -smart_scraper_graph = SmartScraperGraph( - prompt="List me all the projects with their description and the author.", - source="https://perinim.github.io/projects", +# Create the SearchGraph instance +search_graph = SearchGraph( + prompt="List me all the traditional recipes from Chioggia", config=graph_config ) -result = smart_scraper_graph.run() +# Run the graph +result = search_graph.run() print(result) ``` +The output will be a list of recipes like the following: -### Case 5: Extracting information using Azure ```python -from langchain_openai import AzureChatOpenAI -from langchain_openai import AzureOpenAIEmbeddings - -lm_model_instance = AzureChatOpenAI( - openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"], - azure_deployment=os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"] -) - -embedder_model_instance = AzureOpenAIEmbeddings( - azure_deployment=os.environ["AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT_NAME"], - openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"], -) -graph_config = { - "llm": {"model_instance": llm_model_instance}, - "embeddings": {"model_instance": embedder_model_instance} -} - -smart_scraper_graph = SmartScraperGraph( - prompt="""List me all the events, with the following fields: company_name, event_name, event_start_date, event_start_time, - event_end_date, event_end_time, location, event_mode, event_category, - third_party_redirect, no_of_days, - time_in_hours, hosted_or_attending, refreshments_type, - registration_available, registration_link""", - source="https://www.hmhco.com/event", - config=graph_config -) +{'recipes': [{'name': 'Sarde in SaΓ²re'}, {'name': 'Bigoli in salsa'}, {'name': 'Seppie in umido'}, {'name': 'Moleche frite'}, {'name': 'Risotto alla pescatora'}, {'name': 'Broeto'}, {'name': 'Bibarasse in Cassopipa'}, {'name': 'Risi e bisi'}, {'name': 'Smegiassa Ciosota'}]} ``` +### Case 3: SpeechGraph using OpenAI + +You just need to pass the OpenAI API key and the model name. -### Case 6: Extracting information using Gemini ```python from scrapegraphai.graphs import SmartScraperGraph -GOOGLE_APIKEY = "YOUR_API_KEY" # Define the configuration for the graph graph_config = { "llm": { - "api_key": GOOGLE_APIKEY, - "model": "gemini-pro", + "api_key": "OPENAI_API_KEY", + "model": "gpt-3.5-turbo", }, } # Create the SmartScraperGraph instance smart_scraper_graph = SmartScraperGraph( - prompt="List me all the articles", + prompt="Make a detailed audio summary of the projects on this page", source="https://perinim.github.io/projects", config=graph_config ) +# Run the graph result = smart_scraper_graph.run() print(result) ``` -The output for all 3 the cases will be a dictionary with the extracted information, for example: - -```bash -{ - 'titles': [ - 'Rotary Pendulum RL' - ], - 'descriptions': [ - 'Open Source project aimed at controlling a real life rotary pendulum using RL algorithms' - ] -} -``` +The output will be an audio file with the summary of the projects on the page. ## 🀝 Contributing From 4bf90f32a8fbb5a06279ec3002200961458a1250 Mon Sep 17 00:00:00 2001 From: Marco Perini Date: Wed, 8 May 2024 20:53:43 +0200 Subject: [PATCH 03/19] docs: fixed speechgraphexample --- README.md | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e46696dc..2d9681ba 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ [![](https://dcbadge.vercel.app/api/server/gkxQDAjfeX)](https://discord.gg/gkxQDAjfeX) -ScrapeGraphAI is a *web scraping* python library that uses LLM and direct graph logic to create scraping pipelines for websites, documents and XML files. +ScrapeGraphAI is a *web scraping* python library that uses LLM and direct graph logic to create scraping pipelines for websites and local documents (XML, HTML, JSON, etc.). + Just say which information you want to extract and the library will do it for you!

@@ -136,26 +137,34 @@ The output will be a list of recipes like the following: You just need to pass the OpenAI API key and the model name. ```python -from scrapegraphai.graphs import SmartScraperGraph +from scrapegraphai.graphs import SpeechGraph -# Define the configuration for the graph graph_config = { "llm": { "api_key": "OPENAI_API_KEY", "model": "gpt-3.5-turbo", }, + "tts_model": { + "api_key": "OPENAI_API_KEY", + "model": "tts-1", + "voice": "alloy" + }, + "output_path": "audio_summary.mp3", } -# Create the SmartScraperGraph instance -smart_scraper_graph = SmartScraperGraph( - prompt="Make a detailed audio summary of the projects on this page", - source="https://perinim.github.io/projects", - config=graph_config +# ************************************************ +# Create the SpeechGraph instance and run it +# ************************************************ + +speech_graph = SpeechGraph( + prompt="Make a detailed audio summary of the projects.", + source="https://perinim.github.io/projects/", + config=graph_config, ) -# Run the graph -result = smart_scraper_graph.run() +result = speech_graph.run() print(result) + ``` The output will be an audio file with the summary of the projects on the page. From bd8afafce580b604ce15c1a6ae11585e0335cac6 Mon Sep 17 00:00:00 2001 From: Hemanth S Banur <119428848+arjuuuuunnnnn@users.noreply.github.com> Date: Thu, 9 May 2024 09:36:06 +0530 Subject: [PATCH 04/19] Fixed "NameError: name 'GoogleGenerativeAIEmbeddings' is not defined" --- scrapegraphai/graphs/abstract_graph.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scrapegraphai/graphs/abstract_graph.py b/scrapegraphai/graphs/abstract_graph.py index b015907c..3f9eee24 100644 --- a/scrapegraphai/graphs/abstract_graph.py +++ b/scrapegraphai/graphs/abstract_graph.py @@ -7,6 +7,7 @@ from langchain_community.embeddings import HuggingFaceHubEmbeddings, OllamaEmbeddings from ..helpers import models_tokens from ..models import AzureOpenAI, Bedrock, Gemini, Groq, HuggingFace, Ollama, OpenAI, Anthropic +from langchain_google_genai.embeddings import GoogleGenerativeAIEmbeddings class AbstractGraph(ABC): From 0bb68d1500bc69cdfb5b36c35582c67e164e42b2 Mon Sep 17 00:00:00 2001 From: VinciGit00 Date: Thu, 9 May 2024 10:31:21 +0200 Subject: [PATCH 05/19] Merge branch 'main' of https://github.com/VinciGit00/Scrapegraph-ai --- examples/local_models/README.md | 0 examples/local_models/{Ollama => }/csv_scraper_ollama.py | 0 examples/local_models/{Ollama => }/inputs/books.xml | 0 examples/local_models/{Ollama => }/inputs/example.json | 0 examples/local_models/{Ollama => }/inputs/plain_html_example.txt | 0 examples/local_models/{Ollama => }/inputs/username.csv | 0 examples/local_models/{Ollama => }/json_scraper_ollama.py | 0 examples/local_models/{Ollama => }/scrape_plain_text_ollama.py | 0 examples/local_models/{Ollama => }/scrape_xml_ollama.py | 0 examples/local_models/{Ollama => }/script_generator_ollama.py | 0 examples/local_models/{Ollama => }/search_graph_ollama.py | 0 examples/local_models/{Ollama => }/smart_scraper_ollama.py | 0 examples/local_models/{Ollama => }/xml_scraper_ollama.py | 0 scrapegraphai/graphs/abstract_graph.py | 1 + 14 files changed, 1 insertion(+) delete mode 100644 examples/local_models/README.md rename examples/local_models/{Ollama => }/csv_scraper_ollama.py (100%) rename examples/local_models/{Ollama => }/inputs/books.xml (100%) rename examples/local_models/{Ollama => }/inputs/example.json (100%) rename examples/local_models/{Ollama => }/inputs/plain_html_example.txt (100%) rename examples/local_models/{Ollama => }/inputs/username.csv (100%) rename examples/local_models/{Ollama => }/json_scraper_ollama.py (100%) rename examples/local_models/{Ollama => }/scrape_plain_text_ollama.py (100%) rename examples/local_models/{Ollama => }/scrape_xml_ollama.py (100%) rename examples/local_models/{Ollama => }/script_generator_ollama.py (100%) rename examples/local_models/{Ollama => }/search_graph_ollama.py (100%) rename examples/local_models/{Ollama => }/smart_scraper_ollama.py (100%) rename examples/local_models/{Ollama => }/xml_scraper_ollama.py (100%) diff --git a/examples/local_models/README.md b/examples/local_models/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/local_models/Ollama/csv_scraper_ollama.py b/examples/local_models/csv_scraper_ollama.py similarity index 100% rename from examples/local_models/Ollama/csv_scraper_ollama.py rename to examples/local_models/csv_scraper_ollama.py diff --git a/examples/local_models/Ollama/inputs/books.xml b/examples/local_models/inputs/books.xml similarity index 100% rename from examples/local_models/Ollama/inputs/books.xml rename to examples/local_models/inputs/books.xml diff --git a/examples/local_models/Ollama/inputs/example.json b/examples/local_models/inputs/example.json similarity index 100% rename from examples/local_models/Ollama/inputs/example.json rename to examples/local_models/inputs/example.json diff --git a/examples/local_models/Ollama/inputs/plain_html_example.txt b/examples/local_models/inputs/plain_html_example.txt similarity index 100% rename from examples/local_models/Ollama/inputs/plain_html_example.txt rename to examples/local_models/inputs/plain_html_example.txt diff --git a/examples/local_models/Ollama/inputs/username.csv b/examples/local_models/inputs/username.csv similarity index 100% rename from examples/local_models/Ollama/inputs/username.csv rename to examples/local_models/inputs/username.csv diff --git a/examples/local_models/Ollama/json_scraper_ollama.py b/examples/local_models/json_scraper_ollama.py similarity index 100% rename from examples/local_models/Ollama/json_scraper_ollama.py rename to examples/local_models/json_scraper_ollama.py diff --git a/examples/local_models/Ollama/scrape_plain_text_ollama.py b/examples/local_models/scrape_plain_text_ollama.py similarity index 100% rename from examples/local_models/Ollama/scrape_plain_text_ollama.py rename to examples/local_models/scrape_plain_text_ollama.py diff --git a/examples/local_models/Ollama/scrape_xml_ollama.py b/examples/local_models/scrape_xml_ollama.py similarity index 100% rename from examples/local_models/Ollama/scrape_xml_ollama.py rename to examples/local_models/scrape_xml_ollama.py diff --git a/examples/local_models/Ollama/script_generator_ollama.py b/examples/local_models/script_generator_ollama.py similarity index 100% rename from examples/local_models/Ollama/script_generator_ollama.py rename to examples/local_models/script_generator_ollama.py diff --git a/examples/local_models/Ollama/search_graph_ollama.py b/examples/local_models/search_graph_ollama.py similarity index 100% rename from examples/local_models/Ollama/search_graph_ollama.py rename to examples/local_models/search_graph_ollama.py diff --git a/examples/local_models/Ollama/smart_scraper_ollama.py b/examples/local_models/smart_scraper_ollama.py similarity index 100% rename from examples/local_models/Ollama/smart_scraper_ollama.py rename to examples/local_models/smart_scraper_ollama.py diff --git a/examples/local_models/Ollama/xml_scraper_ollama.py b/examples/local_models/xml_scraper_ollama.py similarity index 100% rename from examples/local_models/Ollama/xml_scraper_ollama.py rename to examples/local_models/xml_scraper_ollama.py diff --git a/scrapegraphai/graphs/abstract_graph.py b/scrapegraphai/graphs/abstract_graph.py index b015907c..3f9eee24 100644 --- a/scrapegraphai/graphs/abstract_graph.py +++ b/scrapegraphai/graphs/abstract_graph.py @@ -7,6 +7,7 @@ from langchain_community.embeddings import HuggingFaceHubEmbeddings, OllamaEmbeddings from ..helpers import models_tokens from ..models import AzureOpenAI, Bedrock, Gemini, Groq, HuggingFace, Ollama, OpenAI, Anthropic +from langchain_google_genai.embeddings import GoogleGenerativeAIEmbeddings class AbstractGraph(ABC): From 7b07fdf2b55314345cbb66bae405440b009d9c44 Mon Sep 17 00:00:00 2001 From: VinciGit00 Date: Thu, 9 May 2024 10:33:33 +0200 Subject: [PATCH 06/19] add groq example --- examples/groq/search_graph_groq_openai.py | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 examples/groq/search_graph_groq_openai.py diff --git a/examples/groq/search_graph_groq_openai.py b/examples/groq/search_graph_groq_openai.py new file mode 100644 index 00000000..3d581063 --- /dev/null +++ b/examples/groq/search_graph_groq_openai.py @@ -0,0 +1,46 @@ +""" +Basic example of scraping pipeline using SmartScraper +""" + +import os +from dotenv import load_dotenv +from scrapegraphai.graphs import SearchGraph +from scrapegraphai.utils import prettify_exec_info + +load_dotenv() + + +# ************************************************ +# Define the configuration for the graph +# ************************************************ + +groq_key = os.getenv("GROQ_APIKEY") +openai_key = os.getenv("OPENAI_APIKEY") + +graph_config = { + "llm": { + "model": "groq/gemma-7b-it", + "api_key": groq_key, + "temperature": 0 + }, + "embeddings": { + "api_key": openai_key, + "model": "openai", + }, + "headless": False +} + +search_graph = SearchGraph( + prompt="List me the best escursions near Trento", + config=graph_config +) + +result = search_graph.run() +print(result) + +# ************************************************ +# Get graph execution info +# ************************************************ + +graph_exec_info = search_graph.get_execution_info() +print(prettify_exec_info(graph_exec_info)) From 772e064c55f38ea296511f737dec9a412e0dbf4e Mon Sep 17 00:00:00 2001 From: Lorenzo Padoan Date: Fri, 10 May 2024 10:06:21 +0200 Subject: [PATCH 07/19] docs: Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b017bcd2..868f4b3f 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,10 @@ Just say which information you want to extract and the library will do it for yo Scrapegraph-ai Logo

+[![My Skills](https://skillicons.dev/icons?i=discord)](https://discord.gg/gkxQDAjfeX) +[![My Skills](https://skillicons.dev/icons?i=linkedin)](https://www.linkedin.com/company/scrapegraphai/) +[![My Skills](https://skillicons.dev/icons?i=twitter)](https://twitter.com/scrapegraphai) + ## πŸš€ Quick install @@ -242,10 +246,6 @@ Feel free to contribute and join our Discord server to discuss with us improveme Please see the [contributing guidelines](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/CONTRIBUTING.md). -[![My Skills](https://skillicons.dev/icons?i=discord)](https://discord.gg/gkxQDAjfeX) -[![My Skills](https://skillicons.dev/icons?i=linkedin)](https://www.linkedin.com/company/scrapegraphai/) -[![My Skills](https://skillicons.dev/icons?i=twitter)](https://twitter.com/scrapegraphai) - ## πŸ“ˆ Roadmap Check out the project roadmap [here](https://github.com/VinciGit00/Scrapegraph-ai/blob/main/docs/README.md)! πŸš€ From 82318b9fc89f6d57a1da795de4c7b75841d20e33 Mon Sep 17 00:00:00 2001 From: VinciGit00 Date: Fri, 10 May 2024 10:19:34 +0200 Subject: [PATCH 08/19] add sponsor --- README.md | 6 +++++- docs/assets/serp_api_logo.png | Bin 0 -> 38213 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/assets/serp_api_logo.png diff --git a/README.md b/README.md index b017bcd2..c7c8b4bc 100644 --- a/README.md +++ b/README.md @@ -168,7 +168,6 @@ result = smart_scraper_graph.run() print(result) ``` - ### Case 5: Extracting information using Azure ```python from langchain_openai import AzureChatOpenAI @@ -265,6 +264,11 @@ If you have used our library for research purposes please quote us with the foll note = {A Python library for scraping leveraging large language models} } ``` +## Sponsors +

+ Scrapegraph-ai Logo +

+ ## Authors diff --git a/docs/assets/serp_api_logo.png b/docs/assets/serp_api_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cafdafab4af0f6067c29e88e02e5fdd0597e5550 GIT binary patch literal 38213 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 literal 0 HcmV?d00001 From 67b8a145925b89456b8cd6278520aa6f0b3b71a0 Mon Sep 17 00:00:00 2001 From: VinciGit00 Date: Fri, 10 May 2024 10:21:10 +0200 Subject: [PATCH 09/19] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 4f9eb3d7..ebafb81c 100644 --- a/README.md +++ b/README.md @@ -266,10 +266,9 @@ If you have used our library for research purposes please quote us with the foll ``` ## Sponsors

- Scrapegraph-ai Logo + Scrapegraph-ai Logo

- ## Authors

From f8d8d71589ffc9ccde13259b50d309c7949beeb8 Mon Sep 17 00:00:00 2001 From: Marco Perini Date: Fri, 10 May 2024 10:42:10 +0200 Subject: [PATCH 10/19] docs: updated sponsor logo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ebafb81c..b1ad7322 100644 --- a/README.md +++ b/README.md @@ -266,13 +266,13 @@ If you have used our library for research purposes please quote us with the foll ``` ## Sponsors

- Scrapegraph-ai Logo + SerpAPI

## Authors

- Authors Logos + Authors_logos

| | Contact Info | From 702e913193e23972f172d3afbe3c09693192df4a Mon Sep 17 00:00:00 2001 From: Marco Vinciguerra <88108002+VinciGit00@users.noreply.github.com> Date: Fri, 10 May 2024 11:58:22 +0200 Subject: [PATCH 11/19] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b1ad7322..719ecd50 100644 --- a/README.md +++ b/README.md @@ -252,6 +252,10 @@ Wanna visualize the roadmap in a more interactive way? Check out the [markmap](h ## ❀️ Contributors [![Contributors](https://contrib.rocks/image?repo=VinciGit00/Scrapegraph-ai)](https://github.com/VinciGit00/Scrapegraph-ai/graphs/contributors) +## Sponsors +

+ SerpAPI +

## πŸŽ“ Citations If you have used our library for research purposes please quote us with the following reference: @@ -264,10 +268,6 @@ If you have used our library for research purposes please quote us with the foll note = {A Python library for scraping leveraging large language models} } ``` -## Sponsors -

- SerpAPI -

## Authors From 198420c505544c88805e719e2fc864f061c7de05 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Fri, 10 May 2024 14:17:53 +0200 Subject: [PATCH 12/19] docs: update instructions to use with LocalAI --- README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/README.md b/README.md index 719ecd50..47e3beb7 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,36 @@ The output for all 3 the cases will be a dictionary with the extracted informati } ``` +### Case 7: Extract informations with LocalAI + +For LocalAI, the OpenAI client can be used by specifing a "fake" `OPENAI_API_KEY` ( there is no need to specify a real OpenAI key ): + +```python +from scrapegraphai.graphs import SmartScraperGraph + +# Note: You can actually leave as-is +OPENAI_API_KEY = "YOUR_API_KEY" + +graph_config = { + "llm": { + "api_key": OPENAI_API_KEY, + "model": "gpt-4", + "temperature": 0, + "base_url": "http://localhost:8080", + }, +} + +smart_scraper_graph = SmartScraperGraph( + prompt="List me all the articles", + # also accepts a string with the already downloaded HTML code + source="https://perinim.github.io/projects", + config=graph_config +) + +result = smart_scraper_graph.run() +print(result) +``` + ## 🀝 Contributing Feel free to contribute and join our Discord server to discuss with us improvements and give us suggestions! From 86be41ec6c757dd51391d549523d66803a6710dc Mon Sep 17 00:00:00 2001 From: Marco Perini Date: Fri, 10 May 2024 14:37:10 +0200 Subject: [PATCH 13/19] Revert "docs: update instructions to use with LocalAI" --- README.md | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/README.md b/README.md index 47e3beb7..719ecd50 100644 --- a/README.md +++ b/README.md @@ -239,36 +239,6 @@ The output for all 3 the cases will be a dictionary with the extracted informati } ``` -### Case 7: Extract informations with LocalAI - -For LocalAI, the OpenAI client can be used by specifing a "fake" `OPENAI_API_KEY` ( there is no need to specify a real OpenAI key ): - -```python -from scrapegraphai.graphs import SmartScraperGraph - -# Note: You can actually leave as-is -OPENAI_API_KEY = "YOUR_API_KEY" - -graph_config = { - "llm": { - "api_key": OPENAI_API_KEY, - "model": "gpt-4", - "temperature": 0, - "base_url": "http://localhost:8080", - }, -} - -smart_scraper_graph = SmartScraperGraph( - prompt="List me all the articles", - # also accepts a string with the already downloaded HTML code - source="https://perinim.github.io/projects", - config=graph_config -) - -result = smart_scraper_graph.run() -print(result) -``` - ## 🀝 Contributing Feel free to contribute and join our Discord server to discuss with us improvements and give us suggestions! From 04a4d84b69cd7106ead483169f61728e21de556c Mon Sep 17 00:00:00 2001 From: VinciGit00 Date: Sat, 11 May 2024 09:44:20 +0200 Subject: [PATCH 14/19] Update serp_api_logo.png --- docs/assets/serp_api_logo.png | Bin 38213 -> 15508 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/serp_api_logo.png b/docs/assets/serp_api_logo.png index cafdafab4af0f6067c29e88e02e5fdd0597e5550..ff2f1b01096d8200defc6d914137433a3820f02a 100644 GIT binary patch literal 15508 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

B!gF>AoKXJ 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 From 25637734479a0da293860cf404a618eb5f49c7e2 Mon Sep 17 00:00:00 2001 From: Lorenzo Padoan Date: Sat, 11 May 2024 10:13:41 +0200 Subject: [PATCH 15/19] fix: crash asyncio due dependency version --- pyproject.toml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 498ac4c0..70c1d268 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,24 +25,24 @@ classifiers = [ [tool.poetry.dependencies] python = "^3.9" langchain = "0.1.15" -langchain-openai = "^0.1.6" -langchain-google-genai = "^1.0.3" -langchain-groq = "^0.1.3" -langchain-aws = "^0.1.3" -langchain-anthropic = "^0.1.11" -html2text = "^2024.2.26" -faiss-cpu = "^1.8.0" -beautifulsoup4 = "^4.12.3" -pandas = "^2.2.2" -python-dotenv = "^1.0.1" -tiktoken = "^0.6.0" -tqdm = "^4.66.4" -graphviz = "^0.20.3" -minify-html = "^0.15.0" -free-proxy = "^1.1.1" -playwright = "^1.43.0" -google = "^3.0.0" -yahoo-search-py = "^0.3" +langchain-openai = "0.1.6" +langchain-google-genai = "1.0.3" +langchain-groq = "0.1.3" +langchain-aws = "0.1.3" +langchain-anthropic = "0.1.11" +html2text = "2024.2.26" +faiss-cpu = "1.8.0" +beautifulsoup4 = "4.12.3" +pandas = "2.2.2" +python-dotenv = "1.0.1" +tiktoken = "0.6.0" +tqdm = "4.66.4" +graphviz = "0.20.3" +minify-html = "0.15.0" +free-proxy = "1.1.1" +playwright = "1.43.0" +google = "3.0.0" +yahoo-search-py = "0.3" [tool.poetry.dev-dependencies] pytest = "8.0.0" From d359814c4a640aa1e3bcde3f3bb3688b03f608d9 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 11 May 2024 08:17:32 +0000 Subject: [PATCH 16/19] ci(release): 0.10.1 [skip ci] ## [0.10.1](https://github.com/VinciGit00/Scrapegraph-ai/compare/v0.10.0...v0.10.1) (2024-05-11) ### Bug Fixes * crash asyncio due dependency version ([2563773](https://github.com/VinciGit00/Scrapegraph-ai/commit/25637734479a0da293860cf404a618eb5f49c7e2)) ### Docs * fixed speechgraphexample ([4bf90f3](https://github.com/VinciGit00/Scrapegraph-ai/commit/4bf90f32a8fbb5a06279ec3002200961458a1250)) * fixed unused param and install ([cc28d5a](https://github.com/VinciGit00/Scrapegraph-ai/commit/cc28d5a64f6e0e061f697262302403db875bc6fe)) * **readme:** improve main readme ([ae5655f](https://github.com/VinciGit00/Scrapegraph-ai/commit/ae5655fdde810e80d20d7918b0b2232e29ee3f56)) * update instructions to use with LocalAI ([198420c](https://github.com/VinciGit00/Scrapegraph-ai/commit/198420c505544c88805e719e2fc864f061c7de05)) * Update README.md ([772e064](https://github.com/VinciGit00/Scrapegraph-ai/commit/772e064c55f38ea296511f737dec9a412e0dbf4e)) * updated sponsor logo ([f8d8d71](https://github.com/VinciGit00/Scrapegraph-ai/commit/f8d8d71589ffc9ccde13259b50d309c7949beeb8)) --- CHANGELOG.md | 17 +++++++++++++++++ pyproject.toml | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ea0c69..2961751f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +## [0.10.1](https://github.com/VinciGit00/Scrapegraph-ai/compare/v0.10.0...v0.10.1) (2024-05-11) + + +### Bug Fixes + +* crash asyncio due dependency version ([2563773](https://github.com/VinciGit00/Scrapegraph-ai/commit/25637734479a0da293860cf404a618eb5f49c7e2)) + + +### Docs + +* fixed speechgraphexample ([4bf90f3](https://github.com/VinciGit00/Scrapegraph-ai/commit/4bf90f32a8fbb5a06279ec3002200961458a1250)) +* fixed unused param and install ([cc28d5a](https://github.com/VinciGit00/Scrapegraph-ai/commit/cc28d5a64f6e0e061f697262302403db875bc6fe)) +* **readme:** improve main readme ([ae5655f](https://github.com/VinciGit00/Scrapegraph-ai/commit/ae5655fdde810e80d20d7918b0b2232e29ee3f56)) +* update instructions to use with LocalAI ([198420c](https://github.com/VinciGit00/Scrapegraph-ai/commit/198420c505544c88805e719e2fc864f061c7de05)) +* Update README.md ([772e064](https://github.com/VinciGit00/Scrapegraph-ai/commit/772e064c55f38ea296511f737dec9a412e0dbf4e)) +* updated sponsor logo ([f8d8d71](https://github.com/VinciGit00/Scrapegraph-ai/commit/f8d8d71589ffc9ccde13259b50d309c7949beeb8)) + ## [0.10.0](https://github.com/VinciGit00/Scrapegraph-ai/compare/v0.9.0...v0.10.0) (2024-05-08) diff --git a/pyproject.toml b/pyproject.toml index 70c1d268..2219ec7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "scrapegraphai" -version = "0.10.0" +version = "0.10.1" description = "A web scraping library based on LangChain which uses LLM and direct graph logic to create scraping pipelines." authors = [ From 76b0e39db03af2cfc6763b4192ddb9831baddd69 Mon Sep 17 00:00:00 2001 From: VinciGit00 Date: Sat, 11 May 2024 12:23:50 +0200 Subject: [PATCH 17/19] update tests --- tests/nodes/fetch_node_test.py | 13 ++++--------- tests/nodes/robot_node_test.py | 5 ----- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/tests/nodes/fetch_node_test.py b/tests/nodes/fetch_node_test.py index 811c2daf..a67f3dbb 100644 --- a/tests/nodes/fetch_node_test.py +++ b/tests/nodes/fetch_node_test.py @@ -1,5 +1,5 @@ """ -Module for testinh robot_node +Module for testinh fetch_node """ import pytest from scrapegraphai.nodes import FetchNode @@ -14,7 +14,7 @@ def setup(): # Define the node # ************************************************ - robots_node = FetchNode( + fetch_node = FetchNode( input="url | local_dir", output=["doc"], node_config={ @@ -22,14 +22,14 @@ def setup(): } ) - return robots_node + return fetch_node # ************************************************ # Test the node # ************************************************ -def test_robots_node(setup): +def test_fetch_node(setup): """ Run the tests """ @@ -40,8 +40,3 @@ def test_robots_node(setup): result = setup.execute(state) assert result is not None - - -# If you need to run this script directly -if __name__ == "__main__": - pytest.main() diff --git a/tests/nodes/robot_node_test.py b/tests/nodes/robot_node_test.py index cae3a895..084522c4 100644 --- a/tests/nodes/robot_node_test.py +++ b/tests/nodes/robot_node_test.py @@ -55,8 +55,3 @@ def test_robots_node(setup): result = setup.execute(state) assert result is not None - - -# If you need to run this script directly -if __name__ == "__main__": - pytest.main() From 03e329d2192f536336f6cab80435faa7876a7cdf Mon Sep 17 00:00:00 2001 From: JGalego Date: Mon, 13 May 2024 11:06:33 +0100 Subject: [PATCH 18/19] Added missing classes and fixed anthropic branch --- scrapegraphai/graphs/abstract_graph.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scrapegraphai/graphs/abstract_graph.py b/scrapegraphai/graphs/abstract_graph.py index 3f9eee24..5f2f9865 100644 --- a/scrapegraphai/graphs/abstract_graph.py +++ b/scrapegraphai/graphs/abstract_graph.py @@ -3,10 +3,11 @@ """ from abc import ABC, abstractmethod from typing import Optional +from langchain_aws import BedrockEmbeddings from langchain_openai import AzureOpenAIEmbeddings, OpenAIEmbeddings from langchain_community.embeddings import HuggingFaceHubEmbeddings, OllamaEmbeddings from ..helpers import models_tokens -from ..models import AzureOpenAI, Bedrock, Gemini, Groq, HuggingFace, Ollama, OpenAI, Anthropic +from ..models import Anthropic, AzureOpenAI, Bedrock, Gemini, Groq, HuggingFace, Ollama, OpenAI, Anthropic from langchain_google_genai.embeddings import GoogleGenerativeAIEmbeddings @@ -146,12 +147,12 @@ def _create_llm(self, llm_config: dict, chat=False) -> object: except KeyError as exc: raise KeyError("Model not supported") from exc return Gemini(llm_params) - elif "claude" in llm_params["model"]: + elif llm_params["model"].startswith("claude"): try: self.model_token = models_tokens["claude"][llm_params["model"]] except KeyError as exc: raise KeyError("Model not supported") from exc - return Claude(llm_params) + return Anthropic(llm_params) elif "ollama" in llm_params["model"]: llm_params["model"] = llm_params["model"].split("/")[-1] From 80951055797207ae7c439b3f8e8b1cb8ac66bc01 Mon Sep 17 00:00:00 2001 From: JGalego Date: Mon, 13 May 2024 12:14:24 +0100 Subject: [PATCH 19/19] Removed double import --- scrapegraphai/graphs/abstract_graph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scrapegraphai/graphs/abstract_graph.py b/scrapegraphai/graphs/abstract_graph.py index 5f2f9865..d1d5dd3a 100644 --- a/scrapegraphai/graphs/abstract_graph.py +++ b/scrapegraphai/graphs/abstract_graph.py @@ -7,7 +7,7 @@ from langchain_openai import AzureOpenAIEmbeddings, OpenAIEmbeddings from langchain_community.embeddings import HuggingFaceHubEmbeddings, OllamaEmbeddings from ..helpers import models_tokens -from ..models import Anthropic, AzureOpenAI, Bedrock, Gemini, Groq, HuggingFace, Ollama, OpenAI, Anthropic +from ..models import Anthropic, AzureOpenAI, Bedrock, Gemini, Groq, HuggingFace, Ollama, OpenAI from langchain_google_genai.embeddings import GoogleGenerativeAIEmbeddings