Skrypt pobierający oferty pracy z Linkedin i pracuj.pl

Odpowiedz Nowy wątek
2020-02-09 12:41

Rejestracja: 7 miesięcy temu

Ostatnio: 6 miesięcy temu

0

Witam,
Właśnie skończyłem pisać skrypt Python, który pobiera oferty pracy z serwisów linkedin i pracuj.pl, zapisuje je w lokalnej bazie danych i wyświetla nowe oferty przy pomocy C# windows form.
Zamysł jest taki, że skrypt jest zaplanowany w Task Schedulerze i co jakiś czas przeszkuje serwisy.
Czy ktoś miałby ochotę dokonać recenzji projektu?
https://github.com/JakubKrk/JobAlert
Z góry dziękuję !

edytowany 1x, ostatnio: JaluJakub, 2020-02-09 12:42

Pozostało 580 znaków

2020-02-09 22:13

Rejestracja: 2 lata temu

Ostatnio: 2 miesiące temu

3

W kodzie jest bardzo dużo pomniejszych błędów, które bardzo szybko dostrzeżesz jeśli zaczniesz sobie zadawać jedno pytanie - jak to przetestować? To jest bardzo dobre pytanie, to jest również pytanie które pozwoli Ci odróżnić tylko "działący" kod od kodu z jakim docelowo chce pracować dobry programista. Poniżej wybrałem dwa przypadki zasługujące na osobny komentarz:

Pomijanie klasy wyjątku to zła praktyka. Bez określenia typu wyjątku, blok except złapie każdy wyjątek, a nie każdy wyjątek jest spodziewany więc jeśli oddasz kontrolę sterowania niespodziewanym wyjątkom to wyciszysz błędy i tylko utrudnisz sobie pracę nad debugowaniem. Dopisuj nazwy wyjątków. Nie muszą to być konkretnie te same wyjątki, które widzisz w tracebacku, czasem warto łapać ogólne błędy (w tym celu zajrzyj do dokumentacji wybranej biblioteki).

Próba ukrycia całej interakcji z bazą w jednej klasie to pomysł tylko na krótką metę. Jeśli będziesz miał więcej tabel i logiki to Twój wrapper tylko utrudni Ci pracę. Taki kod nie służy klasom (przeciwieństwo SOLID), ani spójności danym (transakcje). W przypadku tej aplikacji zastanawiam się czemu nie zapisujesz wyników do plików CSV. Ten zrzut z pewnością byłby prostszy i lepszy niż próby zapisu w których spodziewasz się kolizji z kluczem głównym (link).

Wykorzystanie bazy danych w tym projekcie ma też dla mnie wartość dydaktyczną. Czy w twojej opinii jest to zbytnie "przedobrzenie", czy nie jest aż tak rażące, jeśli wiadomo, że projekt służy edukacji? I jak powinna być zrealizowana interakcja z tablicą jeśli wykorzystanie klasy jest zbyt kłopotliwa? Za twoją radą, chcę teraz poprawić wszystkie klasy wyjątków. Zastanawiam się jednak, jak napisać test dla aplikacji web-scrapingowej. Wykorzystując spreparowane wycinki HTML zawierające różne możliwości błędu ? Czy da się zrobić to prościej ? - JaluJakub 2020-02-10 10:33

Pozostało 580 znaków

2020-02-10 11:51

Rejestracja: 2 lata temu

Ostatnio: 2 miesiące temu

Wykorzystanie bazy danych w tym projekcie ma też dla mnie wartość dydaktyczną. Czy w twojej opinii jest to zbytnie "przedobrzenie", czy nie jest aż tak rażące, jeśli wiadomo, że projekt służy edukacji? I jak powinna być zrealizowana interakcja z tablicą jeśli wykorzystanie klasy jest zbyt kłopotliwa?

Nie napisałem, że realizacja zadań z bazą poprzez klasy jest zła (w codziennej pracy tego typu rzecz upraszcza pisanie żmudnych rzeczy: peewee / SQLAlchemy / django orm). Zwróciłem uwagę, że sprowadzenie całej interakcji z bazą do jednej klasy to jest problem. Twoja klasa robi wszystkie zapytania, i przy okazji tworzy tabelki i to jest kod, który będzie sprawiał problemy w utrzymaniu.

Z rzeczy które możesz zrobić to:

  • Wyodrębnij pólę połączeń
  • Oddziel rzeczy związane z DDL.
  • Lepiej zaprojektuj tabelkę (link jako klucz główny to słaby pomysł)
  • Podziel zapytania.
  • Pomyśl o transakcjach.

Ale tak naprawdę powinieneś wcześniej temat lepiej poznać. Przeczytać dobrą książkę o bazach danych [0][1][2][3] i zrozumieć, że baza danych to nie tylko składowisko na dane. Jeśli tego nie zrozumiesz to próby pracy z bazą będą średnio Ci wychodzić.

Kod jaki napisałeś w praktyce lepiej by Ci wyszedł, gdybyś zrobił go bez klas. Natomiast w przypadku klas odrób lekcje i spróbuj zrozumieć fundament na jakich opiera się programowanie obiektowe. Tutaj polecam książkę: [4]

Inaczej użycie wybranego narzędzia mija się z jego przeznaczeniem.

Wykorzystując spreparowane wycinki HTML zawierające różne możliwości błędu ? Czy da się zrobić to prościej ?

Podziel kod na mniejsze funkcje / klasy. Najlepiej takie, które potrafią działać w próżni. Wówczas uzyskasz prostszy kod do testowania. Twoje funkcje charakteryzuje to, że robią za dużo zadań i sprawdzenie czy poprawnie działają zabierze Ci znacznie więcej czasu, a i też utrudni zapis samych testów.

[0] - https://helion.pl/ksiazki/sql[...]er-robson,sqlszp.htm#format/e
[1] - https://helion.pl/ksiazki/rai[...]-dan-chak,raprsy.htm#format/d
[2] - https://helion.pl/ksiazki/100[...]n-russell,100sql.htm#format/e
[3] - https://begriffs.com/posts/20[...]ical-guide-sql-isolation.html
[4] - https://helion.pl/ksiazki/ada[...]lean-hall,adakod.htm#format/d

edytowany 1x, ostatnio: devpython, 2020-02-10 11:53

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0