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.
Files changed (23) hide show
  1. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/PKG-INFO +2 -2
  2. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/pyproject.toml +2 -2
  3. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/email_sender.py +1 -1
  4. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/healthcheck.py +2 -1
  5. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/PKG-INFO +2 -2
  6. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/requires.txt +1 -1
  7. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/main.py +3 -3
  8. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/diff.py +3 -3
  9. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/generic.py +12 -13
  10. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/healthcheck.py +3 -1
  11. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/LICENSE +0 -0
  12. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/README.md +0 -0
  13. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/setup.cfg +0 -0
  14. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/__init__.py +0 -0
  15. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/SOURCES.txt +0 -0
  16. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/dependency_links.txt +0 -0
  17. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/js_web_scraper.egg-info/top_level.txt +0 -0
  18. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/__init__.py +0 -0
  19. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/cars_com.py +2 -2
  20. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/scrapers/text.py +0 -0
  21. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/__init__.py +0 -0
  22. {js_web_scraper-20260721175813.dev0 → js_web_scraper-20260801155736.dev0}/src/util/logging.py +0 -0
  23. {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: 20260721175813.dev0
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.4
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 = "20260721175813.dev"
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.4",
9
+ "pandas==3.0.5",
10
10
  "python-dotenv==1.2.2",
11
11
  "tls-client==1.0.1",
12
12
  ]
@@ -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,4 +1,5 @@
1
1
  import os
2
+ import sys
2
3
 
3
4
  from dotenv import load_dotenv
4
5
 
@@ -19,4 +20,4 @@ if __name__ == "__main__":
19
20
  up_to_date = False
20
21
 
21
22
  if not up_to_date:
22
- exit(1)
23
+ sys.exit(1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: js-web-scraper
3
- Version: 20260721175813.dev0
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.4
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,4 +1,4 @@
1
1
  beautifulsoup4==4.15.0
2
- pandas==3.0.4
2
+ pandas==3.0.5
3
3
  python-dotenv==1.2.2
4
4
  tls-client==1.0.1
@@ -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 text, diff, cars_com
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)
@@ -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("+ ") or 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(
@@ -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: Optional[dict] = None,
34
- data: Optional[Union[str, dict]] = None,
35
- headers: Optional[dict] = None,
36
- cookies: Optional[dict] = None,
37
- json: Optional[dict] = None,
38
- allow_redirects: Optional[bool] = False,
39
- insecure_skip_verify: Optional[bool] = False,
40
- timeout_seconds: Optional[int] = None,
41
- proxy: Optional[dict] = None,
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 as e:
77
+ except ValueError:
79
78
  logger.error("Response content is not valid JSON")
80
- raise e
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}")
@@ -1,6 +1,8 @@
1
+ import sys
2
+
1
3
  from util.logging import logger
2
4
 
3
5
 
4
6
  def healthcheck() -> bool:
5
7
  logger.info("Healthcheck passed!")
6
- exit(0)
8
+ sys.exit(0)
@@ -1,8 +1,8 @@
1
- from dataclasses import dataclass
2
1
  import json
2
+ from dataclasses import dataclass
3
3
 
4
- from bs4 import BeautifulSoup
5
4
  import pandas as pd
5
+ from bs4 import BeautifulSoup
6
6
  from pandas import DataFrame
7
7
 
8
8
  from src.email_sender import send_email