From 0b572260a8f5906b36d3ee8a3e489716f3ca408d Mon Sep 17 00:00:00 2001 From: ZhangJinxuan <2194936226@qq.com> Date: Sun, 31 May 2026 11:50:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=9F=E6=9C=AB=E7=88=AC=E8=99=AB=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE+=E5=AE=9E=E9=AA=8C=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...06050228-张金炫-期末实验报告.docx | Bin 0 -> 193372 bytes 9919d4711bf7a75e286295928b7eb5f0.png | Bin 0 -> 69890 bytes commands/__init__.py | 5 + commands/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 338 bytes .../__pycache__/base_command.cpython-314.pyc | Bin 0 -> 762 bytes .../__pycache__/list_command.cpython-314.pyc | Bin 0 -> 1208 bytes .../scrape_command.cpython-314.pyc | Bin 0 -> 2096 bytes commands/base_command.py | 11 ++ commands/list_command.py | 13 ++ commands/scrape_command.py | 25 ++++ controllers/__init__.py | 3 + .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 239 bytes .../scraper_controller.cpython-314.pyc | Bin 0 -> 7861 bytes controllers/scraper_controller.py | 112 ++++++++++++++ debug_books.py | 21 +++ exceptions/__init__.py | 17 +++ .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 405 bytes .../scraper_exceptions.cpython-314.pyc | Bin 0 -> 2910 bytes exceptions/scraper_exceptions.py | 34 +++++ java-scraper/README.md | 83 +++++++++++ .../scraped_data_20260531_104648.json | 7 + .../scraped_data_20260531_104856.json | 128 ++++++++++++++++ .../scraped_data_20260531_105031.json | 128 ++++++++++++++++ .../scraped_data_20260531_104348.json | 68 +++++++++ .../scraped_data_20260531_104511.json | 7 + .../scraped_data_20260531_104620.json | 68 +++++++++ java-scraper/pom.xml | 50 +++++++ .../src/main/java/com/scraper/Main.java | 108 ++++++++++++++ .../java/com/scraper/command/Command.java | 11 ++ .../java/com/scraper/command/ListCommand.java | 33 +++++ .../com/scraper/command/ScrapeCommand.java | 42 ++++++ .../scraper/controller/ScraperController.java | 138 ++++++++++++++++++ .../scraper/exception/NetworkException.java | 27 ++++ .../com/scraper/exception/ParseException.java | 27 ++++ .../scraper/exception/ScraperException.java | 17 +++ .../scraper/exception/StorageException.java | 27 ++++ .../scraper/exception/StrategyException.java | 27 ++++ .../java/com/scraper/model/ScrapedData.java | 77 ++++++++++ .../java/com/scraper/model/ScrapedItem.java | 57 ++++++++ .../strategy/BooksScraperStrategy.java | 102 +++++++++++++ .../scraper/strategy/NewsScraperStrategy.java | 121 +++++++++++++++ .../com/scraper/strategy/ScraperStrategy.java | 13 ++ .../strategy/TechNewsScraperStrategy.java | 114 +++++++++++++++ .../java/com/scraper/view/ConsoleView.java | 72 +++++++++ .../target/classes/com/scraper/Main.class | Bin 0 -> 5014 bytes .../classes/com/scraper/command/Command.class | Bin 0 -> 231 bytes .../com/scraper/command/ListCommand.class | Bin 0 -> 1025 bytes .../com/scraper/command/ScrapeCommand.class | Bin 0 -> 1454 bytes .../controller/ScraperController.class | Bin 0 -> 6431 bytes .../scraper/exception/NetworkException.class | Bin 0 -> 965 bytes .../scraper/exception/ParseException.class | Bin 0 -> 931 bytes .../scraper/exception/ScraperException.class | Bin 0 -> 622 bytes .../scraper/exception/StorageException.class | Bin 0 -> 937 bytes .../scraper/exception/StrategyException.class | Bin 0 -> 948 bytes .../com/scraper/model/ScrapedData.class | Bin 0 -> 2318 bytes .../com/scraper/model/ScrapedItem.class | Bin 0 -> 1456 bytes .../strategy/BooksScraperStrategy.class | Bin 0 -> 4974 bytes .../strategy/NewsScraperStrategy.class | Bin 0 -> 5364 bytes .../scraper/strategy/ScraperStrategy.class | Bin 0 -> 313 bytes .../strategy/TechNewsScraperStrategy.class | Bin 0 -> 5740 bytes .../com/scraper/view/ConsoleView.class | Bin 0 -> 4105 bytes main.py | 102 +++++++++++++ models/__init__.py | 3 + models/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 253 bytes .../__pycache__/scraped_data.cpython-314.pyc | Bin 0 -> 3252 bytes models/scraped_data.py | 41 ++++++ requirements.txt | 5 + strategies/__init__.py | 11 ++ .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 449 bytes .../__pycache__/base_scraper.cpython-314.pyc | Bin 0 -> 1515 bytes .../__pycache__/news_scraper.cpython-314.pyc | Bin 0 -> 4373 bytes .../quotes_scraper.cpython-314.pyc | Bin 0 -> 3938 bytes .../tech_news_scraper.cpython-314.pyc | Bin 0 -> 4325 bytes strategies/base_scraper.py | 18 +++ strategies/news_scraper.py | 72 +++++++++ strategies/quotes_scraper.py | 67 +++++++++ strategies/tech_news_scraper.py | 81 ++++++++++ views/__init__.py | 3 + views/__pycache__/__init__.cpython-314.pyc | Bin 0 -> 220 bytes .../__pycache__/console_view.cpython-314.pyc | Bin 0 -> 5872 bytes views/console_view.py | 68 +++++++++ 81 files changed, 2264 insertions(+) create mode 100644 202506050228-张金炫-期末实验报告.docx create mode 100644 9919d4711bf7a75e286295928b7eb5f0.png create mode 100644 commands/__init__.py create mode 100644 commands/__pycache__/__init__.cpython-314.pyc create mode 100644 commands/__pycache__/base_command.cpython-314.pyc create mode 100644 commands/__pycache__/list_command.cpython-314.pyc create mode 100644 commands/__pycache__/scrape_command.cpython-314.pyc create mode 100644 commands/base_command.py create mode 100644 commands/list_command.py create mode 100644 commands/scrape_command.py create mode 100644 controllers/__init__.py create mode 100644 controllers/__pycache__/__init__.cpython-314.pyc create mode 100644 controllers/__pycache__/scraper_controller.cpython-314.pyc create mode 100644 controllers/scraper_controller.py create mode 100644 debug_books.py create mode 100644 exceptions/__init__.py create mode 100644 exceptions/__pycache__/__init__.cpython-314.pyc create mode 100644 exceptions/__pycache__/scraper_exceptions.cpython-314.pyc create mode 100644 exceptions/scraper_exceptions.py create mode 100644 java-scraper/README.md create mode 100644 java-scraper/data/books_scraper/scraped_data_20260531_104648.json create mode 100644 java-scraper/data/books_scraper/scraped_data_20260531_104856.json create mode 100644 java-scraper/data/books_scraper/scraped_data_20260531_105031.json create mode 100644 java-scraper/data/news_scraper/scraped_data_20260531_104348.json create mode 100644 java-scraper/data/news_scraper/scraped_data_20260531_104511.json create mode 100644 java-scraper/data/news_scraper/scraped_data_20260531_104620.json create mode 100644 java-scraper/pom.xml create mode 100644 java-scraper/src/main/java/com/scraper/Main.java create mode 100644 java-scraper/src/main/java/com/scraper/command/Command.java create mode 100644 java-scraper/src/main/java/com/scraper/command/ListCommand.java create mode 100644 java-scraper/src/main/java/com/scraper/command/ScrapeCommand.java create mode 100644 java-scraper/src/main/java/com/scraper/controller/ScraperController.java create mode 100644 java-scraper/src/main/java/com/scraper/exception/NetworkException.java create mode 100644 java-scraper/src/main/java/com/scraper/exception/ParseException.java create mode 100644 java-scraper/src/main/java/com/scraper/exception/ScraperException.java create mode 100644 java-scraper/src/main/java/com/scraper/exception/StorageException.java create mode 100644 java-scraper/src/main/java/com/scraper/exception/StrategyException.java create mode 100644 java-scraper/src/main/java/com/scraper/model/ScrapedData.java create mode 100644 java-scraper/src/main/java/com/scraper/model/ScrapedItem.java create mode 100644 java-scraper/src/main/java/com/scraper/strategy/BooksScraperStrategy.java create mode 100644 java-scraper/src/main/java/com/scraper/strategy/NewsScraperStrategy.java create mode 100644 java-scraper/src/main/java/com/scraper/strategy/ScraperStrategy.java create mode 100644 java-scraper/src/main/java/com/scraper/strategy/TechNewsScraperStrategy.java create mode 100644 java-scraper/src/main/java/com/scraper/view/ConsoleView.java create mode 100644 java-scraper/target/classes/com/scraper/Main.class create mode 100644 java-scraper/target/classes/com/scraper/command/Command.class create mode 100644 java-scraper/target/classes/com/scraper/command/ListCommand.class create mode 100644 java-scraper/target/classes/com/scraper/command/ScrapeCommand.class create mode 100644 java-scraper/target/classes/com/scraper/controller/ScraperController.class create mode 100644 java-scraper/target/classes/com/scraper/exception/NetworkException.class create mode 100644 java-scraper/target/classes/com/scraper/exception/ParseException.class create mode 100644 java-scraper/target/classes/com/scraper/exception/ScraperException.class create mode 100644 java-scraper/target/classes/com/scraper/exception/StorageException.class create mode 100644 java-scraper/target/classes/com/scraper/exception/StrategyException.class create mode 100644 java-scraper/target/classes/com/scraper/model/ScrapedData.class create mode 100644 java-scraper/target/classes/com/scraper/model/ScrapedItem.class create mode 100644 java-scraper/target/classes/com/scraper/strategy/BooksScraperStrategy.class create mode 100644 java-scraper/target/classes/com/scraper/strategy/NewsScraperStrategy.class create mode 100644 java-scraper/target/classes/com/scraper/strategy/ScraperStrategy.class create mode 100644 java-scraper/target/classes/com/scraper/strategy/TechNewsScraperStrategy.class create mode 100644 java-scraper/target/classes/com/scraper/view/ConsoleView.class create mode 100644 main.py create mode 100644 models/__init__.py create mode 100644 models/__pycache__/__init__.cpython-314.pyc create mode 100644 models/__pycache__/scraped_data.cpython-314.pyc create mode 100644 models/scraped_data.py create mode 100644 requirements.txt create mode 100644 strategies/__init__.py create mode 100644 strategies/__pycache__/__init__.cpython-314.pyc create mode 100644 strategies/__pycache__/base_scraper.cpython-314.pyc create mode 100644 strategies/__pycache__/news_scraper.cpython-314.pyc create mode 100644 strategies/__pycache__/quotes_scraper.cpython-314.pyc create mode 100644 strategies/__pycache__/tech_news_scraper.cpython-314.pyc create mode 100644 strategies/base_scraper.py create mode 100644 strategies/news_scraper.py create mode 100644 strategies/quotes_scraper.py create mode 100644 strategies/tech_news_scraper.py create mode 100644 views/__init__.py create mode 100644 views/__pycache__/__init__.cpython-314.pyc create mode 100644 views/__pycache__/console_view.cpython-314.pyc create mode 100644 views/console_view.py diff --git a/202506050228-张金炫-期末实验报告.docx b/202506050228-张金炫-期末实验报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..65ba545b312ca4cae56ae5200764fa8f56401d1f GIT binary patch literal 193372 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�`nv6$>qAi=qub=jK(D%YJ~EfiMs>!3J&{o~j56&qCtVtS4xcqB5+m zkOWlvF$WJ#5Z@tt7$*fcCO>V4_>t6vz=);$n~dM=6YvZE`Eg2^nz}u+@u|d?r<>3} zb^SO4eP#yCM)ByspKiDpf1?RM515a3ci6k->AzZ0u_n;apvODS82{$)pUtHmVA793 za~)RSEv<2y@ZI_?Pqz&Ie@XHOZT^=e|4Wkp zhZD!3@6pD+Dj?RZNftzKzorrGsI8*ugkFcv#aFMT{{YS`MWrr5!+*Myf2fU`%$;B! zi(%JgT{)=RK?tV#R9|&aPj8BHP?a}0cQaLSkiXG@e z02>Y+Nprv(fUO25p2~(YT>NP@|B$;lps+2f=H5D+d8sUQdtljStJleIr;CFl*qQVZ z6|bd%rQAk8)(ismTDLF0ik7;)HPqB=Ck;AQH0jPyBeYdp_7@&x(r*@82l4$@3dE_R zqU%AcBk_Zj3l%8~zzR?+!vk3vM|1N~tY02J*O8Q8>+AkG=ba4oZ@--w4|T=f<%zU{)`zm z_V38@>C*X}r!?rrmuY5pw-lL~(oGj_&CzIrzipaRPUvrT0Y1qor@vY`hnBK#M`=;CNDG{7OusA3r6d$AIySH zX;CW3iS16GS9?z7c0Zz7ZF{-3J_crhM{#1Q@t6idu`_2))pMDJpsd{2!iCQkbG_iWq4B$jX0nENOb3VLUN(Km&1f@ZMF&F| z!S%CHzxF^2V5}l%(sEu9DVq|$)1>smz*qt&R0%(7v1bfkO9^;8k3D2?P@riLvhU2> zX)rOwpVcvD+9bpj}O}LG~Wsr$|>v003&jMFPG!M6MLb|ReO7i}pQ8t}a zOBI#&0wteE#lZP; zt!s1&K}`(_BWRvjD(@rZKA8ubH$|V0YK|BqZ(^*hPl@|yGEg1dEo$NE*rUUL=&xu^ z2@8jN)=!Z&(R6C4E7l4|6VX~cLd2M;kn>4RV|ffu(DZI1Wry6@1S)}7pKFn}#$gk- z>pDur%nt111O-g8ll+DvWE-R1t`I(J@x}^d!jD3hUSA1wEgJplRQ@JnH`;;Y)|_Q} z%Mj$;^t;^B?YXK>XY4jWuDP)z{w3PkL8A6}7i$8_T&piwV5e|FZdvr@)qAOB7Q@t# z#AxeDMMgBPPo`-S{xDXldznJBt6qB;H_Jzp0|He*EbXwBjGz+(rHzGwbq(f zcHs}LxzVEUC2jbSeb<7|bUTLpx+O691Z)Ka`3N&oOe7Zen-H9lBaJ^OxGtcC0 zn(S*~)&57DLHT7+*SpYEpW~RW z-4$`xG+W|OjinPRXaSittd#Qd{Q6xWW-S5#Y#+1!?ROxTPNKZsVo{)k7-#7!1mZO% z$}0z$1S}8kJ~RJaOfAjmg)STAS||_|tmvm?CjDeL)|;Z%UYb_?w8~G{RzU3O*e*Sg zxnwL?CTQj6+yKt7SPOa=|FW%j?+scfl_q}a9)~C5Ks;2!N?MiB%kZkPyfV}%A9Uuy z#ulYC-adsaYFORXFciyKzb zx$@`&XNpBI61}tNV&ialdq?Qd-I^oRkTPu^=wJ9}b>C8C@*?Na{K84=E*5Vu*hC?LTmj4^lSEP{1yPvS%>If*g?C8@__2D?w|_g|9^jWfgdn;TNe*;$~&y!FZzvl zsQLMMN#L&m8Y(J=U+;)f-pq;VIln`K>Gtf-KE96uvUp+sRu`nkw2uX}mpB%u)Ov&nB@i~cIg-XyBEATq_uNfM7=paM_@5W!xpbcc=E=nblsqD||h{HYK=YI^@3Bxgok+^`u~#&;vKSsvBP7I-W{j zeg+l(3Lz=^PM?A1R^yMa(u_H$Ngi)yzMwLu* z#1RIm1LFd)_6|YgbHs4Sz2#_+6w^=VQw}pE^s?5M91!w6hB>`{|Je6A2dS}K*v*_4 zr{kQl5*P!ru9=?Mtt|&F48mJD@OP#ah>L)Wkwy`ljbJUm(ct8OhyQ+fgs%b ztf*R|szy@im3ux+{1X@Vs(%b&;vco%uYPZ_=WRcN@7w;$dX&UI3+4xJhH}Tn(PBzm zdjpq6@(I*ih26}$h_e`Qg&%N;b1QcoY_D9kb(i?XoZC@Nd)}U6I=2$C&SZ!DQpOaW z;i_>>WNF8ps|lKkbULiWm0jH@=*7mYX5=oG2jM~$PaGdg3eG^^h<;$j@nYv?!jKcg zNn6i7g0tE+7k4lBxPMM|e0y2bQHrlX%}uA~kw=$X^04+nqmdo2TlXqid>jc+pnE9W zR@;fH9GH7R-NXJM>0z+9;lBL9{dH?8(|6x!%X|A^hUXb~%9g%jU`oq4Src>m$Nt2L z!`eG$EyzpeD>PdNYqN(&z7PzwgpP`e1q{|w9qH-`><_WOhsd**VA?fyCIaFUq7S~)(!+dH&J{=S(z4v*& zpKF9Byr$JBzu2hUTH|@&r)%QFX%4|b+)>qT<1VzES`u#g)hC{6eI?!#&y!YStJ%EkNEyjHb5b9LGR@w4>i^2!{ooTV-LWRDxvxuES;v8U zHjbIH$DUiA&==5q$n@+^#F$=5I>WVB-th)%yf0tXe)~9(V7asDV$q8qMGV3tl`Rup zFIhP2PEtqDBsn(iD`LiZrM0sAEvp6;iqY_Jzln^B^!cQAi5(?2gAZ~bnQ(e3xMZ%J zQWd%tw$7_QePGUtAn2swem{%u(n*!f2etY1-O4FUL>#f02K)_3Z_3s}!jj|Aa=^UUj_k$9%hf zYl4FbG|K?K2RCW}@5)oUYm0|338bM)A_i0M-yV2Z~6?KT$|-heE?f8twqVZT>*9;P593sqIkQxi9Ez55VDn zpeWyFAky2Rn7Mf;w#=8BDjR&a(gNcAXD?*7L*e}%QqRmxO+^E~TT$cz3U5f#zsM=O z9SZH1ONZe=iKzhz**cRTK(;nec-VS+I=b3#JCiPtS5@EvXp$2Z6(gVp<+C}HF8!^> zJUo3|{yh!u}KSU8H1+R_*v*!+Q*S3!P##X=$@D2A(|H4iHKt;t3 P{u2PckH8dA{8ax3iS1rw literal 0 HcmV?d00001 diff --git a/9919d4711bf7a75e286295928b7eb5f0.png b/9919d4711bf7a75e286295928b7eb5f0.png new file mode 100644 index 0000000000000000000000000000000000000000..8acf46229522a2e9d3b6e899c41621be9e53525a GIT binary patch literal 69890 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

08ibls)zDbAIIr|-~oekkarV5Q>aHr<^|gy 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 l5Dx=XM*WQ8VV8@QDa@Q`U%iMVM{{bky6951J literal 0 HcmV?d00001 diff --git a/commands/__init__.py b/commands/__init__.py new file mode 100644 index 0000000..a251377 --- /dev/null +++ b/commands/__init__.py @@ -0,0 +1,5 @@ +from .base_command import Command +from .scrape_command import ScrapeCommand +from .list_command import ListCommand + +__all__ = ['Command', 'ScrapeCommand', 'ListCommand'] diff --git a/commands/__pycache__/__init__.cpython-314.pyc b/commands/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a51c4b14aa8bfafb416993e451723d6da74c94a GIT binary patch literal 338 zcmY%3k~Gl+(&W& zr;xxiIAMyNc*?s2J8%~gb{i6J%ntoJSNVxQfH;Uf=RbZjbiHh1tj>g;OZ&Q*inTOZ zuW`y_B(Jc*7!*rDd8dK$Z^1c?1Cl>%(o~4Pcg=4lzG}Y!6(s?d3|)Iz%;(u+Dp+%a z3~}r&DqBb{aDo9`ve6}i3yjRq3?=Nj`@;w6OCz;OpUXw@u1KFsb8ZWj9;JC^Y$|GL zlTI=tdE*_Z53ViWOR==l^_%JkO@NkH5`2UoQKv)#|7%RQF-b=R8who4`UX-LEEm(l zb=Eb=qZHjE=o8SjQM}c^LgqQ=F>~E(LA*xmJg$1yG<*dC5_1pX z&nMi*xA5jKkA>aRht~Fr*s6u>U+juv^-v@+iUa3o6QSw7)SXt!)t;)+s|`gD>tP@1 cUCg64%r?TxXN-M^!S7a^bw7(MKvQY|1=D7zumAu6 literal 0 HcmV?d00001 diff --git a/commands/__pycache__/list_command.cpython-314.pyc b/commands/__pycache__/list_command.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9e37f8dab10a565491e5bf42424c7798ae63e18 GIT binary patch literal 1208 zcmZWoO>fgc5S?}6#Qg|vDIpcDXi@l(FHxaYD-~2B6}6Wtm?DH)1ud@QQn!w6b{zz# z=75B_0GFIO_uo))04#Ch4-|rEkIXnu39w3LXJ)$a4a=_| zuz2*oEv(QH%Yh$>!1Eko_poSI(x9`1&Lc$JfRLFGDw}GUIS+fV4mX&|O0c65-p&Z3 zWJ(aKW)^MERKxr_gqoQ{(0 zpmxWRdr=V9=4<$IRI|H+$eM=?c^Xy17x6IXmhT6V6*-*8<9!8G`d4xYBa3KGT5t?Z zz4D#RVRWpFf?8?6eM*+QxT~@;Lxe!c0GIw&~Y{c%&bcGNhxV2i1Zv+Hiu9h+Z`YNM7G+ z(3KBz-U#YVk9=%~r%lUCS9H#|T_GdS^|7Zo7h`yq7$-A{CN5(8Vc)nmx1vb6TUfco zLq_`=)OI|NbAyQ?+>lVdom{V=q7p;=}glk zP~&2+ohw_Gbb9S9=*r`vKTk)BEM~e`6Xa2or0sR9TlA8+iaF9+lB!1;#@JUd@b@#P NvBJA+zW}FX<8PtN4$%Mr literal 0 HcmV?d00001 diff --git a/commands/__pycache__/scrape_command.cpython-314.pyc b/commands/__pycache__/scrape_command.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..026b471af0fbbe000eff738e3f237037f8005a22 GIT binary patch literal 2096 zcmZ`)&2JM&6rWkIoiB%cI3`s-{Lw&>D>aCZ29j1dkdR0a1ve=wL@vv+o)m|TcRRC2 zq?bfhrRIQ2FOkZLazdQiN|j1aEu4CcOC*OCJ@p?*8`Plo()VU}9TJ5n`^}p-GryVl zxv724jRff3d);&2g$Vf*Cjo_hVRIOS6*5C|WSopqn&`5l2b3!V}OTbM{?mll8I!fTQ_3O&+DZEh;7pb*KNi}tdhem(_|c!t-kW?ErZ!k z(JC1pgvS+svUv)GkKsj^iA{6FR%Rl0Xg|3@rpQs6qn+e>eNF-1YODAbJDgL2!z=8% zDPq^>BJi3zx7oYPf001}6aPpm{PFRdZvlIct^n|ia^ed@u7b9QT%ZNG_5=D6H~~2A zR{&6P8;zPNZnJQ>?yyf5w30s0G73jHHw0SP7@4*ByzaQonr4`~5QU=QXqrItQcLdO z$WZ>GU|i%USjoC+1vjc`dZ}bNaI>blT{{fy ze|4=6t`a@KUM`U>qK1=yA*=Kq-@x(lw483jIx+C!0pSZ_UcWg6!V0vi>bN5 zdypnmWG)DnH>;uKNFRAfCo?LqhqJr^7&yzbgfme#9k)^FH(5cmb?15}Q^ni6|iIi zz$ghbUmDs2My-%;Flf?WdUcqrnYFEjotQqm=$P*ua7^vYYcSCzy9jnhcBx?cnwxyb z!%ac`;?BL#%i7jbd9ZkYaWyuu8Xb7~ye0X9P=IfbEsy`V5d!gF z@djM``RRevgXHmG)0w8w6ID4A2|bB~LEbxkeuNX)J@!hTL$HQ)bqw7LdukQq>5)&? zLb$El8!bq%8frJ9Uc&sBgf+R>E289x5}Zv!KkFko>}H|QdZ){V!GxGCo905QTq;;4 zHk2wblR2!A`fv;?ScVeI*lqIkGQw`y=Eahep)$Mz6WC)BAln6iw7t^F4Q85}2IgZ4N%Mzgv*K8SlA$0H zz+Qd{7H=uga%JEBI~oahY_+Q4I8Niz9C=_8K3DOe@AqHR1q-@9$E0zaw!b{W`_eSB y;0r2bu}PSR#Dnx&=lh-uPVsjD0;43lfI+HL`UlC#-=P$2D{ttmcp8X&0*|@#{ literal 0 HcmV?d00001 diff --git a/commands/base_command.py b/commands/base_command.py new file mode 100644 index 0000000..742007a --- /dev/null +++ b/commands/base_command.py @@ -0,0 +1,11 @@ +from abc import ABC, abstractmethod + + +class Command(ABC): + @abstractmethod + def execute(self): + pass + + @abstractmethod + def undo(self): + pass diff --git a/commands/list_command.py b/commands/list_command.py new file mode 100644 index 0000000..321205e --- /dev/null +++ b/commands/list_command.py @@ -0,0 +1,13 @@ +from commands.base_command import Command +from controllers import ScraperController + + +class ListCommand(Command): + def __init__(self, controller: ScraperController): + self.controller = controller + + def execute(self): + return self.controller.list_strategies() + + def undo(self): + pass diff --git a/commands/scrape_command.py b/commands/scrape_command.py new file mode 100644 index 0000000..b927cfd --- /dev/null +++ b/commands/scrape_command.py @@ -0,0 +1,25 @@ +from commands.base_command import Command +from controllers import ScraperController +from exceptions import ScraperException + + +class ScrapeCommand(Command): + def __init__(self, controller: ScraperController, strategy_name: str): + self.controller = controller + self.strategy_name = strategy_name + self.scrape_result = None + self.saved_path = None + + def execute(self): + try: + self.scrape_result = self.controller.execute_scrape(self.strategy_name) + self.saved_path = self.controller.save_data(self.scrape_result, self.strategy_name) + return self.scrape_result, self.saved_path + except ScraperException as e: + raise e + + def undo(self): + if self.saved_path and self.controller.delete_data(self.saved_path): + print(f"Successfully undone: deleted {self.saved_path}") + return True + return False diff --git a/controllers/__init__.py b/controllers/__init__.py new file mode 100644 index 0000000..1849940 --- /dev/null +++ b/controllers/__init__.py @@ -0,0 +1,3 @@ +from .scraper_controller import ScraperController + +__all__ = ['ScraperController'] diff --git a/controllers/__pycache__/__init__.cpython-314.pyc b/controllers/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe1396958ace334c7f8a9fa766a8e691044a9540 GIT binary patch literal 239 zcmY%3F^B^LOi;#W2_R!CLlk2GgFAy8V*#T)Lja>LV*yhDlQM%Q zvnJy$!QkYg#Ddf!=lr~qqWqkk)S@DgW2 pKczG$)vkyGXbd9|7YhK156p~=jCUCfA8^ZE;F51*FJc1<0st?=KTrSw literal 0 HcmV?d00001 diff --git a/controllers/__pycache__/scraper_controller.cpython-314.pyc b/controllers/__pycache__/scraper_controller.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b75467873fc63324259a1320508e527a4ca8012 GIT binary patch literal 7861 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 ScraperStrategy: + if name not in self.strategies: + available = ', '.join(self.strategies.keys()) + raise StrategyException( + f"Strategy '{name}' not found. Available: {available}", + strategy_name=name + ) + return self.strategies[name] + + def list_strategies(self) -> List[Dict[str, str]]: + return [ + {"name": s.name, "source": s.source} + for s in self.strategies.values() + ] + + def execute_scrape(self, strategy_name: str) -> ScrapedData: + strategy = self.get_strategy(strategy_name) + return strategy.scrape() + + def save_data(self, data: ScrapedData, strategy_name: str) -> str: + try: + folder_path = os.path.join(self.output_dir, strategy_name) + os.makedirs(folder_path, exist_ok=True) + + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + filename = f"scraped_data_{timestamp}.json" + file_path = os.path.join(folder_path, filename) + + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(data.to_dict(), f, ensure_ascii=False, indent=2) + + return file_path + + except Exception as e: + raise StorageException( + f"Failed to save data to {folder_path}", + file_path=folder_path, + original_exception=e + ) + + def delete_data(self, file_path: str) -> bool: + try: + if os.path.exists(file_path): + os.remove(file_path) + return True + return False + except Exception as e: + raise StorageException( + f"Failed to delete file {file_path}", + file_path=file_path, + original_exception=e + ) + + def load_data(self, strategy_name: str, filename: str = None) -> ScrapedData: + try: + folder_path = os.path.join(self.output_dir, strategy_name) + if not os.path.exists(folder_path): + raise StorageException( + f"No data found for strategy '{strategy_name}'", + file_path=folder_path + ) + + if filename: + file_path = os.path.join(folder_path, filename) + else: + files = sorted([f for f in os.listdir(folder_path) if f.endswith('.json')]) + if not files: + raise StorageException(f"No data files found in {folder_path}") + file_path = os.path.join(folder_path, files[-1]) + + with open(file_path, 'r', encoding='utf-8') as f: + data_dict = json.load(f) + + return data_dict + + except Exception as e: + if isinstance(e, StorageException): + raise e + raise StorageException( + f"Failed to load data", + file_path=file_path if 'file_path' in locals() else None, + original_exception=e + ) diff --git a/debug_books.py b/debug_books.py new file mode 100644 index 0000000..afb6dc5 --- /dev/null +++ b/debug_books.py @@ -0,0 +1,21 @@ +from urllib.request import urlopen, Request +import re + +r = urlopen(Request('https://books.toscrape.com', headers={'User-Agent': 'Mozilla/5.0'})) +html = r.read().decode('utf-8') + +price_search = re.search(r'class="price_color[^"]*"[^>]*>([^<]+)<', html) +if price_search: + print('Found price pattern 1:', price_search.group(1)) +else: + print('Pattern 1 not found') + +price_search2 = re.search(r'price_color">([^<]+)<', html) +if price_search2: + print('Found price pattern 2:', price_search2.group(1)) +else: + print('Pattern 2 not found') + +idx = html.find('price_color') +if idx > 0: + print('Context around price_color:', html[idx-20:idx+50]) diff --git a/exceptions/__init__.py b/exceptions/__init__.py new file mode 100644 index 0000000..8d1a9c5 --- /dev/null +++ b/exceptions/__init__.py @@ -0,0 +1,17 @@ +from .scraper_exceptions import ( + ScraperException, + NetworkException, + ParseException, + ValidationException, + StorageException, + StrategyException +) + +__all__ = [ + 'ScraperException', + 'NetworkException', + 'ParseException', + 'ValidationException', + 'StorageException', + 'StrategyException' +] diff --git a/exceptions/__pycache__/__init__.cpython-314.pyc b/exceptions/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18325d5e397e6572472625fc192344cbc89176ac GIT binary patch literal 405 zcmYk2%}N6?6oqf*w^&-L7K?PD;HrY|>_WtiI&QQK6kU`+2yG~1$0j84r(55_t$W{S z$krDqbkVJewvIROan9v%FE{)3+6LG%AMJ+$0{C)fUEWG8x>mfy0HtsZ2@)vrgqQfj zPXZAnp$L;mM0?O)y(38B7Ku1T2hj04k!kdYk_slTUWZKRj89FY$Mg%Ald@A!sZ^}= z+xIljM%1OtW}~mUq~m|F&AygYv+?XN)az8tmik>t*m|Rq?ilGi1P-A?wT6!_^mS8b&Lf9&Tog!!!!S0V}&1-Shdy8e&#=ilmRB?X* literal 0 HcmV?d00001 diff --git a/exceptions/__pycache__/scraper_exceptions.cpython-314.pyc b/exceptions/__pycache__/scraper_exceptions.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a76f2b5836187ada0216c8bff21de2db9138e4c8 GIT binary patch literal 2910 zcmchZ&2QsG6u@Wfq;cA&yGzNYNfzofT0&a1h%MQ}f?y@!hN6(Fh@z}U#&KJ3-Pp`H zKySSvI811wO;9vBX@ z;;4{GMp({nkUO-5F!n62fukVLnCTcoFeU&J(RKYe`0%5Ly=`G}(fiaIxZk+Fk1cWF zyI$`>50?79#HZ+qaBnZdhyY*XF`^>;a_BSeQl; zcIF$tZ8F36x&779w_vlut!UqU+w@J#alllFOrbhb_yWXEthf+dVeXF}@kO|CGrK=mgjK-4>-Sr0((i;OCT`lBKJsQ%za{ zpPSSQt@G*|XWEJ^AhZI;7%A;G$0G9*J~R%Zf>sn5Ee)c9AQ~YETro3G-wJoQgV$guS{SSjX6Y@+zyo!~Z2%=aynU6up zC{sY(#Vk-Pqr239QWZf|LlC%PW)S6>LEPMe&V+Z%HBrd#+VCFm41YgG;w`Mf^wUtj znrMOn|0E`3D6gF?#TaCWDHzr<1r%j;m%>m-4D}ELu9z9a>dY8!ZTZ~rt-Ygb;!qG# zJo%DNv3LgyF`Y%_rEC)zI#zGOmqP3Owe>Tt64Q`DrqFmBlR&YG{!%nHkj6$x16Q=0 zxgejEEqukx*NYC5@?c4<(%XoH&*8^FpuHb{mVCflpvo_TE)4!uDW#W+N?Si2T@tum rE~>O~T56!uK&5tCyo*W=mFj6_9hE97^=Mfgm5tMtH~)f}FxP(p_^By( literal 0 HcmV?d00001 diff --git a/exceptions/scraper_exceptions.py b/exceptions/scraper_exceptions.py new file mode 100644 index 0000000..422fb6b --- /dev/null +++ b/exceptions/scraper_exceptions.py @@ -0,0 +1,34 @@ +class ScraperException(Exception): + def __init__(self, message, original_exception=None): + super().__init__(message) + self.original_exception = original_exception + + +class NetworkException(ScraperException): + def __init__(self, message, status_code=None, original_exception=None): + super().__init__(message, original_exception) + self.status_code = status_code + + +class ParseException(ScraperException): + def __init__(self, message, selector=None, original_exception=None): + super().__init__(message, original_exception) + self.selector = selector + + +class ValidationException(ScraperException): + def __init__(self, message, field=None, original_exception=None): + super().__init__(message, original_exception) + self.field = field + + +class StorageException(ScraperException): + def __init__(self, message, file_path=None, original_exception=None): + super().__init__(message, original_exception) + self.file_path = file_path + + +class StrategyException(ScraperException): + def __init__(self, message, strategy_name=None, original_exception=None): + super().__init__(message, original_exception) + self.strategy_name = strategy_name diff --git a/java-scraper/README.md b/java-scraper/README.md new file mode 100644 index 0000000..c7d7dca --- /dev/null +++ b/java-scraper/README.md @@ -0,0 +1,83 @@ +# Java Web Scraper + +A complete web scraping application demonstrating: +- **CLI Interface** +- **MVC Architecture** +- **Command Pattern** +- **Strategy Pattern** +- **Custom Exception Hierarchy** + +## Features + +- 3 different scraping strategies: + - `news_scraper` - Scrapes quotes from http://quotes.toscrape.com + - `books_scraper` - Scrapes books from https://books.toscrape.com + - `tech_news_scraper` - Scrapes news from https://www.bbc.com/news +- Saves data to JSON files +- Command-line interface +- Extensible architecture + +## Building + +```bash +cd java-scraper +mvn clean package +``` + +## Usage + +### List available scrapers: +```bash +mvn exec:java -Dexec.mainClass="com.scraper.Main" -Dexec.args="list" +``` + +### Scrape using a specific strategy: +```bash +mvn exec:java -Dexec.mainClass="com.scraper.Main" -Dexec.args="scrape news_scraper" +``` + +### Scrape all: +```bash +mvn exec:java -Dexec.mainClass="com.scraper.Main" -Dexec.args="scrape all" +``` + +### Custom output directory: +```bash +mvn exec:java -Dexec.mainClass="com.scraper.Main" -Dexec.args="scrape news_scraper --output my_data" +``` + +### Using the built JAR: +```bash +java -jar target/java-scraper-1.0-SNAPSHOT.jar list +java -jar target/java-scraper-1.0-SNAPSHOT.jar scrape news_scraper +``` + +## Architecture + +### MVC +- **Model**: `ScrapedItem`, `ScrapedData` +- **View**: `ConsoleView` +- **Controller**: `ScraperController` + +### Command Pattern +- `Command` interface +- `ScrapeCommand` +- `ListCommand` + +### Strategy Pattern +- `ScraperStrategy` interface +- `NewsScraperStrategy` +- `BooksScraperStrategy` +- `TechNewsScraperStrategy` + +### Exception Hierarchy +- `ScraperException` (base) +- `NetworkException` +- `ParseException` +- `StorageException` +- `StrategyException` + +## Requirements + +- Java 11 or higher +- Maven diff --git a/java-scraper/data/books_scraper/scraped_data_20260531_104648.json b/java-scraper/data/books_scraper/scraped_data_20260531_104648.json new file mode 100644 index 0000000..d3a501f --- /dev/null +++ b/java-scraper/data/books_scraper/scraped_data_20260531_104648.json @@ -0,0 +1,7 @@ +{ + "source": "https://books.toscrape.com", + "strategy_name": "books_scraper", + "items": [], + "scraped_at": "2026-05-31T10:46:46.169175", + "total_items": 0 +} \ No newline at end of file diff --git a/java-scraper/data/books_scraper/scraped_data_20260531_104856.json b/java-scraper/data/books_scraper/scraped_data_20260531_104856.json new file mode 100644 index 0000000..4a5702b --- /dev/null +++ b/java-scraper/data/books_scraper/scraped_data_20260531_104856.json @@ -0,0 +1,128 @@ +{ + "source": "https://books.toscrape.com", + "strategy_name": "books_scraper", + "items": [ + { + "title": "A Light in the Attic", + "content": "Price: £51.77", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.489985" + }, + { + "title": "Tipping the Velvet", + "content": "Price: £53.74", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.489997" + }, + { + "title": "Soumission", + "content": "Price: £50.10", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490001" + }, + { + "title": "Sharp Objects", + "content": "Price: £47.82", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490004" + }, + { + "title": "Sapiens: A Brief History of Humankind", + "content": "Price: £54.23", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490005" + }, + { + "title": "The Requiem Red", + "content": "Price: £22.65", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490007" + }, + { + "title": "The Dirty Little Secrets of Getting Your Dream Job", + "content": "Price: £33.34", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490009" + }, + { + "title": "The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull", + "content": "Price: £17.93", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490011" + }, + { + "title": "The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics", + "content": "Price: £22.60", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490012" + }, + { + "title": "The Black Maria", + "content": "Price: £52.15", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490014" + }, + { + "title": "Starving Hearts (Triangular Trade Trilogy, #1)", + "content": "Price: £13.99", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490015" + }, + { + "title": "Shakespeare's Sonnets", + "content": "Price: £20.66", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490017" + }, + { + "title": "Set Me Free", + "content": "Price: £17.46", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490019" + }, + { + "title": "Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)", + "content": "Price: £52.29", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490020" + }, + { + "title": "Rip it Up and Start Again", + "content": "Price: £35.02", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490022" + }, + { + "title": "Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991", + "content": "Price: £57.25", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490023" + }, + { + "title": "Olio", + "content": "Price: £23.88", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490025" + }, + { + "title": "Mesaerion: The Best Science Fiction Stories 1800-1849", + "content": "Price: £37.59", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490035" + }, + { + "title": "Libertarianism for Beginners", + "content": "Price: £51.33", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490037" + }, + { + "title": "It's Only the Himalayas", + "content": "Price: £45.17", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:48:56.490038" + } + ], + "scraped_at": "2026-05-31T10:48:54.348792", + "total_items": 20 +} \ No newline at end of file diff --git a/java-scraper/data/books_scraper/scraped_data_20260531_105031.json b/java-scraper/data/books_scraper/scraped_data_20260531_105031.json new file mode 100644 index 0000000..3ce3946 --- /dev/null +++ b/java-scraper/data/books_scraper/scraped_data_20260531_105031.json @@ -0,0 +1,128 @@ +{ + "source": "https://books.toscrape.com", + "strategy_name": "books_scraper", + "items": [ + { + "title": "A Light in the Attic", + "content": "Price: £51.77", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674011" + }, + { + "title": "Tipping the Velvet", + "content": "Price: £53.74", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674021" + }, + { + "title": "Soumission", + "content": "Price: £50.10", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674024" + }, + { + "title": "Sharp Objects", + "content": "Price: £47.82", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674026" + }, + { + "title": "Sapiens: A Brief History of Humankind", + "content": "Price: £54.23", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674028" + }, + { + "title": "The Requiem Red", + "content": "Price: £22.65", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674029" + }, + { + "title": "The Dirty Little Secrets of Getting Your Dream Job", + "content": "Price: £33.34", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674031" + }, + { + "title": "The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull", + "content": "Price: £17.93", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674032" + }, + { + "title": "The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics", + "content": "Price: £22.60", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674033" + }, + { + "title": "The Black Maria", + "content": "Price: £52.15", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674034" + }, + { + "title": "Starving Hearts (Triangular Trade Trilogy, #1)", + "content": "Price: £13.99", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674035" + }, + { + "title": "Shakespeare's Sonnets", + "content": "Price: £20.66", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674041" + }, + { + "title": "Set Me Free", + "content": "Price: £17.46", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674043" + }, + { + "title": "Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)", + "content": "Price: £52.29", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674044" + }, + { + "title": "Rip it Up and Start Again", + "content": "Price: £35.02", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674045" + }, + { + "title": "Our Band Could Be Your Life: Scenes from the American Indie Underground, 1981-1991", + "content": "Price: £57.25", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674046" + }, + { + "title": "Olio", + "content": "Price: £23.88", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674046" + }, + { + "title": "Mesaerion: The Best Science Fiction Stories 1800-1849", + "content": "Price: £37.59", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674048" + }, + { + "title": "Libertarianism for Beginners", + "content": "Price: £51.33", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674049" + }, + { + "title": "It's Only the Himalayas", + "content": "Price: £45.17", + "url": "https://books.toscrape.com", + "timestamp": "2026-05-31T10:50:31.674050" + } + ], + "scraped_at": "2026-05-31T10:50:29.355948", + "total_items": 20 +} \ No newline at end of file diff --git a/java-scraper/data/news_scraper/scraped_data_20260531_104348.json b/java-scraper/data/news_scraper/scraped_data_20260531_104348.json new file mode 100644 index 0000000..85577c4 --- /dev/null +++ b/java-scraper/data/news_scraper/scraped_data_20260531_104348.json @@ -0,0 +1,68 @@ +{ + "source": "http://quotes.toscrape.com", + "strategy_name": "news_scraper", + "items": [ + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501000" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501016" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501021" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501024" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501026" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501028" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501030" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501032" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501034" + }, + { + "title": "temprop=", + "content": "temprop=", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:43:48.501036" + } + ], + "scraped_at": "2026-05-31T10:43:45.907587", + "total_items": 10 +} \ No newline at end of file diff --git a/java-scraper/data/news_scraper/scraped_data_20260531_104511.json b/java-scraper/data/news_scraper/scraped_data_20260531_104511.json new file mode 100644 index 0000000..2803469 --- /dev/null +++ b/java-scraper/data/news_scraper/scraped_data_20260531_104511.json @@ -0,0 +1,7 @@ +{ + "source": "http://quotes.toscrape.com", + "strategy_name": "news_scraper", + "items": [], + "scraped_at": "2026-05-31T10:45:10.355276", + "total_items": 0 +} \ No newline at end of file diff --git a/java-scraper/data/news_scraper/scraped_data_20260531_104620.json b/java-scraper/data/news_scraper/scraped_data_20260531_104620.json new file mode 100644 index 0000000..2e6b33e --- /dev/null +++ b/java-scraper/data/news_scraper/scraped_data_20260531_104620.json @@ -0,0 +1,68 @@ +{ + "source": "http://quotes.toscrape.com", + "strategy_name": "news_scraper", + "items": [ + { + "title": "Quote by Albert Einstein", + "content": "“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434224" + }, + { + "title": "Quote by J.K. Rowling", + "content": "“It is our choices, Harry, that show what we truly are, far more than our abilities.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434236" + }, + { + "title": "Quote by Albert Einstein", + "content": "“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434250" + }, + { + "title": "Quote by Jane Austen", + "content": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434253" + }, + { + "title": "Quote by Marilyn Monroe", + "content": "“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434255" + }, + { + "title": "Quote by Albert Einstein", + "content": "“Try not to become a man of success. Rather become a man of value.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434257" + }, + { + "title": "Quote by André Gide", + "content": "“It is better to be hated for what you are than to be loved for what you are not.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434259" + }, + { + "title": "Quote by Thomas A. Edison", + "content": "“I have not failed. I've just found 10,000 ways that won't work.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434261" + }, + { + "title": "Quote by Eleanor Roosevelt", + "content": "“A woman is like a tea bag; you never know how strong it is until it's in hot water.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434262" + }, + { + "title": "Quote by Steve Martin", + "content": "“A day without sunshine is like, you know, night.”", + "url": "http://quotes.toscrape.com", + "timestamp": "2026-05-31T10:46:20.434264" + } + ], + "scraped_at": "2026-05-31T10:46:18.193675", + "total_items": 10 +} \ No newline at end of file diff --git a/java-scraper/pom.xml b/java-scraper/pom.xml new file mode 100644 index 0000000..da5c6d7 --- /dev/null +++ b/java-scraper/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.scraper + java-scraper + 1.0-SNAPSHOT + + + 11 + 11 + UTF-8 + + + + + + com.google.code.gson + gson + 2.10.1 + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.0 + + + package + + shade + + + + + com.scraper.Main + + + + + + + + + diff --git a/java-scraper/src/main/java/com/scraper/Main.java b/java-scraper/src/main/java/com/scraper/Main.java new file mode 100644 index 0000000..0c0464c --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/Main.java @@ -0,0 +1,108 @@ +package com.scraper; + +import com.scraper.command.ListCommand; +import com.scraper.command.ScrapeCommand; +import com.scraper.controller.ScraperController; +import com.scraper.exception.ScraperException; +import com.scraper.view.ConsoleView; + +/** + * Main CLI application - Entry point for the scraper + */ +public class Main { + + private ScraperController controller; + private ConsoleView view; + + public Main() { + this.controller = new ScraperController(); + this.view = new ConsoleView(); + } + + public static void main(String[] args) { + Main app = new Main(); + app.run(args); + } + + public void run(String[] args) { + if (args.length == 0) { + printHelp(); + return; + } + + try { + switch (args[0]) { + case "list": + handleList(); + break; + case "scrape": + handleScrape(args); + break; + case "help": + default: + printHelp(); + break; + } + } catch (ScraperException e) { + view.displayError(e.getMessage()); + if (e.getCause() != null) { + view.displayError("Cause: " + e.getCause().getMessage()); + } + System.exit(1); + } catch (Exception e) { + view.displayError("Unexpected error: " + e.getMessage()); + System.exit(1); + } + } + + private void handleList() throws ScraperException { + ListCommand cmd = new ListCommand(controller); + cmd.execute(); + view.displayStrategies(cmd.getStrategies()); + } + + private void handleScrape(String[] args) throws ScraperException { + if (args.length < 2) { + view.displayError("Please specify a scraper to use."); + printHelp(); + return; + } + + String strategyName = args[1]; + String outputDir = "data"; + if (args.length >= 4 && "--output".equals(args[2])) { + outputDir = args[3]; + controller.setOutputDir(outputDir); + } + + if ("all".equals(strategyName)) { + ListCommand listCmd = new ListCommand(controller); + listCmd.execute(); + for (java.util.Map strategy : listCmd.getStrategies()) { + scrapeSingle(strategy.get("name")); + } + } else { + scrapeSingle(strategyName); + } + } + + private void scrapeSingle(String strategyName) throws ScraperException { + ScrapeCommand cmd = new ScrapeCommand(controller, strategyName); + cmd.execute(); + view.displaySuccess("Scraped " + cmd.getScrapedData().getTotalItems() + " items using " + strategyName); + view.displayScrapedData(cmd.getScrapedData(), cmd.getSavedPath()); + } + + private void printHelp() { + System.out.println("=== Web Scraper CLI - MVC + Command Pattern + Strategy Pattern ==="); + System.out.println(); + System.out.println("Usage:"); + System.out.println(" java -jar java-scraper.jar list - List all available scrapers"); + System.out.println(" java -jar java-scraper.jar scrape - Scrape data using specific scraper"); + System.out.println(" java -jar java-scraper.jar scrape all - Scrape data from all scrapers"); + System.out.println(" java -jar java-scraper.jar scrape --output

- Specify output directory"); + System.out.println(" java -jar java-scraper.jar help - Show this help message"); + System.out.println(); + System.out.println("Available scrapers: news_scraper, books_scraper, tech_news_scraper"); + } +} diff --git a/java-scraper/src/main/java/com/scraper/command/Command.java b/java-scraper/src/main/java/com/scraper/command/Command.java new file mode 100644 index 0000000..2d83a7f --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/command/Command.java @@ -0,0 +1,11 @@ +package com.scraper.command; + +import com.scraper.exception.ScraperException; + +/** + * Command interface for Command pattern + */ +public interface Command { + void execute() throws ScraperException; + void undo() throws ScraperException; +} diff --git a/java-scraper/src/main/java/com/scraper/command/ListCommand.java b/java-scraper/src/main/java/com/scraper/command/ListCommand.java new file mode 100644 index 0000000..82038ad --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/command/ListCommand.java @@ -0,0 +1,33 @@ +package com.scraper.command; + +import com.scraper.controller.ScraperController; + +import java.util.List; +import java.util.Map; + +/** + * Command to list all available scraping strategies + */ +public class ListCommand implements Command { + + private ScraperController controller; + private List> strategies; + + public ListCommand(ScraperController controller) { + this.controller = controller; + } + + @Override + public void execute() { + strategies = controller.listStrategies(); + } + + @Override + public void undo() { + // List command doesn't support undo + } + + public List> getStrategies() { + return strategies; + } +} diff --git a/java-scraper/src/main/java/com/scraper/command/ScrapeCommand.java b/java-scraper/src/main/java/com/scraper/command/ScrapeCommand.java new file mode 100644 index 0000000..f2cce1f --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/command/ScrapeCommand.java @@ -0,0 +1,42 @@ +package com.scraper.command; + +import com.scraper.controller.ScraperController; +import com.scraper.exception.ScraperException; +import com.scraper.model.ScrapedData; + +/** + * Command to scrape data from a specific strategy + */ +public class ScrapeCommand implements Command { + + private ScraperController controller; + private String strategyName; + private ScrapedData scrapedData; + private String savedPath; + + public ScrapeCommand(ScraperController controller, String strategyName) { + this.controller = controller; + this.strategyName = strategyName; + } + + @Override + public void execute() throws ScraperException { + scrapedData = controller.executeScrape(strategyName); + savedPath = controller.saveData(scrapedData, strategyName); + } + + @Override + public void undo() throws ScraperException { + if (savedPath != null) { + controller.deleteData(savedPath); + } + } + + public ScrapedData getScrapedData() { + return scrapedData; + } + + public String getSavedPath() { + return savedPath; + } +} diff --git a/java-scraper/src/main/java/com/scraper/controller/ScraperController.java b/java-scraper/src/main/java/com/scraper/controller/ScraperController.java new file mode 100644 index 0000000..88b40ef --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/controller/ScraperController.java @@ -0,0 +1,138 @@ +package com.scraper.controller; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.scraper.exception.StorageException; +import com.scraper.exception.StrategyException; +import com.scraper.model.ScrapedData; +import com.scraper.strategy.BooksScraperStrategy; +import com.scraper.strategy.NewsScraperStrategy; +import com.scraper.strategy.ScraperStrategy; +import com.scraper.strategy.TechNewsScraperStrategy; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * MVC Controller for the scraper application + */ +public class ScraperController { + + private String outputDir; + private Map strategies; + private Gson gson; + + public ScraperController() { + this("data"); + } + + public ScraperController(String outputDir) { + this.outputDir = outputDir; + this.strategies = new HashMap<>(); + this.gson = new GsonBuilder().setPrettyPrinting().create(); + registerDefaultStrategies(); + } + + private void registerDefaultStrategies() { + registerStrategy(new NewsScraperStrategy()); + registerStrategy(new BooksScraperStrategy()); + registerStrategy(new TechNewsScraperStrategy()); + } + + public void registerStrategy(ScraperStrategy strategy) { + strategies.put(strategy.getName(), strategy); + } + + public List> listStrategies() { + List> result = new ArrayList<>(); + for (ScraperStrategy strategy : strategies.values()) { + Map info = new HashMap<>(); + info.put("name", strategy.getName()); + info.put("source", strategy.getSource()); + result.add(info); + } + return result; + } + + public ScrapedData executeScrape(String strategyName) throws StrategyException { + ScraperStrategy strategy = strategies.get(strategyName); + if (strategy == null) { + String available = String.join(", ", strategies.keySet()); + throw new StrategyException( + "Strategy '" + strategyName + "' not found. Available: " + available, + strategyName, + null + ); + } + + try { + return strategy.scrape(); + } catch (Exception e) { + if (e instanceof StrategyException) { + throw (StrategyException) e; + } + throw new StrategyException( + "Error executing strategy: " + strategyName, + strategyName, + e + ); + } + } + + public String saveData(ScrapedData data, String strategyName) throws StorageException { + try { + String folderPath = outputDir + File.separator + strategyName; + Path folder = Paths.get(folderPath); + Files.createDirectories(folder); + + String timestamp = LocalDateTime.now().format( + DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss") + ); + String filename = "scraped_data_" + timestamp + ".json"; + String filePath = folderPath + File.separator + filename; + + try (FileWriter writer = new FileWriter(filePath)) { + gson.toJson(data, writer); + } + + return filePath; + } catch (IOException e) { + throw new StorageException( + "Failed to save data to: " + outputDir, + outputDir, + e + ); + } + } + + public boolean deleteData(String filePath) throws StorageException { + try { + Path path = Paths.get(filePath); + if (Files.exists(path)) { + Files.delete(path); + return true; + } + return false; + } catch (IOException e) { + throw new StorageException( + "Failed to delete file: " + filePath, + filePath, + e + ); + } + } + + public void setOutputDir(String outputDir) { + this.outputDir = outputDir; + } +} diff --git a/java-scraper/src/main/java/com/scraper/exception/NetworkException.java b/java-scraper/src/main/java/com/scraper/exception/NetworkException.java new file mode 100644 index 0000000..241bae3 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/exception/NetworkException.java @@ -0,0 +1,27 @@ +package com.scraper.exception; + +/** + * Exception thrown when there is a network related error + */ +public class NetworkException extends ScraperException { + + private static final long serialVersionUID = 1L; + private Integer statusCode; + + public NetworkException(String message) { + super(message); + } + + public NetworkException(String message, Throwable cause) { + super(message, cause); + } + + public NetworkException(String message, Integer statusCode, Throwable cause) { + super(message, cause); + this.statusCode = statusCode; + } + + public Integer getStatusCode() { + return statusCode; + } +} diff --git a/java-scraper/src/main/java/com/scraper/exception/ParseException.java b/java-scraper/src/main/java/com/scraper/exception/ParseException.java new file mode 100644 index 0000000..6d2344d --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/exception/ParseException.java @@ -0,0 +1,27 @@ +package com.scraper.exception; + +/** + * Exception thrown when there is a parsing error + */ +public class ParseException extends ScraperException { + + private static final long serialVersionUID = 1L; + private String selector; + + public ParseException(String message) { + super(message); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } + + public ParseException(String message, String selector, Throwable cause) { + super(message, cause); + this.selector = selector; + } + + public String getSelector() { + return selector; + } +} diff --git a/java-scraper/src/main/java/com/scraper/exception/ScraperException.java b/java-scraper/src/main/java/com/scraper/exception/ScraperException.java new file mode 100644 index 0000000..bd54876 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/exception/ScraperException.java @@ -0,0 +1,17 @@ +package com.scraper.exception; + +/** + * Base exception class for the scraper application + */ +public class ScraperException extends Exception { + + private static final long serialVersionUID = 1L; + + public ScraperException(String message) { + super(message); + } + + public ScraperException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/java-scraper/src/main/java/com/scraper/exception/StorageException.java b/java-scraper/src/main/java/com/scraper/exception/StorageException.java new file mode 100644 index 0000000..0c0be93 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/exception/StorageException.java @@ -0,0 +1,27 @@ +package com.scraper.exception; + +/** + * Exception thrown when there is a storage related error + */ +public class StorageException extends ScraperException { + + private static final long serialVersionUID = 1L; + private String filePath; + + public StorageException(String message) { + super(message); + } + + public StorageException(String message, Throwable cause) { + super(message, cause); + } + + public StorageException(String message, String filePath, Throwable cause) { + super(message, cause); + this.filePath = filePath; + } + + public String getFilePath() { + return filePath; + } +} diff --git a/java-scraper/src/main/java/com/scraper/exception/StrategyException.java b/java-scraper/src/main/java/com/scraper/exception/StrategyException.java new file mode 100644 index 0000000..fe42e52 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/exception/StrategyException.java @@ -0,0 +1,27 @@ +package com.scraper.exception; + +/** + * Exception thrown when there is a strategy related error + */ +public class StrategyException extends ScraperException { + + private static final long serialVersionUID = 1L; + private String strategyName; + + public StrategyException(String message) { + super(message); + } + + public StrategyException(String message, Throwable cause) { + super(message, cause); + } + + public StrategyException(String message, String strategyName, Throwable cause) { + super(message, cause); + this.strategyName = strategyName; + } + + public String getStrategyName() { + return strategyName; + } +} diff --git a/java-scraper/src/main/java/com/scraper/model/ScrapedData.java b/java-scraper/src/main/java/com/scraper/model/ScrapedData.java new file mode 100644 index 0000000..5b4a021 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/model/ScrapedData.java @@ -0,0 +1,77 @@ +package com.scraper.model; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * Model class representing the complete scraped data container + */ +public class ScrapedData { + private String source; + private String strategyName; + private List items; + private LocalDateTime scrapedAt; + private int totalItems; + + public ScrapedData() { + this.items = new ArrayList<>(); + this.scrapedAt = LocalDateTime.now(); + this.totalItems = 0; + } + + public ScrapedData(String source, String strategyName) { + this.source = source; + this.strategyName = strategyName; + this.items = new ArrayList<>(); + this.scrapedAt = LocalDateTime.now(); + this.totalItems = 0; + } + + public void addItem(ScrapedItem item) { + this.items.add(item); + this.totalItems = this.items.size(); + } + + // Getters and Setters + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getStrategyName() { + return strategyName; + } + + public void setStrategyName(String strategyName) { + this.strategyName = strategyName; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + this.totalItems = items.size(); + } + + public LocalDateTime getScrapedAt() { + return scrapedAt; + } + + public void setScrapedAt(LocalDateTime scrapedAt) { + this.scrapedAt = scrapedAt; + } + + public int getTotalItems() { + return totalItems; + } + + public void setTotalItems(int totalItems) { + this.totalItems = totalItems; + } +} diff --git a/java-scraper/src/main/java/com/scraper/model/ScrapedItem.java b/java-scraper/src/main/java/com/scraper/model/ScrapedItem.java new file mode 100644 index 0000000..5170c6b --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/model/ScrapedItem.java @@ -0,0 +1,57 @@ +package com.scraper.model; + +import java.time.LocalDateTime; + +/** + * Model class representing a single scraped item + */ +public class ScrapedItem { + private String title; + private String content; + private String url; + private LocalDateTime timestamp; + + public ScrapedItem() { + this.timestamp = LocalDateTime.now(); + } + + public ScrapedItem(String title, String content, String url) { + this.title = title; + this.content = content; + this.url = url; + this.timestamp = LocalDateTime.now(); + } + + // Getters and Setters + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public void setTimestamp(LocalDateTime timestamp) { + this.timestamp = timestamp; + } +} diff --git a/java-scraper/src/main/java/com/scraper/strategy/BooksScraperStrategy.java b/java-scraper/src/main/java/com/scraper/strategy/BooksScraperStrategy.java new file mode 100644 index 0000000..6d95ed7 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/strategy/BooksScraperStrategy.java @@ -0,0 +1,102 @@ +package com.scraper.strategy; + +import com.scraper.exception.NetworkException; +import com.scraper.exception.ParseException; +import com.scraper.model.ScrapedData; +import com.scraper.model.ScrapedItem; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Strategy for scraping books from https://books.toscrape.com + */ +public class BooksScraperStrategy implements ScraperStrategy { + + private static final String NAME = "books_scraper"; + private static final String SOURCE = "https://books.toscrape.com"; + + @Override + public ScrapedData scrape() throws NetworkException, ParseException { + ScrapedData data = new ScrapedData(SOURCE, NAME); + + try { + String html = fetchHTML(SOURCE); + parseBooks(html, data); + } catch (NetworkException e) { + throw e; + } catch (Exception e) { + throw new ParseException("Failed to parse books", null, e); + } + + return data; + } + + private String fetchHTML(String urlString) throws NetworkException { + try { + URL url = new URL(urlString); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("User-Agent", "Mozilla/5.0"); + connection.setConnectTimeout(10000); + connection.setReadTimeout(10000); + + int statusCode = connection.getResponseCode(); + if (statusCode != 200) { + throw new NetworkException("Failed to fetch URL: " + urlString, statusCode, null); + } + + StringBuilder response = new StringBuilder(); + try (BufferedReader in = new BufferedReader( + new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + response.append("\n"); + } + } + + connection.disconnect(); + return response.toString(); + } catch (Exception e) { + throw new NetworkException("Network error while fetching: " + urlString, e); + } + } + + private void parseBooks(String html, ScrapedData data) { + Pattern titlePattern = Pattern.compile("

([^<]+)<"); + + Matcher titleMatcher = titlePattern.matcher(html); + Matcher priceMatcher = pricePattern.matcher(html); + + int count = 0; + while (titleMatcher.find() && priceMatcher.find() && count < 20) { + String title = titleMatcher.group(1).trim(); + String price = priceMatcher.group(1).trim(); + + ScrapedItem item = new ScrapedItem( + title, + "Price: " + price, + SOURCE + ); + data.addItem(item); + count++; + } + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getSource() { + return SOURCE; + } +} diff --git a/java-scraper/src/main/java/com/scraper/strategy/NewsScraperStrategy.java b/java-scraper/src/main/java/com/scraper/strategy/NewsScraperStrategy.java new file mode 100644 index 0000000..149d2b9 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/strategy/NewsScraperStrategy.java @@ -0,0 +1,121 @@ +package com.scraper.strategy; + +import com.scraper.exception.NetworkException; +import com.scraper.exception.ParseException; +import com.scraper.model.ScrapedData; +import com.scraper.model.ScrapedItem; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Strategy for scraping quotes from http://quotes.toscrape.com + */ +public class NewsScraperStrategy implements ScraperStrategy { + + private static final String NAME = "news_scraper"; + private static final String SOURCE = "http://quotes.toscrape.com"; + + @Override + public ScrapedData scrape() throws NetworkException, ParseException { + ScrapedData data = new ScrapedData(SOURCE, NAME); + + try { + String html = fetchHTML(SOURCE); + parseQuotes(html, data); + } catch (NetworkException e) { + throw e; + } catch (Exception e) { + throw new ParseException("Failed to parse quotes", null, e); + } + + return data; + } + + private String fetchHTML(String urlString) throws NetworkException { + try { + URL url = new URL(urlString); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("User-Agent", "Mozilla/5.0"); + connection.setConnectTimeout(10000); + connection.setReadTimeout(10000); + + int statusCode = connection.getResponseCode(); + if (statusCode != 200) { + throw new NetworkException("Failed to fetch URL: " + urlString, statusCode, null); + } + + StringBuilder response = new StringBuilder(); + try (BufferedReader in = new BufferedReader( + new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + response.append("\n"); + } + } + + connection.disconnect(); + return response.toString(); + } catch (Exception e) { + throw new NetworkException("Network error while fetching: " + urlString, e); + } + } + + private void parseQuotes(String html, ScrapedData data) { + Pattern quotePattern = Pattern.compile( + "([^<]+).*?([^<]+)", + Pattern.DOTALL + ); + + Matcher matcher = quotePattern.matcher(html); + int count = 0; + while (matcher.find() && count < 10) { + String text = matcher.group(1).trim(); + String author = matcher.group(2).trim(); + + ScrapedItem item = new ScrapedItem( + "Quote by " + author, + text, + SOURCE + ); + data.addItem(item); + count++; + } + + if (count == 0) { + // Fallback to simpler pattern + Pattern simpleTextPattern = Pattern.compile("\"text\">([^<]+)<"); + Pattern simpleAuthorPattern = Pattern.compile("author\">([^<]+)<"); + Matcher textMatcher = simpleTextPattern.matcher(html); + Matcher authorMatcher = simpleAuthorPattern.matcher(html); + + int itemCount = 0; + while (textMatcher.find() && authorMatcher.find() && itemCount < 10) { + ScrapedItem item = new ScrapedItem( + "Quote by " + authorMatcher.group(1).trim(), + textMatcher.group(1).trim(), + SOURCE + ); + data.addItem(item); + itemCount++; + } + } + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getSource() { + return SOURCE; + } +} diff --git a/java-scraper/src/main/java/com/scraper/strategy/ScraperStrategy.java b/java-scraper/src/main/java/com/scraper/strategy/ScraperStrategy.java new file mode 100644 index 0000000..06e0362 --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/strategy/ScraperStrategy.java @@ -0,0 +1,13 @@ +package com.scraper.strategy; + +import com.scraper.exception.ScraperException; +import com.scraper.model.ScrapedData; + +/** + * Strategy interface for web scrapers + */ +public interface ScraperStrategy { + ScrapedData scrape() throws ScraperException; + String getName(); + String getSource(); +} diff --git a/java-scraper/src/main/java/com/scraper/strategy/TechNewsScraperStrategy.java b/java-scraper/src/main/java/com/scraper/strategy/TechNewsScraperStrategy.java new file mode 100644 index 0000000..5526b1e --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/strategy/TechNewsScraperStrategy.java @@ -0,0 +1,114 @@ +package com.scraper.strategy; + +import com.scraper.exception.NetworkException; +import com.scraper.exception.ParseException; +import com.scraper.model.ScrapedData; +import com.scraper.model.ScrapedItem; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Strategy for scraping news from https://www.bbc.com/news + */ +public class TechNewsScraperStrategy implements ScraperStrategy { + + private static final String NAME = "tech_news_scraper"; + private static final String SOURCE = "https://www.bbc.com/news"; + + @Override + public ScrapedData scrape() throws NetworkException, ParseException { + ScrapedData data = new ScrapedData(SOURCE, NAME); + + try { + String html = fetchHTML(SOURCE); + parseHeadlines(html, data); + } catch (NetworkException e) { + throw e; + } catch (Exception e) { + throw new ParseException("Failed to parse tech news", null, e); + } + + return data; + } + + private String fetchHTML(String urlString) throws NetworkException { + try { + URL url = new URL(urlString); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("User-Agent", "Mozilla/5.0"); + connection.setConnectTimeout(10000); + connection.setReadTimeout(10000); + + int statusCode = connection.getResponseCode(); + if (statusCode != 200) { + throw new NetworkException("Failed to fetch URL: " + urlString, statusCode, null); + } + + StringBuilder response = new StringBuilder(); + try (BufferedReader in = new BufferedReader( + new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) { + String inputLine; + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + response.append("\n"); + } + } + + connection.disconnect(); + return response.toString(); + } catch (Exception e) { + throw new NetworkException("Network error while fetching: " + urlString, e); + } + } + + private void parseHeadlines(String html, ScrapedData data) { + List headlines = new ArrayList<>(); + String[] patterns = { + "]*class=\"[^\"]*headline[^\"]*\"[^>]*>([^<]+)<", + "]*class=\"[^\"]*headline[^\"]*\"[^>]*>([^<]+)<", + "]*class=\"[^\"]*headline[^\"]*\"[^>]*>([^<]+)<", + "]*class=\"[^\"]*title[^\"]*\"[^>]*>([^<]+)<", + "]*class=\"[^\"]*title[^\"]*\"[^>]*>([^<]+)<" + }; + + for (String patternStr : patterns) { + Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(html); + + while (matcher.find()) { + String headline = matcher.group(1).trim(); + if (!headline.isEmpty() && headline.length() > 10 && !headlines.contains(headline)) { + headlines.add(headline); + } + } + } + + for (int i = 0; i < Math.min(headlines.size(), 15); i++) { + ScrapedItem item = new ScrapedItem( + headlines.get(i), + "", + SOURCE + ); + data.addItem(item); + } + } + + @Override + public String getName() { + return NAME; + } + + @Override + public String getSource() { + return SOURCE; + } +} diff --git a/java-scraper/src/main/java/com/scraper/view/ConsoleView.java b/java-scraper/src/main/java/com/scraper/view/ConsoleView.java new file mode 100644 index 0000000..ba7965c --- /dev/null +++ b/java-scraper/src/main/java/com/scraper/view/ConsoleView.java @@ -0,0 +1,72 @@ +package com.scraper.view; + +import com.scraper.model.ScrapedData; +import com.scraper.model.ScrapedItem; + +import java.util.List; +import java.util.Map; + +/** + * MVC View class for console output + */ +public class ConsoleView { + + public void displayMessage(String message) { + System.out.println(message); + } + + public void displayError(String error) { + System.err.println("[ERROR] " + error); + } + + public void displaySuccess(String message) { + System.out.println("[SUCCESS] " + message); + } + + public void displayStrategies(List> strategies) { + System.out.println("\n=== Available Scrapers ==="); + for (int i = 0; i < strategies.size(); i++) { + Map strategy = strategies.get(i); + System.out.println((i + 1) + ". " + strategy.get("name")); + System.out.println(" Source: " + strategy.get("source")); + } + System.out.println(); + } + + public void displayScrapedData(ScrapedData data, String savedPath) { + System.out.println("\n=== Scraping Results ==="); + System.out.println("Source: " + data.getSource()); + System.out.println("Strategy: " + data.getStrategyName()); + System.out.println("Total Items: " + data.getTotalItems()); + System.out.println("Scraped At: " + data.getScrapedAt()); + + if (savedPath != null) { + System.out.println("Saved To: " + savedPath); + } + + System.out.println("\n--- Items Preview ---"); + List items = data.getItems(); + int displayCount = Math.min(items.size(), 5); + for (int i = 0; i < displayCount; i++) { + ScrapedItem item = items.get(i); + System.out.println((i + 1) + ". " + safeString(item.getTitle())); + if (item.getContent() != null && !item.getContent().isEmpty()) { + String content = safeString(item.getContent()); + String truncated = content.length() > 80 ? content.substring(0, 80) + "..." : content; + System.out.println(" " + truncated); + } + System.out.println(); + } + + if (items.size() > 5) { + System.out.println("... and " + (items.size() - 5) + " more items"); + } + } + + private String safeString(String str) { + if (str == null) { + return ""; + } + return str.replaceAll("[^\\x20-\\x7E]", "?"); + } +} diff --git a/java-scraper/target/classes/com/scraper/Main.class b/java-scraper/target/classes/com/scraper/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..cefcf5b668be3ec8281b5948ff313e79d031b344 GIT binary patch literal 5014 zcmb7HiGLJV9sf?UWHy^gfF%Sd*KjA<95f|u%|Z|Yl(gB9HX)R&bg~(eA-g-uDruRoxQ-#0URC6N#2cyH$S-tYH*$M^Sp zzj^UL7cT?23ICE&B4Jk4j5k}+l$O*}%@NH=$ncSRNE_9fV_IUUdB?yZJ!(q`M9qYq zGGj44C855nkS)K`-0Mo}$n6bF@QoV!VF^o$cm%DP+blDt_w$+i%GMhR!)}*QT3gpo zwhnVp51W|xVR)RggqqsDU3q`@+9@M36t3$J zP`gSos0x;0G0je;x!b3uhA42(G(6m*C6j_>wSqMWNGMNIn7v((ky?k4jQXP3xo0V8 zK%)fzux1SlpE?fi^rM+BcOx&DuUF858%WacNoz4`Ft@fqYZnFKx;=ihQpaJQ=*LZb ziW!zIGvQ(mxifz?*TujJHUrav+$~Qo#dwD@7T$PV)uiYl>{|^yuLVJczf;I7;W_C1h6> zyaNwWwS<0z*eXskuL#I^C;gmfB@+C2x8Tv@dIcWFF$M3zd#NsCF$wS4I#K{Fk0gr7 z`xLz2wcNQzdRZuAl=vVXRqz;2FygFX-Hv9wBla-IEjQF--8@=U;e1wlnZ+9EdX_#U zzbIE7B9Q(pr>OKrwh-Yp#g%?6nXUG%#aq`;J#Q+dJuKrRM9y?6;nu@kQk=raL{f}P z*!X`W#ndB3JvaqJ44+i+G@cP7_<;(igC*Js*Vj8KYOL6qRLq86T&u%@Mngib!DW~j;>C%QH}I>s3FxufJ%#) zr3q5VDr(qRjzsnVzJ?cMd_7y_i;q$8qHvt-v;?t)*!)dF3;6MEUh6x>wb|y!cO-PH zszAKjct}e*PmPw_wlxWYND+0?PopY|x61OPlF^8X%P?EgEI+;{Vdqt4y7JZa-Z||; ze52&2=rJg=)EtM@>G!{%XCbd##H9(NlZKYm8+Y?|Wq zHZ`FiwhnkEHK+roIa2Uy>(Su@g*$jh_nPTcRNrQZUbbAcs0{b0#{OcnY1*P3CL_8% zYz{Kneudx2__c(U`Fd(3M$HkunYd)2+{R{`=2$GU{I?PwE$nN&-LAmxPD^O5?4pk8 zWO!=A6;O&8`&fCW*waSWoZ z530K85uJrUvvuor>xU|-WRF`OHYHY`&O|~_b;LBw(%I*urW1^QiGC+cW68h#de|e9xkH9P_iAcVEQ5 z9DRa{2QY#JKVQWBLH69GG#>nX5Uu|rMr$!$xP+_AaVJgRhgCR$H5f!Kh7cl86HGMY zUaVyocRh~d21;3nlW4^=xDlsuv*X5kCs-3+Q0OYhp%QuPupf6(kCP1Fe#$Pv-8{J! z6@gb#C!?;SqM}T`Lcf;~D>5`OY=^6u7tw6G!VYi{E++(O!UrMV<)?*DTmPqeOfUPCiq5fM?1) z^H}KejHifTo)kFZ4|<8+^o(q`cae3(dkk}^c{ zx|F9#xto+Q%Bug36+{C6t`IJ=ivyP+^Fv8yJB@``$m=Uy5@wc&?t5}zP4V% zDF+Xs^Z00l&iS|q6X#E4@Tt&6oDqp~E=wc**$gh_fl@;a!HlWIUX~$|8T*O+yBuGr z?g2Spv^pMOOUb;k@CB+=!YsR#jwo(p~@gXcMC@D1_yE%z<>k~e?Xo4@bP zKlJ7wyR*mjQ@-UDZE~_eWAz$fC5y7A4Kk&5tj0m6?-0{;n87m`{zK?uO6RL+#5152 lKc{*n_yu0(TutMCM}>dyjDK*(KjAN25eEGgf5$(u;J*bRBhLT; literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/command/Command.class b/java-scraper/target/classes/com/scraper/command/Command.class new file mode 100644 index 0000000000000000000000000000000000000000..b7ab774a3a3f5255154ec5a4944d615bb842d80d GIT binary patch literal 231 zcmY*TyAFat5S&xw6fv>4H`;imA7He#AhAD>je)=&;bHhT3qQb*GA==lR=YDhJ2Q{x z?G9jznZ!U~VO*{%Q|f|B#e1%8takmB@C4?mzG{_edr`-8N~RW&)RJjx5*V)5CxKw! z8Y=3<*-By}u>AF;&rL;r%2zDlH8ytqAGxM9bVxF`4Bz3KF4q^}5UvXhxXTDWW68+l OIc6sKXPBLKT7)m@%{BG_ literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/command/ListCommand.class b/java-scraper/target/classes/com/scraper/command/ListCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..1ef3dbde229331e44ee78aeb0e2569b4279a3b16 GIT binary patch literal 1025 zcmbVKO>fgc5Ph336XT?53MtS+8fYPL1wJB?Dwjw_NC6H(xo@16yOm>C&KmKvK%yXV z;0N%d5VPyxx-EwaS+-|q-+S|Bc7Of;@e{yHJhM<@==$-}Tlon;6NyLhl1B?~B3Ejh z#TF_ItyBJydm)bk@BRE#_{u_!Vdr1eHI2dc<47fO7>b0!om|HL-SMVb<#CQ35_6>z zu0$Zkib_vR?NrIo*rNUVR0a`OX(AY2U)eq?tl#pp_0l+>szgS?Fas1bqv42DYezDY zYQ*roe{-{g8AD|pFNBRUHXSt3W+?XuvpN{=IIwVwVPhgA@h)A?Me>2qLvr1o#6Aya zJdt|6PFB>3q=tJ}s$V-1@@k1s!cP@d-N8c(yA1uC&ey>sbQzi<9WhNLpL4rED2z^D zfT8Z8=b#RonoOfb%+LtLCDxm3tp7g%dm5*SFOH?2P^)kSU+5cv9=R#gTSbW;8Z2Gn zk~T-V+a`8Up}2u2eK#m`Y>WdyeaV#nv}GILF?Fs%;cH7spcXF2KDq0@&M>> literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/command/ScrapeCommand.class b/java-scraper/target/classes/com/scraper/command/ScrapeCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..bfa000fe98d92f1273c4594a23d1501f71f91d67 GIT binary patch literal 1454 zcmah}T~pIQ6g}Gy0wokE1wm9OU~NMsDt_ze1L6~cGgTaYThg5pY!fEkGWf4_hT@D5 zKKkH~a=g1qX-hNuklnqTd(S!dBl-R3$4>x{@YFzpq2TyUyX6G@SOhkmo7}6}Rc&vD zmVp$*)Db`7c7uC$d+*>#IMTof!(v=;6vmKod`|{`qagwYYiH26`zGQFwk~|1F_AkLnr1tys^&%SJ}~JN*=l`hSf{TVmd=v8RAqpZAn;}?Ndh_OV{^W29_9#{q+{z zcip@$oHHn3)xZivsXyRfl`ye}n+y{XbvP^xo28fv4J0w#7FC{GCdOeZ9c2?1))_`s ztHQo+4>o8RA&zrsS`^J~6BDWnskT@1726#XcX5vjN3$Yi#5Wt4#3xF&D!KFd4L^>W zl&uRHCLRr7p;Z1)t~Ayvs5gaq3K^10da8aqaKvj@PsqThxS`xhI!zfpX{3-)Lq?x- zLXDW-sg`=DWNA;6UlxODjm#y(*g6e<_Hp)rZq=^GZdP~ z0^KZ!VYrG#vIs!aGJR6S2_m>g{s~;CyA)YBG~s)F239TWjL6O~caG%_ie0l9UX?ni z^h9Je**uXfV1+1^0FxjICKAA~5kt18WkB;(eo>MkW#t_92Zf%5N-;#gK?y7oMxhTq zAE9q*Up7OO_wj&MRXUq?B_U0y#jkWoXtWW1xz>l0zR>uPezL>CmCM1U*x<*S;>lli CL`We3 literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/controller/ScraperController.class b/java-scraper/target/classes/com/scraper/controller/ScraperController.class new file mode 100644 index 0000000000000000000000000000000000000000..3e523d493b44f561b4f334ccb980c6760ade8dc7 GIT binary patch literal 6431 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 R5#bKLAB!q+vN#2i{{TR|t_%PG literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/exception/NetworkException.class b/java-scraper/target/classes/com/scraper/exception/NetworkException.class new file mode 100644 index 0000000000000000000000000000000000000000..7e171261a70c8ea6bd12ff81b7cd7abb8b862019 GIT binary patch literal 965 zcma))&2G~`6ot6beWvaSC3tD0EXm3W~Z($%@U?j9f!vS7V#p2wJhHDotfr057dpRs_5y1{W+J zpX%h?^rvfMciY&#DbNUHo|5S<)e5}$H+D9urPaOhbqL&Z(83C@AynCDVc>4Jw@@_$ z@m5Ajt^@TtGP859{t-{j(eZ%XIxn$?+i0N4$S$I5%&-~XE#`P1Tvr(#Fkj=|^!gWA z`&ww%xweX|Lq;1LjBk`GY+{QM^>CTvZ)Ap5u?FmHdfQ%q?*g~3!a6KkFJQZ+Y!0(4 z7)xpU4qF-Q-3t4TYKvIM>pvmZ+xw24OZIBP+A0jK(2_ChmHIi~ne&T@S4T6Q>g;hJ jyHzKjyI_68`-Yt_e5ui}Ijc!-7igyxRA|9@8`Z-uh3ug1w0Z>Q&J^1(DZ7*36^ zTgKNwpc%-8W_iC>D{%OKY`Kxz;^FiL1n#!b_9R)PfqEXA z1#MiP_Oba6*d?;Tk7VICnrJa{@@R<}_TkxPjw|PVh0zi77N0F|bcxl^xps~BcAj;~ z=wO}kpip50Jx0`{Pa1y{v!;@D!p^3*}6XEuG;+tev`RY literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/exception/ScraperException.class b/java-scraper/target/classes/com/scraper/exception/ScraperException.class new file mode 100644 index 0000000000000000000000000000000000000000..ce807536506693f4b9f369c3fbdca3a942f730d5 GIT binary patch literal 622 zcma)&%}&BV6ot=4pr(KzSo~e+#vmBGbb(=mnqV3?Ap4=j$Y6xv}B#UhCN!k@?tTk4Mp*$Xf5;ugWGIX}Q| zth`{@Jn0kC?eJcjSi?phCUS(L;|20|G8#zL69Zoo%1-FArC?*O=goBd;6;R*^S>)K z3C2i9kr*bxKT!zv6#;)m?mejRS^INp9d}#DwFntkOd@7lE42i(8%~rfuRVPeYx$+m zbPybYn8@#iJ!FvO)8HzFbzV$Bj`uuwT3o02%+?!I6kZcek#{rc=6E)b64%w43Y#c% w#d=h*#SG1|=By4oYEPryIGv)p3@h?bDS;i%WDA%vhw&(Ou*+6DwvN011-#*gmjD0& literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/exception/StorageException.class b/java-scraper/target/classes/com/scraper/exception/StorageException.class new file mode 100644 index 0000000000000000000000000000000000000000..8792b372daff94dbad67e53bb9c41aef29d99ba4 GIT binary patch literal 937 zcma))L2uJQ5QX15PFzx_O-m9e6xwpA5~tuJhgQ85kcuLN)RGgItyvNy$F6Lr@UuVy zRpP)8;71|eu8pZmK=`oU8Nd1F?X185`1%dNV?1zR3G4>R%+G>Uo~zVX9|Corhe_<8 zglh91N-mVqPo%wv@?~4G8(HiBka}j69MsDpmmhQSuW#zETg%q(}jM7z|z|= zQZHpb6<8m=lNZvDWIUmXG>j+v0*!+(4)a5SZvW5EgRy{pl)O<*)X;X}q9w383S;$R zK08zCsXU961}6b6Ng88ZChdG0W&-`u|4o5boSDipPDa36;N^yvcU30<_W?*co7)_74C?x2naBgaHb%&-&pHgg<1*A+&G%v*dnyx}EQKN;;B*QUw3WVEo( zxL2rf6CFm>qe~ip6+NhubE^+HRtj(e|1KTcS70fANEX4+mTLyc##J;B5 zCf4lGjfd*yRsdA-U=j8 zB^EpY4}~~0c1%@Lyco~DKKHw4?)ca5A3p&+$0G-pz>_eY26>ptbCm_^Q>f01I8B1% zB9n!RKEIr29M}SnuMwB!wN{{;t1On2vC4AN-W_nbU3^)yGOVS+UDrpyIaW3GEt~uS+QP7JsRe3HW68!~cF4;Rd%hHd!*RD6# z*6wO+1A%5JXF1FJ3$+4!|HoECSy=3iZ$jXKi#Bd?29YY}mst+Cx9wf3tH;|uPG?!D zUd4J&gLz4Pr_c0_V2k7iugthG4b^YN}V*Q=(SpUmjGOS)@Xkhq$sjvBN%{Mczj;1>`*yABKs!jplf}NWF aH>`i*#-d?;R-IfkXtxwpXn{?m+WG^n#K4sR literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/model/ScrapedData.class b/java-scraper/target/classes/com/scraper/model/ScrapedData.class new file mode 100644 index 0000000000000000000000000000000000000000..1bfb8828249b299874e7591713fd42b68545263b GIT binary patch literal 2318 zcma)7+in|G6kW%5?8KSGCRe9P8aF^{k4sFOQc4|CLPFb6lOiPq!2{C79+|0psm2pf z5TC>YNLZyH@d11kV(l{%dwipP@tkw!?7h}rd+qT*|Ni+mfDiFy0uhDvN~=+9S6u6b z?G_uYs$DOh=w0>D@~i}63hC$84_2{mHEYFZ=g;kmrx0(qF5HT(FjwxqJn>woSt}_R zZO^qlyLNeOHF#&j@$5#MdHlNMQDowmoDQzuTXX?YheuiYMay;~kj?T86WdlK(6 zukMr6iXZPe4ZB!wRjfJ-uur+;y`byH3;b_7tMI{Fy@RfR!f^#e#t} z-b!FeVP03J+3vfpbt#mSSj55<2xedsQ%S61J%KfaWqo-V+rV{f5T)7rQDHTgAInja z-Y{TbMpkbdm_SZnIiG-T zX3($Ull+-*Fbzx~E~{Gx5{N4#tZG#>RM^aohtkc-pH1U^+)3cJ!fa1S(a^vS?otva zQ&$6JOk{*q& ze=c8KdB~7b{mGYUGNjJlb}c{~c6dp$&M^2iG-5N14)0^RBe|CJTk^;eC#OT-nQgHM zZqRE{ew!u`5$kak5##A6r;TrudOgi^4vJoLO!%DPJI*bC=eRp#7RBe9`4aQyUs(L+ zC6+tLn1A3}2U#=P!RBu|`W^l*5etlsF*b#H?iV=Li+Go(hMxypxXGPhM#OcEn)NdWsKn4}NJU#(j|e%uhwXsL zS5zaycPr-a$P`|o7{S-3tY6^+g}zc}b>b|hDRl;$8f?iA?t-o0BRpVgg%WlHh@#%J zF-)8Pl~@soa&aCDr=C(1K^ldRu@?mI1^nWssMOOvsew(_RtOP^cZtMC!>iJ28rAu+|C#xVnR`5AD@!6Z^8p@wXiaoK|=RN5<0|Z-6W56lJ5eA(xOnt zWDk3di)y9)#yud#59l^1;~A24R)brDaCy)O(YsG z`~ZF^<2g^e4xt!t`kd$KIsfxJFTZ~O_zBxwOVcSKcn) z`j(SHN}zCMelm@*>5h!|gDY$33#5J9A6o*&&fUMR@7eC?OdvCyxW46*TXN=&1#-Ua zSX1A0t_8M(0Ddt#lc70&ZTeP^ZWO1yvR&Ihr?6(LFOa$*8Wl<8HQa-y;sG`@C<<)J zoU0NVN+?sbJGl|4Hd|{`{G9ox0u&76Vd^~^y~6La-V&*pphnDRf`Q-ONt zpY5U|UN%=-@;@)FK2tr?kcPt6o`y_dJ=TzgB9I+felKWy>9#mIl&JC9Y2;Ck!QiH< zByw>(9+mu~i$Z@s@VFFum4+r0Mx)cDdUV|lGpx?xOeX41X5P?xV{=Oj3oCWZ(?f$w zOwt;rkl>2RN^rgMq-y0!^Py8EPZ~dc@6+v^`~;nv{tX-YcNFHRe39M{>AN8{H%K*4 zF$HY1XW)+=RO!ZAyP?(%X{G3`Dz(~k)bztS>iW?fjTPw~300(kOw_v^>x8f;6)J&O1gC^>0tc}m^<|L#SdeBsNPQXPfYLSBfbh_{1Fcw)#xh7d z7DSH+X)J>n1ah(lgh#_5Z5nK_Ym1|)EQ36c1v$h~82s007FIME%_)JrSOdaq&mhNg G8H_)H@8PKc literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/strategy/BooksScraperStrategy.class b/java-scraper/target/classes/com/scraper/strategy/BooksScraperStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..d16cac2c1db7aef938f829cde3d5768138f6ec3d GIT binary patch literal 4974 zcmai2d0-UP8UMXava=Z`LKXt95DD>0$gzM(brYx%K~i&I5`uv$o$OAsYj$_m*;x*I zXj|Lb!(R5#Ue>l2dsxx78z8M{4^i7{?`rS6_HO^Ie@K7t%_O@aE0Sd1d-I*|`+nc| z-tg3mCmsRt3j9|?K%g~lXQKJIW9BR;ns*)3wI&Zox7qeoe%O0E?7!4dEwJQ9^MDym zo7u_e;P{PJ+|>{ixUiyG zCvTN;HVHJAYhB=mj@4+Efw@57l9q+3S@@=PRENMt1}?@W0<{yC8&B>W>F=Ze735nN zDv;u>2G*jDA;?LGRWJoMR*-+0AhwQ%&>_&U!%U^EM3ZYbDTPf67djddm3vz!&|OLQ z0w9(-JCbzlgAxv1t)m(?2rMme&jpz1N-&oKt6#=XGA7+jT0jtPE%TU5$vZRAgh)e~ zM{`zXy$ri%e5&8fDX?nbD?|C0wcP0Lp*|fkY?fPR88lSbx=dmWR~p!gZ35@mIV;Nw z%(9}1M%EY6TduA|>(X!)>2t)LEJWHXF@&&#m3Q^_5gk3)X`olSuq1D}L)J|NEARGO zZqiPKa1E2cJ8wB1TPLlo8$!RpqJI14R61=&FY8<0Ca?GPGo`P>rKE z%r1Gofg2>qS7gj7lCp8r-IH>YoT*-w*YO&RYheECOW^3uvWHrZfjANZ+5y?n1}6lT z)1|U(`fOb~R$@YCYEocxg-lftDSI^^r75~va>Q${+X|_4!g6#Zu~Y*QxLk3h?C7?_ z#DwKoi6P4*g9he3GE3{t<_azqSZ2l}%Yfw!+ysZQWWdT8Xml1X)LKU9s)dUK8VYQO zN^zF-cv4op8zq3V3DZgRczClAAe;MJ|`oV!Ob#auNBzfN9+v4 zFD)!lF@@Jl@i(xhOXA)(S?n@Ww;FgO-o$op=2#g_V@HL|lxK5Zth++Ejg_uTOK&ys zHry@{Vki^x;1O6h8!dH?`bVJTeTRW}$^)t;q;Z zFUi@@;t%rPSC%rZ$Aucnb;dAqDHlC&sz94Wxck` zvvD3}UOdW-^m{@qs^gf^aH7I4d=>*=!`BJUNyjeayxA?t=-|^b1`nYObsq6uJ%3>dvS9tGm++oID+c_*x%|8g-Rh~wl z+f%rctv_w$FYMzDzmTht$+Fze6C635vnsIfE93XROJrrD)*O@EEWhE4X6!L`0d9Tmc>jjY`pzG+sq|=L}Yl zh3mrlG}iR34c8TMVgK6pwjx@NU}=B*$^IEMj)mJr`!qUFwjHGggZfrcj~rKHJ+(*= zn&~u@^NsZ5d_`+S6FJuK*^G8vq`ccmyR_v>8l|%^)*ILHl9kr*U{1uZx8kyhu%?wuoEyL~6osR%57$ zw~WPVPn~`~5_%k0M7VzY5v-2|JUg773n$9?@dKBdCuABiemjaVX+lB-76O zBQ-^Q@F+8*yt@lva_&CKL=_|NRWl&ZTHCgARVM)uN3NYG*(@7{^XV zFUr|^CSn7+_#9-=uVVtn8TuT@0>3d1k#Z}#aXaUCVhf(emG~jHQu{VM$4jLI-h>x# zKedcJKIS9&8GIa{V20{(3ir^%Dq6V@_u^B`*LBqUX?%vTDA3k@_$*}(5${Jh*7AB( z<YRV&;yzy8j_? zn(93;-7mqkp8oM;miQrh#5ny~#64xgpFf5#4ul`(GgjTfy7)@0CQ_}&VAUq=2sTA( zs*5;Q#3Qj#Bse>*oxx*ckx-=e1ilG`>!$IonBE@Ii#T{Zha=>&EX!o8@&HLS2cLVtki8f3-nV!Ezna)z0Z5hi0dwqq1mbKS>q4q=RM z29d@-m6n{hk-4;FRGrCwkx{i5pp{8HgYVOJ9Y2MBz*#jdjxoVMVi;D@){i+0()s{? z!lY@m--4eqK_Pn4NRY`?_3`gnf`b{T|nFoW?gSXQY2lJb8Vs zgQIk*Dy$#n5KukE>uUSUx>}XL3xQu$5Uo2?G*Lmc3cpkaeuZCiT*giRk(U3Yo_|r# SzvAzt$p7E?2mXcsAo71*MH$xs literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/strategy/NewsScraperStrategy.class b/java-scraper/target/classes/com/scraper/strategy/NewsScraperStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..99ec07acfc06dd283069588655de549e41c9ab03 GIT binary patch literal 5364 zcmai2X<%Gc75?rdnK$$D(l!%9nU>ONWl5T4Xn_ioP-sI+gIP+GrVY^6*O`}On%Q{s zrVDO}sJP$)E-WH~VymDO#7S+Guqc}fiW|7^;=V8NgZkb3UXn>Nl%{!iIp>~p?m6E% z_uf49^3ewYycREN@Ch`;v*~C)ZksvFj^-WPbgYpB(Ozp`zTchf_vSQI3M|@V?lq$+ zGcywH+r7t%I~x1~rn+T061{ zOGgFj3@pSVfrZ`4jMZC6@3!m#b9c&;7G>jRYS6Tka_mi3I-|+Fz^d-Dn=9iW?!xcd zA+VyMan`ytZAe93k0dTK9h1y@=l-~rbCTS+hLZ(OFI8ks(HIJ6U)CO*X4Y`Z9FNcN zZZ_?_Rl*q&SXL@^o*6opW2N-VYXr_{m>-z=GmV2f1Wq$>I?fOX4qHxqbkjgjH|;O8 zzHz<)xxCT9Dl`dH=cK`xswfJaT}HsGc(HLXfEIxhH=4{p_fuUm=qH=d< z3bdCKJ`ac`<_?V7*?kfZZH>6CyV-Wp~x&xCJo zs0ot#5{ss_%6#c}%=lQ3nNw)hz$ru7m$97a)-BySVmM!Joq14SX6rJHFkL8SJ69K%A8L%~P*)8iwtc(*t58=?0y(*bXnbC7v&y=hC3~ZLj49%?GY|~WR zIUvbf4D@3_pq6A$|3ETrWeX0y-Owes*nvR<+a%KhCBsa39FjC-;4)m!f-oYD%jcMg zmMj*ka&(1QBzG9tDPg`iZH|$YiJQ*0q%+E%s#SR%ug7i;jDPJ6IJz<{p_XkRj)Z`= zR~EFsVSs*c`>LyjY@Q3~!Rl-^`qzS?+F=$u2#0wSl+d8Wwaj$IM_DTgpVHG@7$~-4?*L z%yeC9dWV5`;yQrm5EN)H73Lo zy+h*i7U`y2c?gzD^$dOm5b{hY*eREXiNrqf;)TO4O)OQqr(M;WlV_;&iizZ9syT(c zo0y_YdD6{Q!nMQ*SEYw`uJa{{=aXCpqGLALNe?C^#AQS@d}h|o#+4Mn-2z?h`J9=F z#8YNIfBs6x+V8Af*KqmH_8m=)?NLcu*ShM0_I%n*rKXt70_&Sy$|kAnG<s|Eg89QAGb!7IN1w1Ys7bm zy18fx@uIqeXSuq-c&yVnFC(QKZ7PhikYo!Pc^XRO%4(*t$#GKo;y9NU6jmO$D{vE!rIeLFwL6;~E9BbdRhZJ5SqldatxemN-!wz zWXh54a;&BlX~9Yw4Q2c?+Hs1aEklGHEBIZBW}K$1JDYl`)w9kZYRCD z0!wUzaiwRqxoES|v9 zp{Ap_0;sP%f?Z-9*5m|6hsLodRwZJ75z{6xHZ+0s5Eo|eM}8a!#_`5jfX)k7g@Z-B zWm~u^^fuK7ig^1_Ecp1b7s7$Za9)_>cOAs)m|qS9Y8duU#g<3c>kN6~ZG zfaiJTmB1Tz{q2R8p2x>LBtL`O@Nq_{mZ!|^w6KC&?!q0olkwV4xu3+R2#W%B-Gxtc z&3@wjAlo1>Zxvqed1k>37`8xv8GRaJ8al)=G(cCdIONS}7}apS`ah=O5bzQfZsYJJ zR1-7T*VMcS-!Y1J!E{K1X*KQRW1IMq=;@?A2KV%6=(CF=NAUUH7N*4gvC4|IRR^&) zTv=H}v4}4-c9jf<>Jkc*Lt*VG9tOhxP|Y|Vi3OTvSig2{l?ZdilQ%=JuUe$vaqQvx zs#}l@ee(#OiTOj%%7$TADgt3mwZV$D`azkV6dLr@9mRJkJK&9671hn*YNnrH zt=!@k?h4N>0>3J=v}W$oePxzb;MYpQZ}3~TOX#~lQS+bG_pj>vckla8(&ZnT{)PYG He+d5{id>A1 literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/strategy/ScraperStrategy.class b/java-scraper/target/classes/com/scraper/strategy/ScraperStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..d735b20160418065bf9c1527b84bbbd24fcc6bd7 GIT binary patch literal 313 zcmZ8dIS#@w5S--*z+129ELphOtxB$Am<)xo4Pv#GMizeukjycZUz5W0JHQZiJrFE`u0(U#y8MnZoy zUi}6|$u&7Yzo4W?q?V@mWIq3I01& ACjbBd literal 0 HcmV?d00001 diff --git a/java-scraper/target/classes/com/scraper/strategy/TechNewsScraperStrategy.class b/java-scraper/target/classes/com/scraper/strategy/TechNewsScraperStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..4549109a660f8b3447af4f30912afd7e48413cdc GIT binary patch literal 5740 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 Ny7YVe5r0P0e*rR% argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description='Web Scraper CLI - MVC + Command Pattern + Strategy Pattern', + formatter_class=argparse.RawDescriptionHelpFormatter + ) + + subparsers = parser.add_subparsers(dest='command', help='Available commands') + + scrape_parser = subparsers.add_parser('scrape', help='Scrape data from a website') + scrape_parser.add_argument( + 'strategy', + choices=['news_scraper', 'books_scraper', 'tech_news_scraper', 'all'], + help='Scraper strategy to use' + ) + scrape_parser.add_argument( + '--output', '-o', + default='data', + help='Output directory for scraped data' + ) + scrape_parser.set_defaults(func=self._handle_scrape) + + list_parser = subparsers.add_parser('list', help='List all available scrapers') + list_parser.set_defaults(func=self._handle_list) + + info_parser = subparsers.add_parser('info', help='Show detailed info about a scraper') + info_parser.add_argument('strategy', help='Strategy name') + info_parser.set_defaults(func=self._handle_info) + + return parser + + def _handle_scrape(self, args): + if args.strategy == 'all': + strategies = ['news_scraper', 'books_scraper', 'tech_news_scraper'] + for strategy in strategies: + self._scrape_single(strategy, args.output) + else: + self._scrape_single(args.strategy, args.output) + + def _scrape_single(self, strategy_name: str, output_dir: str): + self.controller.output_dir = output_dir + command = ScrapeCommand(self.controller, strategy_name) + data, saved_path = command.execute() + self.view.display_success(f"Scraped {data.total_items} items using {strategy_name}") + self.view.display_scraped_data(data, saved_path) + + def _handle_list(self, args): + command = ListCommand(self.controller) + strategies = command.execute() + self.view.display_strategies(strategies) + + def _handle_info(self, args): + strategies = self.controller.list_strategies() + strategy = next((s for s in strategies if s['name'] == args.strategy), None) + if strategy: + self.view.display_message(f"\n=== {strategy['name']} ===") + self.view.display_message(f"Source: {strategy['source']}") + else: + self.view.display_error(f"Strategy '{args.strategy}' not found") + + +def main(): + app = CLIApplication() + app.run() + + +if __name__ == '__main__': + main() diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..55e2bcc --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,3 @@ +from .scraped_data import ScrapedItem, ScrapedData + +__all__ = ['ScrapedItem', 'ScrapedData'] diff --git a/models/__pycache__/__init__.cpython-314.pyc b/models/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4575285edffdd3b11b391b88dcb6c2cdf018ff8e GIT binary patch literal 253 zcmY%3$wi3;sVSZ%skv~DOJYf45y+$>W+36G$#RRQ7@{mb1x4x>dwhIi zPELIMN`}uMi*Fe^Tg8MHrxq2*_@w6Lm*vN}q!wqF$ftit!@jipm18#{Kx)-=Kn%Iljfx-YT Cq(Dgk literal 0 HcmV?d00001 diff --git a/models/__pycache__/scraped_data.cpython-314.pyc b/models/__pycache__/scraped_data.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..caa53e4d96c29c0469429ceedb732c24cfb2f65c GIT binary patch literal 3252 zcmb_e&2Jk;6rcU@dTno-r1`Y-*`|e>ltiu5QqrVQHKY_Ov!q3k5Lk@8Y29q>?d%3f z)r0vGL_#7ylq5n>acgdEFa0~B24YsAR^p80)Q6NC?~T{V#x3ChBkkL_Z)Ruaz4x2n zo9;a|K?3d1AKR{cDH8GrepH&zRZ0|;8)Sm076tqkhxhMaH=%vX7`j3sJ=wU!E)GPHD<+uMc{qCwc>_zlTKSDDMPP2|JNA5|-uo zrqa5RigJz&Hr-Co=uyED&!;Wh5l7NV+YwG@=92CL>;(?7R!YI^J#b;1n4C&XenK*Z zW-?92#eHPl7gyYIo|noU=gOa^e~cXERKA5=meHBZb*9WLB3jIV>NA65#0;qtY}xOG zE+lEf)KlkdeP)GoYE$}DV%D&=sYKGw(zztg>ds7Xe*!$E;~-9QH^>;7;9vNHkPpDx zPTt^Bu-iAexAEcN;g9l%BQVr$eOwQLB_yibvoy0JPzgF5!Llj!g9g!)rm}P`2G$Ic8+zGdmunmn&(vL9t9M|5l2&YF|QCn4bWRW+N+w%f!zg_w@c;0Udg+sLlwY|@u_NYT(7ECK-wold_~7+ zr)@)b{K;&_)-wRJS!y@|#Ghp+X3VIMhG7DViJ@&M&}k=-wzB2u17bx>H>NC1dpB*s zUca5yFd0sRH+-&SsZ7NMI+el{svzkWHDYhd=$Yeiev8P>V z!;LsifOY_CI;kaWo2EaUwRH>TtoNLUq;43Rw!)QN!5qC@_5_hZQ7})Q0R=qCk&Pf} z>%J}DQ|>5hk>T9AO%Y&SL~L)?fG#weMg0TKq+Bee&G9k@+trh9V!)S`fP?llH@i{qSs)z8^^+gqQT;b9enpG{1 zd#!4f8B`IF_ms;-pRWhz>|*okWX0!5R(6&qb*BbuHI&gybBy@t5t!ErT5i2f*mM94 zQ9nHiFFJ$*N0jMp7_|-*IEWqt;e{0&v{hXgqTK4jQuICy$Li9!kXoG1PZyN7rHktw z{i_}Q1*PG3n~E^{Zc+B8&9T9*#o>|gF*kHl6ZvHOu@1tq*R zu-?|Y+SXePNmzWOK=7|e5@{Z`@HE{DpYGkWgG-QH@br{k1+g2Kck$t&V%+zfll6wVlr2Axo%Qm(AXk>10ZW>xc~qF literal 0 HcmV?d00001 diff --git a/models/scraped_data.py b/models/scraped_data.py new file mode 100644 index 0000000..80e524b --- /dev/null +++ b/models/scraped_data.py @@ -0,0 +1,41 @@ +from dataclasses import dataclass, field +from datetime import datetime +from typing import List, Dict, Any + + +@dataclass +class ScrapedItem: + title: str + content: str + url: str + timestamp: datetime = field(default_factory=datetime.now) + + def to_dict(self) -> Dict[str, Any]: + return { + 'title': self.title, + 'content': self.content, + 'url': self.url, + 'timestamp': self.timestamp.isoformat() + } + + +@dataclass +class ScrapedData: + source: str + strategy_name: str + items: List[ScrapedItem] = field(default_factory=list) + scraped_at: datetime = field(default_factory=datetime.now) + total_items: int = 0 + + def add_item(self, item: ScrapedItem): + self.items.append(item) + self.total_items = len(self.items) + + def to_dict(self) -> Dict[str, Any]: + return { + 'source': self.source, + 'strategy_name': self.strategy_name, + 'items': [item.to_dict() for item in self.items], + 'scraped_at': self.scraped_at.isoformat(), + 'total_items': self.total_items + } diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ae45045 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +requests>=2.28.0 +beautifulsoup4>=4.11.0 + +requests is optional, the scraper uses urllib by default. +beautifulsoup4 is optional, the scraper uses html.parser by default. diff --git a/strategies/__init__.py b/strategies/__init__.py new file mode 100644 index 0000000..b52c61e --- /dev/null +++ b/strategies/__init__.py @@ -0,0 +1,11 @@ +from .base_scraper import ScraperStrategy +from .news_scraper import NewsScraperStrategy +from .quotes_scraper import BooksScraperStrategy +from .tech_news_scraper import TechNewsScraperStrategy + +__all__ = [ + 'ScraperStrategy', + 'NewsScraperStrategy', + 'BooksScraperStrategy', + 'TechNewsScraperStrategy' +] diff --git a/strategies/__pycache__/__init__.cpython-314.pyc b/strategies/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b5185dc109bfcb8ac29c78efe90d24e44f1cac1 GIT binary patch literal 449 zcmZut%Sr<=6up_rbXu(yQ4}pwQ4nTPabp)EE~?CIv=piv832iLCs zqY{{vKTzlon6y3+djp4a5BHvvWUI6=2d1{)%J(4x_^{1)IbUR4H{=zrP!l2u5l0ov zQRIX!cPHG5aOiPw!rdqr`rNNT*_rC#O}qm^Em&2zh5q_XXs zl6T887Oof9{CF#@?6V}h<_S0QEAwvbdM8UeeKHM+g0Q9Y+ori!vIjk2AdD6M9W4o{l8``b6058xw4$G{95LVbTm|@d^=q=&L4N(^a7CEvu zLs4_%B*(cIxKdWCUd*|qTMNzP&fMM7Q|Sv?dg9l^H(_bsm)mg|m2Q?WI4%*hSW(rN zrLrr1E)}z4CfZ5*ICtyyFh)P;$@n=4Gu_@EOeTj>95>+zn3+2uv6od_8||PFlR}G- zBR0Ejp|XqZLAaLo37jGQU{g{+LF7;-R$5UqdOm+@ryC?STob<8ePRH$eX0Xt?Wd(m>@xqtXNwr zW)qupA_Y6Nm-AX!X#}KW@4jxhLC4e2`DRtfIH=Zf2sjrsZekQgVn-s3d=c-6ak5R3 zZ3M>$yT0miH;zTM+=zXNcMf(9nCAxp=S7yb2l4(e?GAbuL4tZxE~7YphY$7H96Hi) zB-%Py!!6QU7FhY;%;d|rj6eGh$(N$13`<2T(cQ8qXw(&?#6kl6KnhB(sz{ql5vHce kzMoR`KwQTVs#}hsXz7fxuQ2@uCVp5smiyox0&XhTFX`bp(EtDd literal 0 HcmV?d00001 diff --git a/strategies/__pycache__/news_scraper.cpython-314.pyc b/strategies/__pycache__/news_scraper.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f26ebe7fcdde99af2a49e155484944bea4f1727 GIT binary patch literal 4373 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 literal 0 HcmV?d00001 diff --git a/strategies/__pycache__/quotes_scraper.cpython-314.pyc b/strategies/__pycache__/quotes_scraper.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fed4be54ec308a24fd4393a151e027948eff9869 GIT binary patch literal 3938 zcmbVP-ESMm5#Rgd@l({7^=XNwoVcti%C-`_m1WtE6sZ9m_QKS)Xm>R~-z*%h%wW zut&8-z=M59jzxZZOvmD(lxG`D9wpL%~e80(9vj=Tng~dhiei~Vf zj4bv-$l~^)dGNgrS^Tt+MMoK#Z9{XC%t0R?s%f#r8jq(u;R#-Veg(e6R{_GYBv}G| zK{;rJvd9X{A&5fQZF#{o=j~m7=9t zmxxZq_JUXHoO2w@9v&Q|v%?&8FS;RSQm2r7nGiGg~HQ}BZ z8=g65YuKJSs};zjz-t)nJY!p(dyf#t!u8ND0)G66vf@Y zmz!yy9fqy!ICR%hrS)K$|6!=oHdN++6xk$B(rEZT)}nzn6TmsaEJ8Fcu*biT&}$H* zZuBiC4`=uaa~`FcJ_NpqSaXWF05c9ug-asNns`BV+^C}Dzymw4=fFUl=uKS5%`mtT zMNta{(}6n&rXP5U>Dwa2a=Qh($Jfy##0Z@aNp~|x2fPm$dmm^gaEJpL77 z01Vs+op&Cdfjm92jy(+{Eb@^Zf$lnb(9rx&=|*Wy>ex2qOT`km6HAE6DHeB=`F`kj z#trunYAKfXeS8!BR%YYO)5?g{Fv3+V<8V1JtD%nX7-pP6g{<05r;cox^3h40*Y`nh%ee z=q?5vWdT4EXe#E53h1>2ffz%WBJYtlS=@U^YKtHT z{8#}fNro^gXpDx2x&26Ec4>w?K{a>O6eBqzN3(()^DY0phExMQ#AiX?jn+W;8b$I_ zh~V|Wnaf(iDTQA)OS)mGgU_cALqZMAX=)z8oJ>iMHH%J3C_1wPUoUk{sJfx$6ONgf z)tua1;u1+BiCJteBtX2$#QJ5upc;ziXV=Vd<{#uPXG#GX>p5*W0l7zTbjN^fk~0eq z7~pb{<4fJ!x-F8BsqREgq|~fpN6#5r+QMeO2xx4Xc>rn&vXGW@OpFI$lT?&GG3qc* z0s)gF#pGtYJO-~^F|Xy!yygb$=^jgj8v~0WNr7JK5f%wiQuBF5hZ+Kt+noyGCaMT( z57iA|uNrYBtl5@Xur-&Ta~2Gj(OkjPF-W8Zi+JtwM2$^qtVF$eFfDqC_Gy?z(=$Z` z4j#pIw9(MHeDMAL_xgYP?cY!TZu(xsWSOtBQZTl$Z~s#M&iw8956}K#U~Ndgx9^qm z*URoKRNYrbLyk!)XJgt=A-5DYAha%Ra)9VZaMT(%b^v1 zy=9>M;)BF9%enVM%b}Z*cZH3%WTmsW((}x+wtRlAd!W+ZeJ6Z7ycOWvo8INCA=KD< zD|$1!l)oSEdl*Fr`l~%C-ck-f-a3Nf9b1S8+nSP3HHWh7hb8<`s#9Z?f=SereW{OV>>&7_NZT!e!0n7W9J48Bp4zL@I#v}?ytN#mSs#-ulSxHL#Y_q~C_6)nvH);skU12jSBk1p<1{GBtd4ER&`H*1@K?#X=Ak1=4EQwZXdGIh#D#iR&nXa5tY0dUN?maqcND=n%`g-NN*P+$ z!Sg|?9bZ*x+AxYCFh=}|lbOX9iR2VIq880Hhy{}&YeE872e XGz9Zc(D5zt8%*ocsed6DsFMEzOT1h} literal 0 HcmV?d00001 diff --git a/strategies/__pycache__/tech_news_scraper.cpython-314.pyc b/strategies/__pycache__/tech_news_scraper.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..915421c8d4250a261b8bd0f1b2b2e31adb8f278b GIT binary patch literal 4325 zcmbVP-ER}w6~FW48QZbre30*tAq0U5aYzCIkr2oxBt-3crv^lTz~I;uY?ydv?@Ts} zwXJxlRIgfXp;Kv11pmW@WXIwPJamkeEn4j>D`%K@s-}JYm9cU*~gnFcS&I|pVE8nb8m|Z9= zhFM3P$GTx^8Apt1@6T(N9St*1<>>^Dn;JfCa4mQ>!lRq!S zP#>eP^(ZAN9Mqxyq7)M>p){V-z_txEky1RAA`*%zDH6!@DqhnUL#AKxf#rUu{*0DL zMYRQMlc@=2gRU&}L0xIJ13GtLGh*mknXE7{Dsw9=h~=Cr8^o#^kgHm*53>y^+cvGE zJv|Ex3z3>}kv0pR{I8zxCaSdBc%ZHJwS@s_Mwwm>Vf^kTYq8pt_0j zJND-I-}v(Ny*d7qidAAT^-9UsqF2zW43t6U4tV7Pd-#_KT>)RUp!b+0Z0FCIb0`9b z3@q|s&7Q{@=y9MhoEOimf#>436HwIz*kL8p3DD6Za^;)28XBiURpXhAVZ-qQ?K`*E zex0il)>*Ysy}5~ABSvUiA=T{!ZSW2tY`wQlKp{3nq1{}F{%|315D1uf$K4oLN1kq7 z%XYdEDp_Y$Ky?#+Q(5!d?8n(l*!d z&wySYqTc`YO&!so>>F9AT|rRY^V4Qs6X2pngqmW32fTC#O_ekxCx`fLQ-N82(-aI9 zG*IN#nPxOaWYV&=3b`#5{_3KRFo15<+A95z@seaCwNnd zNu@8fqsa(DUetzSfFClNBA1930bP*^!sxiY3ERUF`uAS3nev-C(4)q_7 z^bbHR7E@Y02_b-V?ev^x%-dOE-k$9~l5HQ4r*$nU+lD-=*@={FL-3JFXpv{JF(<>4 zY6GXQrZaI})k?uRdNlfPa&w~&30Q)iwsi!FU>NpdasV7Y2?>ZJVmEVfB&=Dck+C#~PuX+2 z!@vj1avZ7Db$BAkB3DT+6&KMxZp{83?4mK9A_ohX=O%ht*|gO8$F9%1{&MDT=l^>C z>&l57UtoRS;LEz!#pM0#_pawdEz51w1&%!!TtjSqWo}~4gBscw7ap-+*Z1d648tYq2$g_S7h~d{;&g(hH zVD23k<|a+IohpNL`RfvR!y98k*KW|&clN;%@KNy_0QWH|N^bI|67!XGYDY2emRfA! zm;_xZ*m@y>WxqWzlKL2h{c{GLdu&+X_h0< z4jv|)knMxW(0nEhkFRymbC{Gx!g&dvprr_f2gss*+oe`-qvsLexBdhbr1iCRId8#( z0wis)(9)t_UD)Er>!j zzn;(W`R3MTso_OcQ*I<*8T#bs`B3d$>9(|3^{GD}lAnk6JPGZ2z&s1>TMYS0B*GV6q3GdIx^&+KGRcF)KvPs;?7^;d%M&n2( zh6gUTZ@8g|#A|$lRMeL{;NbzUjC4YU4a4b~d0VqUaMgyVNkY?gRfW8g=Gkxo(Fu1m z$eRh1ii8qt0;)H^0!ROcWrecjH^+#Z2CT?k^cPA$J=Xk(Xn(hWs8k8Mh zIT5gE%%uU9TJaFM-=z;QX~=c*FunqEh|yLDR0WP ScrapedData: + pass + + @property + @abstractmethod + def name(self) -> str: + pass + + @property + @abstractmethod + def source(self) -> str: + pass diff --git a/strategies/news_scraper.py b/strategies/news_scraper.py new file mode 100644 index 0000000..5e7e238 --- /dev/null +++ b/strategies/news_scraper.py @@ -0,0 +1,72 @@ +from urllib.request import urlopen, Request +import re +from datetime import datetime + +from strategies.base_scraper import ScraperStrategy +from models import ScrapedItem, ScrapedData +from exceptions import NetworkException, ParseException + + +class NewsScraperStrategy(ScraperStrategy): + def __init__(self): + self._name = "news_scraper" + self._source = "http://quotes.toscrape.com" + + @property + def name(self) -> str: + return self._name + + @property + def source(self) -> str: + return self._source + + def scrape(self) -> ScrapedData: + data = ScrapedData(source=self.source, strategy_name=self.name) + try: + request = Request(self.source, headers={'User-Agent': 'Mozilla/5.0'}) + response = urlopen(request, timeout=10) + html = response.read().decode('utf-8') + except Exception as e: + raise NetworkException( + f"Failed to fetch news from {self.source}", + original_exception=e + ) + + try: + quotes = self._extract_quotes(html) + + for quote_text, author in quotes[:10]: + item = ScrapedItem( + title=f"Quote by {author}", + content=quote_text, + url=self.source + ) + data.add_item(item) + + except Exception as e: + raise ParseException( + "Failed to parse news content", + selector="div.quote", + original_exception=e + ) + + return data + + def _extract_quotes(self, html): + quotes = [] + quote_pattern = r'
]*>.*?]*>([^<]+).*?([^<]+)' + + matches = re.findall(quote_pattern, html, re.DOTALL) + for match in matches: + quotes.append((match[0].strip(), match[1].strip())) + + if not quotes: + text_pattern = r'"text">([^<]+)<' + author_pattern = r'author">([^<]+)<' + texts = re.findall(text_pattern, html) + authors = re.findall(author_pattern, html) + + for i in range(min(len(texts), len(authors))): + quotes.append((texts[i].strip(), authors[i].strip())) + + return quotes diff --git a/strategies/quotes_scraper.py b/strategies/quotes_scraper.py new file mode 100644 index 0000000..b2c2dbb --- /dev/null +++ b/strategies/quotes_scraper.py @@ -0,0 +1,67 @@ +from urllib.request import urlopen, Request +import re +from datetime import datetime + +from strategies.base_scraper import ScraperStrategy +from models import ScrapedItem, ScrapedData +from exceptions import NetworkException, ParseException + + +class BooksScraperStrategy(ScraperStrategy): + def __init__(self): + self._name = "books_scraper" + self._source = "https://books.toscrape.com" + + @property + def name(self) -> str: + return self._name + + @property + def source(self) -> str: + return self._source + + def scrape(self) -> ScrapedData: + data = ScrapedData(source=self.source, strategy_name=self.name) + try: + request = Request(self.source, headers={'User-Agent': 'Mozilla/5.0'}) + response = urlopen(request, timeout=10) + html = response.read().decode('utf-8') + except Exception as e: + raise NetworkException( + f"Failed to fetch books from {self.source}", + original_exception=e + ) + + try: + books = self._extract_books(html) + + for title, price in books[:20]: + item = ScrapedItem( + title=title, + content=f"Price: {price}", + url=self.source + ) + data.add_item(item) + + except Exception as e: + raise ParseException( + "Failed to parse book content", + selector="article.product_pod", + original_exception=e + ) + + return data + + def _extract_books(self, html): + books = [] + + title_pattern = r'

([^<]+)<' + + titles = re.findall(title_pattern, html) + prices = re.findall(price_pattern, html) + + for i in range(min(len(titles), len(prices))): + books.append((titles[i].strip(), prices[i].strip())) + + return books diff --git a/strategies/tech_news_scraper.py b/strategies/tech_news_scraper.py new file mode 100644 index 0000000..c8f3969 --- /dev/null +++ b/strategies/tech_news_scraper.py @@ -0,0 +1,81 @@ +from urllib.request import urlopen, Request +import re + +from strategies.base_scraper import ScraperStrategy +from models import ScrapedItem, ScrapedData +from exceptions import NetworkException, ParseException + + +class TechNewsScraperStrategy(ScraperStrategy): + def __init__(self): + self._name = "tech_news_scraper" + self._source = "https://www.bbc.com/news" + + @property + def name(self) -> str: + return self._name + + @property + def source(self) -> str: + return self._source + + def scrape(self) -> ScrapedData: + data = ScrapedData(source=self.source, strategy_name=self.name) + try: + request = Request(self.source, headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' + }) + response = urlopen(request, timeout=10) + html = response.read().decode('utf-8') + except Exception as e: + raise NetworkException( + f"Failed to fetch tech news from {self.source}", + original_exception=e + ) + + try: + headlines = self._extract_headlines(html) + + for headline in headlines[:15]: + item = ScrapedItem( + title=headline, + content="", + url=self.source + ) + data.add_item(item) + + except Exception as e: + raise ParseException( + "Failed to parse tech news content", + selector="h1, h2, h3", + original_exception=e + ) + + return data + + def _extract_headlines(self, html): + headlines = [] + + h_patterns = [ + r']*class="[^"]*headline[^"]*"[^>]*>([^<]+)<', + r']*class="[^"]*headline[^"]*"[^>]*>([^<]+)<', + r']*class="[^"]*headline[^"]*"[^>]*>([^<]+)<', + r']*class="[^"]*title[^"]*"[^>]*>([^<]+)<', + r']*class="[^"]*title[^"]*"[^>]*>([^<]+)<', + ] + + for pattern in h_patterns: + matches = re.findall(pattern, html, re.IGNORECASE) + for match in matches: + headline = match.strip() + if headline and len(headline) > 10: + headlines.append(headline) + + seen = set() + unique_headlines = [] + for h in headlines: + if h not in seen: + seen.add(h) + unique_headlines.append(h) + + return unique_headlines diff --git a/views/__init__.py b/views/__init__.py new file mode 100644 index 0000000..c5de988 --- /dev/null +++ b/views/__init__.py @@ -0,0 +1,3 @@ +from .console_view import ConsoleView + +__all__ = ['ConsoleView'] diff --git a/views/__pycache__/__init__.cpython-314.pyc b/views/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a4ac0a4e3e2bb9dcdd87422e9562834fa380094 GIT binary patch literal 220 zcmY%3LV*yhDlQM%Q zvnJy$Zs+{G;{2S{u*}r*B9JyeP3BuX$q>Q#GMMNs_W1b3oSgXhl?X+}FA1e)pVnuTWf6NFaT7ujcK&kozkZvdNgqtR02ST{1#M(o3TFXL^}) zhN$5j8)eTKqecfQC%cGfs30QSW=Qvnaw2IYPNU1oYR2gMpaFc7|^TvNPbH z%@o!qA@c^z^BRdVB8eJCxG1}myhGgN5F;`bWQ@ld#%xg|<*<}vq#TZNILa|mj)`*2 zl*3bwSuCNvLdvrsZ;XlZlxL;9BHFG%ERGhsNz@`1fc!Si(iI6Sk&tvLC|wUQAR~U5 zaG@ytngHYka~A|1F&z5=A#VYMII9)cY#@@^q!LbuR#?F zWcCvCgoh6n#;+wHbC=W*PgW7c&9r6m4nRO75r`+(lOt~(Ky^6s+PgR$GCzrcE75Q? z)6-?nuf>u`vh!sB4pK*Flt>3#M48W)v= z;h1J04hI8~QK=_PDON)(TF^|R5;A8Eno*HLSL6biIK3r;Tnu@wWHhM2&^LXV{nTpo zO5RjS_52cayG2$EY{3O)*;+ce?~d!qa>=fB!ekjAwSL%|teC5sY)#ouEZNV_+s{5Y zma-2lSJ9P*$O|o2uKEfbg44V zDcgWxwH_`W3KtJ^uMOeiVdPS1kOvo38->d+A(Iam5ddQ)2MrsWC>p;8nzqfL!CqU! z20$aS&xB15p82x^bYR{bbhtSGdXL*Z=zc?xcYx4x8Ip1!E*Vb>XsHf4yMW{YqA0uP zRHIteR&bzIREr{XPlLfj!O)i&PV}nw-HX;eSy1FEroB_%nSJ-232&;dd#P?sL1T05-TFD+SLMR0hSr)v}(#dh-JGSB@z?c+*Lj#XWc7LLL+BJ9Mx2<2cbW+~e?M%)s{Tlk;)j63BX92DUg`vsKj4*8( z7h@yc2h&G6+^BPA1}iusH!J3?87v38VXrn?i!8J>>NS#YWBS346_9$JT)?0STqOs( zGsSBPPn|j?bYAlZL;lMlNf-*q{wTP80oYFst%7C@`^TlYMG%Cc$b=k_It0z6(3}f& zi^|gqr0~SJgj?V=rmfU|WV6B18ycV4o12OecrZ%FkJ+}t>;^qauWw~x|GCp^3vF^xw7jAcHmfx)s=al=`XW{gB>9=j zFNH&@qfNCRUbG%r&n9_%1g1j7c$Sns)$HsS`DC2aNDE)m>&@7 zzb1|PqW;(zC<#Y;PB1#4sZs-kf^iquu}Xl_X$F&~V&zT7r_ zP0!KSyiH%;gHE5OZCVtx zmX$rX@@|T-t!FF~%d=V!nIVqf*fn!@oDuQZPjfgmi#zq}6DyjtONaje<2Hx*4Y|ci zH@}^Zv)Fc!{yQ17xG{ImypC{m?uJc!SEZ9v*S4A7U(*7C#;WyZTC8a#_`!Vy&nHcA zAECO@pQMbgx7LT)MPCq$8b^O|Yufvb3Y{@%QK(Q~IO_Aq zU|cll!o^635Z_tY($bP1M-XKR@4f*&(BSTGinX9e|S^?Z#y25C4ma%au#UjF~8!E#bo(7j!AtkdsTwxjF1$T z;et!#DkK;s$>=|<9fPT(VygZXwa%>;4=wN)v8gq2aoRKGNrvWn zQgt0_?FqH`dt)& zwx$)H*vdY*@!pL@!BR=X7bOjks_Unlrkaw+XD+9z4^Em_3|wi;a{Gzsn&iM9I4dJQSt3m1P7dqYg)ulRfXOvT)u zl+eB;oS7HSJTR-`YpQT2C5$Wy{&~T#UJj;&w^heG>dw%jZ5+aT7~wzbHd6V*Ix&>C zJQDVyyh}pcywEn+`=DPH+ERjRNf@3NhSf`Nq=Yx~7qM8@yuv}prwRsFf3P(4@`gWF z9O$bu{E6?h^zGyxmNQ7JIt~5x+@I?hpj!uLi2i2MOb%Y2h)D{JQmT7-3`n7n&j)L! z&p-_HdMW)1WWrI9pm9}j%qKsDRXjG}v*8MTHhgTwS0K!L7|eTV-V1rS$gSXQ?r|}M z&;P<0`tdmiw(Z}zcXZu!Xr~DtMQ 80 else content + print(f" {truncated}") + except UnicodeEncodeError: + truncated = content[:80].encode('utf-8', errors='replace').decode('utf-8') + print(f" {truncated}") + print() + + if len(items) > 5: + print(f"... and {len(items) - 5} more items") + + def display_list(self, items: List[Any]): + for item in items: + print(item)