js-web-scraper 20260721175813.dev0__tar.gz → 20260801155736.dev0__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.
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/PKG-INFO +2 -2
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/pyproject.toml +2 -2
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/email_sender.py +1 -1
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/healthcheck.py +2 -1
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/PKG-INFO +2 -2
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/requires.txt +1 -1
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/main.py +3 -3
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/diff.py +3 -3
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/generic.py +12 -13
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/healthcheck.py +3 -1
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/LICENSE +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/README.md +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/setup.cfg +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/__init__.py +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/SOURCES.txt +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/dependency_links.txt +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/top_level.txt +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/__init__.py +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/cars_com.py +2 -2
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/text.py +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/__init__.py +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/logging.py +0 -0
- {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/tests/test_startup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: js-web-scraper
|
|
3
|
-
Version:
|
|
3
|
+
Version: 20260801155736.dev0
|
|
4
4
|
Summary: Customizable Web Scrapper to get alerts when criteria is met on web sites.
|
|
5
5
|
Author-email: jnstockley <jnstockley@users.noreply.github.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/jnstockley/web-scraper
|
|
@@ -12,7 +12,7 @@ Requires-Python: <4.0,>=3.13
|
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: beautifulsoup4==4.15.0
|
|
15
|
-
Requires-Dist: pandas==3.0.
|
|
15
|
+
Requires-Dist: pandas==3.0.5
|
|
16
16
|
Requires-Dist: python-dotenv==1.2.2
|
|
17
17
|
Requires-Dist: tls-client==1.0.1
|
|
18
18
|
Dynamic: license-file
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "js-web-scraper"
|
|
3
|
-
version = "
|
|
3
|
+
version = "20260801155736.dev"
|
|
4
4
|
description = "Customizable Web Scrapper to get alerts when criteria is met on web sites."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.13, <4.0"
|
|
7
7
|
dependencies = [
|
|
8
8
|
"beautifulsoup4==4.15.0",
|
|
9
|
-
"pandas==3.0.
|
|
9
|
+
"pandas==3.0.5",
|
|
10
10
|
"python-dotenv==1.2.2",
|
|
11
11
|
"tls-client==1.0.1",
|
|
12
12
|
]
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/email_sender.py
RENAMED
|
@@ -34,7 +34,7 @@ def send_email_str(text: str):
|
|
|
34
34
|
__send_email__("Tesla NACS Website Update", html)
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
def __send_email__(subject: str, html: str, attachment: StringIO = None):
|
|
37
|
+
def __send_email__(subject: str, html: str, attachment: StringIO | None = None):
|
|
38
38
|
load_dotenv()
|
|
39
39
|
sender_email = os.environ["SENDER_EMAIL"]
|
|
40
40
|
from_email = os.environ["FROM_EMAIL"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: js-web-scraper
|
|
3
|
-
Version:
|
|
3
|
+
Version: 20260801155736.dev0
|
|
4
4
|
Summary: Customizable Web Scrapper to get alerts when criteria is met on web sites.
|
|
5
5
|
Author-email: jnstockley <jnstockley@users.noreply.github.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/jnstockley/web-scraper
|
|
@@ -12,7 +12,7 @@ Requires-Python: <4.0,>=3.13
|
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: beautifulsoup4==4.15.0
|
|
15
|
-
Requires-Dist: pandas==3.0.
|
|
15
|
+
Requires-Dist: pandas==3.0.5
|
|
16
16
|
Requires-Dist: python-dotenv==1.2.2
|
|
17
17
|
Requires-Dist: tls-client==1.0.1
|
|
18
18
|
Dynamic: license-file
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import time
|
|
2
1
|
import os
|
|
3
2
|
import sys
|
|
3
|
+
import time
|
|
4
4
|
|
|
5
5
|
from dotenv import load_dotenv
|
|
6
6
|
|
|
7
|
-
from src.scrapers import
|
|
7
|
+
from src.scrapers import cars_com, diff, text
|
|
8
8
|
from util.healthcheck import healthcheck
|
|
9
9
|
from util.logging import logger
|
|
10
10
|
|
|
@@ -23,7 +23,7 @@ def main():
|
|
|
23
23
|
logger.info(f"Checking URL: {url} for text: {scrape_text}")
|
|
24
24
|
text.scrape(url, scrape_text)
|
|
25
25
|
case "diff":
|
|
26
|
-
percentage = float(os.environ.get("PERCENTAGE", 10))
|
|
26
|
+
percentage = float(os.environ.get("PERCENTAGE", "10"))
|
|
27
27
|
logger.info("Using diff scraper")
|
|
28
28
|
logger.info(f"Checking URL: {url}")
|
|
29
29
|
diff.scrape(url, percentage)
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/diff.py
RENAMED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from difflib import ndiff
|
|
2
|
+
|
|
1
3
|
from src.email_sender import send_email_str
|
|
2
4
|
from src.scrapers import generic
|
|
3
5
|
from src.scrapers.generic import (
|
|
@@ -5,8 +7,6 @@ from src.scrapers.generic import (
|
|
|
5
7
|
save_data_compressed,
|
|
6
8
|
save_healthcheck_file,
|
|
7
9
|
)
|
|
8
|
-
from difflib import ndiff
|
|
9
|
-
|
|
10
10
|
from src.util.logging import logger
|
|
11
11
|
|
|
12
12
|
|
|
@@ -34,7 +34,7 @@ def scrape(url: str, percentage: float = 10):
|
|
|
34
34
|
|
|
35
35
|
def compare(old: str, new: str) -> float:
|
|
36
36
|
diff = list(ndiff(old.splitlines(), new.splitlines()))
|
|
37
|
-
changes = sum(1 for line in diff if line.startswith("+ "
|
|
37
|
+
changes = sum(1 for line in diff if line.startswith(("+ ", "- ")))
|
|
38
38
|
total_lines = max(len(old.splitlines()), len(new.splitlines()))
|
|
39
39
|
difference_percentage = (changes / total_lines) * 100 if total_lines > 0 else 0
|
|
40
40
|
logger.debug(
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/generic.py
RENAMED
|
@@ -5,12 +5,11 @@ from typing import Literal
|
|
|
5
5
|
|
|
6
6
|
import pandas as pd
|
|
7
7
|
import tls_client
|
|
8
|
-
from typing_extensions import Optional, Union
|
|
9
8
|
|
|
10
9
|
from src.util.logging import logger
|
|
11
10
|
|
|
12
11
|
|
|
13
|
-
def create_tls_session(proxy: str = None) -> tls_client.Session:
|
|
12
|
+
def create_tls_session(proxy: str | None = None) -> tls_client.Session:
|
|
14
13
|
"""
|
|
15
14
|
Create a TLS session with the given proxy, if applicable.
|
|
16
15
|
:param proxy: Proxy string in the format https://user:pass@ip:port
|
|
@@ -30,15 +29,15 @@ def make_tls_request(
|
|
|
30
29
|
method: Literal["GET", "POST", "PUT", "DELETE"],
|
|
31
30
|
url: str,
|
|
32
31
|
session: tls_client.Session,
|
|
33
|
-
params:
|
|
34
|
-
data:
|
|
35
|
-
headers:
|
|
36
|
-
cookies:
|
|
37
|
-
json:
|
|
38
|
-
allow_redirects:
|
|
39
|
-
insecure_skip_verify:
|
|
40
|
-
timeout_seconds:
|
|
41
|
-
proxy:
|
|
32
|
+
params: dict | None = None,
|
|
33
|
+
data: str | dict | None = None,
|
|
34
|
+
headers: dict | None = None,
|
|
35
|
+
cookies: dict | None = None,
|
|
36
|
+
json: dict | None = None,
|
|
37
|
+
allow_redirects: bool | None = False,
|
|
38
|
+
insecure_skip_verify: bool | None = False,
|
|
39
|
+
timeout_seconds: int | None = None,
|
|
40
|
+
proxy: dict | None = None,
|
|
42
41
|
):
|
|
43
42
|
"""
|
|
44
43
|
Make a TLS request with the given parameters.
|
|
@@ -75,9 +74,9 @@ def make_tls_request(
|
|
|
75
74
|
if "application/json" in response_headers.get("Content-Type", ""):
|
|
76
75
|
try:
|
|
77
76
|
return response.json()
|
|
78
|
-
except ValueError
|
|
77
|
+
except ValueError:
|
|
79
78
|
logger.error("Response content is not valid JSON")
|
|
80
|
-
raise
|
|
79
|
+
raise
|
|
81
80
|
return response.content.decode(encoding="utf-8")
|
|
82
81
|
|
|
83
82
|
raise ConnectionError(f"Request failed with status code {response.status_code}")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/__init__.py
RENAMED
|
File without changes
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/text.py
RENAMED
|
File without changes
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/__init__.py
RENAMED
|
File without changes
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/logging.py
RENAMED
|
File without changes
|
{js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/tests/test_startup.py
RENAMED
|
File without changes
|