From 30c093eaf92774bcea0a0424558b2e42687670e4 Mon Sep 17 00:00:00 2001 From: rocketlaunchr-cto Date: Wed, 13 Jan 2021 16:43:19 +1100 Subject: [PATCH] - add rate limiting - update readme --- README.md | 40 +++++++++++++++++++++++++++++++++++----- go.mod | 5 ++++- limit.go | 10 ++++++++++ screenshot.png | Bin 16528 -> 21267 bytes search.go | 7 +++++++ 5 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 limit.go diff --git a/README.md b/README.md index 657a93a..b035c37 100644 --- a/README.md +++ b/README.md @@ -17,14 +17,12 @@ Quickly scrape Google Search Results. package main import ( - "context" "fmt" "github.com/rocketlaunchr/google-search" ) func main() { - ctx := context.Background() - fmt.Println(googlesearch.Search(ctx, "cars for sale in Toronto, Canada")) + fmt.Println(googlesearch.Search(nil, "cars for sale in Toronto, Canada")) } ``` @@ -53,14 +51,44 @@ func main() { } ``` -## Warning +## :warning: Warning The implementation relies on Google's search page DOM being constant. From time to time, Google changes their DOM and thus breaks the implementation. In the event it changes, this package will be updated as soon as possible. -Also note, that if you call this function too quickly, Google detects that it is being scraped and produces a [recaptcha](https://www.google.com/recaptcha/intro/v3.html) which interferes with the scraping. **Don't call it in quick succession.** +Also note, that if you call this function too quickly, Google detects that it is being scraped and produces a [recaptcha](https://www.google.com/recaptcha/intro/v3.html) which interferes with the scraping. **Don't call it in quick succession. It may take some time before Google unlocks you.** +You can try the built-in [rate-limiter](https://godoc.org/github.com/rocketlaunchr/google-search#RateLimit). + +
+ Further Details + + + +
+
+
+

+
+ +
+ About this page

+ + Our systems have detected unusual traffic from your computer network. This page checks to see if it's really you sending the requests, and not a robot. Why did this happen?

+ + + + IP address: xxx.xx.xxx.xx
Time: 2021-01-13T05:27:34Z
URL: https://www.google.com/search?q=Hello+World&hl=en&num=20
+
+
+
+
+
+
+
## Credits @@ -71,6 +99,7 @@ Special thanks to [Edmund Martin](https://edmundmartin.com/scraping-google-with- Other useful packages ------------ +- [awesome-svelte](https://github.com/rocketlaunchr/awesome-svelte) - Resources for killing react - [dataframe-go](https://github.com/rocketlaunchr/dataframe-go) - Statistics and data manipulation - [dbq](https://github.com/rocketlaunchr/dbq) - Zero boilerplate database operations for Go - [electron-alert](https://github.com/rocketlaunchr/electron-alert) - SweetAlert2 for Electron Applications @@ -78,3 +107,4 @@ Other useful packages - [mysql-go](https://github.com/rocketlaunchr/mysql-go) - Properly cancel slow MySQL queries - [react](https://github.com/rocketlaunchr/react) - Build front end applications using Go - [remember-go](https://github.com/rocketlaunchr/remember-go) - Cache slow database queries +- [testing-go](https://github.com/rocketlaunchr/testing-go) - Testing framework for unit testing diff --git a/go.mod b/go.mod index d20431f..64e39ba 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/rocketlaunchr/google-search go 1.12 -require github.com/gocolly/colly/v2 v2.0.1 +require ( + github.com/gocolly/colly/v2 v2.0.1 + golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 +) diff --git a/limit.go b/limit.go new file mode 100644 index 0000000..f91ad5e --- /dev/null +++ b/limit.go @@ -0,0 +1,10 @@ +package googlesearch + +import "golang.org/x/time/rate" + +// RateLimit sets a global limit to how many requests to Google Search can be made in a given time interval. +// The default is unlimited (but obviously Google Search will block you temporarily if you do too many +// calls too quickly). +// +// See: https://godoc.org/golang.org/x/time/rate#NewLimiter +var RateLimit = rate.NewLimiter(rate.Inf, 0) diff --git a/screenshot.png b/screenshot.png index 3bd40ccce6390a710f35f53f9e26fc077e0886a4..ae3f6205020f6e76d78f24a3a2624c98a5f936bc 100644 GIT binary patch literal 21267 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 Kw942e=6?YB)9EGv literal 16528 zcmcJ0WmFtN*Cr%La19bP!Ge?Ep5P<_g1fsrgKKaL?ht|nCpZi+89cb#0E0UW4ukHH zclVtA@tytl&(|Dkdb+D`Roz>C>$y+eiTtW4i-Y+J6A1|kM_x`!1qtbyA`%iZ>I*c) zm6se=eTXmLtR*GC%1cVpI=MJnSlgK+A-zrTOAwXo`as!ZsQOu*1=j<=^n1RLHvUWJ zDHh^F*g)IF_WBy?Mqy51pJ5!DqRT-(p@3{Q4si zqY+C?WW5mYa~)0@5T*CNWx!}d>%&VH`aZk|bP$jiD~ZTK#rK zG!Tz7lw!dZyU`HLMW8b=i*vkhJE2q{FV)l4pKqlB3l^Up20pDHd{ zGphIO;u1oadiYXbwENCX5Wu=fF zpZlRB}GC83$S*xqLr0b_^KI%ONxXMl}Q)) z5ph!JQ0x&DfjEMb{`>N+KqR8l|4;dUi<9Gau_f)#FMMNirtn(<>=2#kl2ywkwZ@l< z>Oguef<}%U(rAq)Xpiku_oeM7^4{ zw4{eE+9{nyEGeuZwSjLw*Jy9c-w!sE9kZCJ6`)~@ud^;mS>%i{cXk8dl~8S3d=cmO zkH2hs8e~7R)jU6jK@N@S(E{0=g19f|$~!XQx#7?*k$MGH*5rB)NhU+JZJ&;2w=$1p zInmN`MO;tTM#l7Grn*MD!!Os-@L(8d{g;V zIb#?EjXpiu^NdcVGs*aJBhu^hx!`UMTb$`~eD;%+6j;76r6%YqwHH1MRF?QXGdZcJ z=Wv|1OQ5)yw4!P0C4W|aA^)!$s=AaNwYTuVf%=JtZg0G1pLRPt*pTCLl3P}_C^CZb zikXH5jkO7~sX*O%eSvS4s+(WUnkq!||jT1bU$T1oSP}|UEvv*e8Ugyf77w;9`;#3KN2j}~| zZE__)<^M;|En0jrKJ1-w6E~s79Xa}oenIiLeDiEF!af6lhZz&uPCl<+3&6Q*H zZ+@=OPuwy3k(mD7l4=)oJ;KN1&)Mr)8oG+iof=gbjbj8TM%CB@^!~SOxZT@&Ph*et zo1tXqC3ypXo=(Zn!;?!45VN~!e+~OOvgOI5khlM&p4(AS`!h+jQRnYkGWoQ)HJ9`Z zE;IIgwIU=CM6r7I#hTZGJ-+V!C>$l36#L9cp7n*on|}{hm|%E5Bt@)W;T>$P^{Te* zylee;BRpGsaEJLmV_{w?V^}jgznId|!d0*=bbQb`3vgPO_0@^coYJ0k8t6nEGq1wud zd1$9gi3ATGcFCQYHo_vx2aTJ3E_;QY@Q-ra!PA(*rBr>m{*n5p7#_Q6_y+On3E}pz z-Y;rK^A1jytC()VQ_Ez#eI{nPfeG(WVp7G6q}Pw9w@^Me(q9WfO>`5a<+XpF8c#P$ zTl|p@w+k_#Qiu~B>ZzgTP-#Q=7;fx(ZDPp&rqS))Nkh53-C!5Xd=OQoodTaP_0SM* zbE`+s5|C#3qvQ#;K(YH2e}eaWJ4j;#MPZT1r9tv6>CDpF#>w1JGjB?u=6EUNiM#C! z5O-34AI$WSqx5QfIEKxaDKG4C=y$Wvxy?hgqZ7tuVu)%{nDoHha%*ja^O8&32$+FRUflVvUG%6Sa|32iV-P1G}Vu&#dhvOZ6s=S2# z^GueYW;Yu;+;j!IO%;i1B?h4@$pg8H<%{8ft$CCY5O$ruk6+McU_J?xwenz-fbe|W z!K$)V*+;t`6_(t9%$+o>R}GZq_20&9RbRC8p~69#|zGXSmSxq_2O)nzv45CNk-efdNv?Uro}2f zzFhHq&34mrYi?jOS@f3dq{xuBtV8|F1806|5{8~HIkR{NZWqlMsSe`JwrMl!HoC{f zVv;GS06{DfaC2}e&+1cYXc7h_a)2+RBW341(z z{%h#*w~wAAwzt0pTeCVKm>NiT80MkHs3jx5i0L?rQguB%iho&*{0TTOpv{zq@GbB4HY7nqb$e}pre;5FmH=8`YRxHkA^=A3Bgo`a zHgr>VA}l@91QNB(I}9(?%kE64VLY5w4?pzq2CYb5;b&fcT9=qimHn-uA8*~4*>vZD zZF>=`rAzHFEm*k^9JXRKHPX4>bND~U*4AI_eKrfJBVW*7Dx zlsS2v{QYZnGvzkmx5?hhS-g}gVe#n@Lhf(LXs#r>@N<*RXU#a~9Q&^1vF0J)`W8#e zHURQ-vuS1-`G{?3M057G4)V#)pP%`Q_VpNsf`&5z@aPT|C1kkcXz8&HPjkD zsR)5YkdlSlkcw{b9=3|@89XY%%#ALBKpJb$&q*06kr_$Rs~4uSU0RSvz`@5}rBnH1m9*)@b_$nI9i_y(_wPxW1eOU3Ch*-4oDMUUokFjE7+Ox8M8 z03&6HxFSv+@TYM;^RVSuOXbJ1Sz5xnztEH)&21^OwveCa58@`UUjb<~t7j{Fe#A!{ z`rz&G+V>TeSs2y&vE+cuLL{QM_xm|!qQc~L3aN_e2@T9il9Gs%#l~Xk0gLU zvnQMZ#*BM_agVE=$j5Nf6$&xTI?29!10`ZRCLx$=r{gefhjGpsK1sZ)_bBYIw>P0o zR0t5XRz#nw7iT@?I24y4Mn-p4l72Yy%y65fx&`TtmzMBy_wpsNhf~JcDFp%H=YZhb z>zXt{`g?1oq0FerKRdOc$WJZ`*@8oGo)O z7?flNgnW zpkzI@Lh^@YA&=Ubt@)^EWWyx<+jkit?4=gd2mR3Z?99iWGiM)uvj@Y*X!8;1clkd-yn?mVwP*t&18^~rC1nr4-qyKu+PhgaNMxk z{yW8Woa6M~KF=Q&_PdL+y4-g`iV!+Q9dU3v-QDys2#>S6l3eU#??rrMD}`Dc)r*r} z9do|Eb?YmSa`eLl`YIf5Hm#mqb;hO53l47V+Nw4?X&oZ`$h?{OGw3@igX5S> z(ls$}mSzfp`C=xlt9RAL^}@5-@I$hh;#(WP(QIDl8B!rUh4{N}rKUz4;Y#ZH@r?x5 z`@%*i&sx?2jP`d+<39TOz{xEdB~8f71F1cC{?()Lx+7R$n7fo%RzXtnTY%eY~g{=Lj?<3#so7&2_L> zI1(G3{ptShbQL(4AJqzQrw!%1dU#%^V9}*vrY!}!ro^&TLVcl-_3a5fO}H!w0Q)y! zQL}SzTx)(E&6};_ExTW$@`{=*x^srjW+m5>iHYw5mZLX+uugxOlM?f;zS%bc)61Um zY8TVE{)skXWadgo9(s7}sogioweG7qEzh%aUdN4AhY-eTcy;X>w9;EA&b$r>3b+~# z;)vt;9gEAtKDTe7>9y$Z=cRe1eMKx`QPm>xOOIE!6&JRYejJT%$~pR7PcZK5{$9;z zI^ztxw{~kAX1WSzd0h^TYS4$*45#C_abgtB$Ao(NtqksfW+2VSJwZ}oZ^!d>?P=JA zucc|-qJBV7!UT8eCcnz<+L1?lounaG~t^~!_Ml0k4s&+jMcn)h>=x^crJe6OiD ztCidrYt^zm2~%HB?6^jI1l4QV@aHR8S}uLY;_t@mw_mKC)Gq%R4jYc6)@>OYM;!_{ za89>}@XOEZ3+5bC`BW4n$=R7tYhe0ZZO5U7W*v?q8I}~!!yl^BwV7u1(I$JBML{-$ zGE)|QAD7%YR(Q##ORW6^az%c?17>?W3^sTCmX%Fy@CtOBzFu~B9W-BuqddZAdqWu~ zLtq=+{l4eg?`iIu6tgEzXE_d^S<64iZ z&_A4;3EEneTnPbADf-G6wwzPCsoeWh$ZXv3(`u znamHQJ;P&vJ$R@-#WcwmgYF5rHu!ASw-UVWA7fn6eVnLhwj+%Lk_x$}H z*Yw_+4rz=_XquLmgH0Wp2ErX(+BF#Gb`z%*LDVA>4)uGepynZMr-5Oc1(LB5ZHF0B zK12QneH}nM_XI=@_tK!_+t^U)w=LhDYq%>f2RCo*AH31NfJ=DXe)f|mNz`M^UYH$@ z33YE0dU?>8(atjR_Z~0CM%c2UE?WL^@m`lbd#K>KQL!b@E*}|gnxkg2<~^WO8%`lI zU!!_yD|vhL3vP3w6R;s${EPrh?@ZPu{v z-EO+S4@fds+dZ}ZiQ{xBHduC;$BRD8xcoQ_RaFNV)dNWI9i`H;SKZe|;cP0s2H$|1 zG&x8J^A~n_yK(J8dwQZO-O*$3^!bvud#?Zfnh~9`28W?QKJ9hfcnopv%s4!j7ZAv~ z&q?4{3E_N5)P~y1mz|iTC*HKTC2DLl%<$;#khreG4W?3&BYaCA4u5(2n zy=};Ru+ZTQ96^ zIKjgnYgisftk(~w=90M=Ab++xx9)?Cw%im)Tx#FTx2)+bD0%0^fJ7ny$Ic2+c2-2Q z;e^kdSIxFVB+sJQdlm4SS}o@eUo4354I-TOqaJ@a;MW7|&N%_g?`jgh-AgIZU8lCw zje%EevcX8_$8mH8itMNycBtH;?j|(6$<@O~uZ?-!%>2=!q^HX1>_NZ@Al&AhCw@cr z{sC59kAUP}V{6D?4G?p!7F4QIBF{g^>Qd<7NcGVR9PunMpc$|M1&K-@v8s9gbM*T7l7XHhRrH9i3C9>tcfLt=e)sJpK(%f-iU6RqQYpH`lxUye1 zY6+kts@BWWMK=dQ7$t$q;rn$N<7kGUpb-g;D{7RH7Oql&yH1aEw+6>#fB=-(vG31omUu0@Iv#js7FVf)c#~Z{mH11M(JMK_ z{)RZpB=IdfXoe1R!(??2Znwn`(c_j$GtOR*!(Ee_)}(?bZXe}NIIBwTcKd4R2%Z#2 z*}CaQ^{`Cb5(-I|O6a2{XW$wMBA-@MIZguU1G8FV*occZ}q| zB=xsN%jYjl zf*#tD+A`J*?~+eT9;eOtKSc0++aC>hILkv2VZ5h4*fNy6TS?Q(EI%)N8bi&=D~9UQ zAEduE!1*|cgv`i1^)3QrWJHjo`I$Vu9AeOyG3%T{r0bDq8zCd-t|rhM_m8bEKtkP1 z1`YqEB}FuR{bTZ(OA!&o%X19RfmJUtpwP6Xjqz+hZ)oqsrMoE0Q-&C^({0LCB(~r$ z@6a=ukhaHCEq}}4ef4E~lc_POyNsfyNdV8!EGM|UFR%2lh1b72$ezNtVSXOjux`l& zt`Tk8+9F>md(s4}g?A;tz@iwN_MOItI6v znHZ##}KYxbPe)V+mDNe$u>6Gb@Q zkQS>S_`-{6Mr%UJO568+9eHrY0~otg3AaPieT#cqB-^w3=RPZ147*#(mLgCIf&jpO zZNgjed?f@}mS^t2vk|>_cR-q^Sb5TL40I&)b<%4eSQCb0t8jEY1B@;=pzR^L{i0ng zWo(E%Zok1i%WU}!se_=vT?N4fB(xs9SXdMk9O{+W4`jWaX7Z-Ew`)hRkZ&m-zqX58 zlA|r>`kkE91hSS8T|dXiP3VWp*iFCxX*+Agw?h2g9|Akc^9wq2vAgG=$<(Fz>QAJ3 z^EHM~5*$F*Ji!9{gJs{j+#c9{6q+*HR?bv6OP8+i=yCT@ea7zKpHIoE{OB~v-S@+= zDoas2<+Uhf9rK)hod_p*q0;$4M(l4>X)sZv!fxIX?dkl%&7<7kzdf$!9}sbpu~|Jb z_Q5G_WSe6|rQRo#vtn<~$)$FtjQGbA1NPFVfJ?4CVqx*o``hRYBW?_5nz{2C-m`3R zdJH_p2K!GiP*#69tnu0du5|l)7qEyU$>+n-BYtLOz=z&c0@$suJslNNN zHsN-DlMXb;K!GG1Ntmo~XRExX$=-h4o(E!<0Kax^7V?lOEV6cLrsP6QrFD+ev$~}A zX6q$(CI38dds-2~jUkhvkpmWE0sY4$OB|!lbn=hGG<)QkNZ5LQc|nbq^#?(J#i%r) zO#4)sNF$Ux4sL_1$XA0xqB#{H(Xfo1X%q9Bdt}6LA|#R!>>3Z3xYMo^-g>n{kt{0} z(?WR?n0potv1gI8i24+MZ^GF5db{{-c}kcDmuVo`qI z_lORt786>P-@iewey8a21EO!t?Paij^u=besekPpnYxPVu)t5|EVOy&t_9`s9d3DZ z;jTvFQXC)XUc9YKhTd=da-=D;x*2?e4aLz32NE4UC>hn?8c(FPTL60u4dcISW-lUb zp3L2C1|v}uIRq3P2@_{N~x9F5q+Qbqsu zwIVGF7*mJ4Z+kK8uW0idXFyA-OYmnv79*=aJ#La%{Ch747m3?dsxL>c_SYkD z8Ke0b_plYi%ugO3i}-b&765ZIRgBl&blqtjihB=kH1qNGS&m)YD`YuiPtgNn!;Eb? zd1XDtSxh&}2q1l0)=Uv?8t>$4Li4miCwI{h=O9tu95EL2_Z!r&-I@LC{GpuS8RfHW z!?29`nCHO-a4o2aqRBp1tW8kuQjU{*3t`>h@XG#_T@NQmQ-+XuZ`S9v+(+s~pRiu`h4hs;q2Q$5+Vl(H7M@~?FoY4Yk&|zo^umu1sJt%L)`$BV0meP! zDdqzy{$Z}f-bU8#741d_aFj@NtT0>0JUM#TytP;fj+?FRL`fZDdy^w>&xY{0ag7LQ zPH=C7fFXGVx~=IuVZ7;)nV_}Q!9S1!{@enzRVpz;*dMS_x?D-#;`Y4fXJ$7%^hm+KKOp)Uy+xqk zg5uLRvhdt6>x-V>%{m1SHWb5@OW1Ad?x4buIFJ zi@*QNJF7H@6=$j)3JNCW8mjUdBvv)tRj%v%^dPk%T)~tkPoU0;%)+~aW0Dt+L7wFF z1K{&OVIp6Bu4myPyY>w|cwzR9DRarmkZ-0b@ehArkhu-;Smzl}2{Cv246cbB%N(A` zxR3C_VG2PrfVqKS`qL)k6k^kGmOqW}eEnl$zUWa28(Wx{o6F;BIUGI{++bWNR26zOmANJywXvfvn@!mAm zl){zBjQb!}_;O)ou~KcT2iT_Tjh{iCw|X?d_bVoD<<-Uvb0E<)dl>5((Mf)Z(c zNn#R@ae?*tC(c`6E|8uGLD#w2y#X$}fBv;tkBcy88_P(H^t+Db#wOh=8`jab1`G@K zXxAI%zk)ec^A7KP%9jzP{cI6BOHn`&LEuP-x9ko z^q&<31p?O7VY-;y)h%TB6{06qh_;R65u$&EbZoV_5f^Ek>LAbKsh|IAIImdxx))pr zo47+`y3}wYL~QF2SWCOqDU47b*aZ)N9oo7~V@W^vijfj^Y}7ThI*BIjVq4x}^Ngk1 z=-nPaA+W~C6hz1;0e>G>%Ec9I9kj1@&}K}FJLhVRFYlE-*W#;K%rx3ca~9JgK!wc1 z<^uaxQgojcqVt3&A()E@Io6Gh7U$`A`XqkBUIK0HAG3&`L&7F%6#OH5%6x$z@lYN% z$qh!RDz+FAgbP7}#({WUL7NEw%ujPNx8`V&;nu9_vXsvEUPMBPfYWfKfg;72%he-b zi0isbD-W@a|J265C7ILhyuach^bSyGUa}zK)RH%(R>YVbjp{pyG$A@Dw4wL2ovi+X_`O zY5UD3AreVP(`u2m=$V3fP$ zha%D_2n4NC&;}!V2XBlaGbp@*m5Hh@qwV`c( zxr4;J_j=0l+W1a*eEWy% zMQG=Ahryww|7VYsi4ObJ%iJg3HP>=IZJ3uB_90(`$EmAC@^^D}5_2-ZaX$%N%Ds37 z{lTSeBHy5}NmI3dD)cl~Ox`u@F1v&DZj}+WDb$Kp&mt^a)b^$x8WME1UsnDi^n~FZ zkNqg88N7_wx80u(f`#dRE{)K?!Lt6V@-4>`M*Wh}{mMq*h`zp4nJw;frl_dT>7sz; zj=uVX=~7d4nRrSAm}M8DfBpHTBDIfDOb>`c>&S;cN+(rI4d^9K0>QKUV4h)_%8Fmj z-*z4E@Z$Tregr+=S$u~c$h*&1<8d!j3_8ITZ#~v?M~{k#kSpJC$?#ls=uCL)pVt(& zLL8Zx`O4~iKq=k&mwuX5;UVcV=c#J2_VIt+!vGX0Gla3^TUQ?~wK|!_cg?q%vyNMRkwuJGN{3;R z2jK_fipmlb2{EwJ%ALX1md+S|I*wZQ4sg_@eU@3DrrbiaKF3<5ls%X^XmHbJ>QnY& z0%@#_JI_CTySC`j+u$k2Iy!$+`uv;)J$Tm4$A7aPB}d3(Oc~L&1dUhOUkEYEw^ov| z5!ZgGDx%L+LHmo@b+3H<#x)1$48HaUcC@=Agh`o+Z#rfqgD&i)>+CXQ`o1{;V(Hu+3~ydrorSD04NnkxX9UQwG*+dgTgX!v%F49i|L?n52V?YEQ@B^Vva``7bP1M@&?n2Ne!&)@$;-f&i}cAO{tG zNe2FRyCMiR$W`Ztvx*?zrv4@q;M>O<;qK4*=eQ~(@aHl*H~x-Tpj$>nN`!G?apL{d zU^zB^%mwMn|%NMY8shCF-V=5t(pz=2< zGN9i!`F{Q5Pb@L|n-h&^qy}Nz5e8(|*4?w!MJ6|_-KlJ7w1>q|dQl!^Eeu$84GOVF0qCQ(wuP&jTUVG5*@Wl7Q*`l-G`_)(EU+;=FbLUq>QtIJz3>7 z9dTTsy(UGb4YneZb_O}hAZtDPKe5Uh8Xq+*WMZpl$+GXnIQ{d|a-@Ovq)+#LG}Zk= z0YRIf#3*sWL~3HLBV0dtw5r;f5jH`uoS1n3Ws<%*CxtsQ zM$E=U8JU*nIJk#(RPCUJ-4`}0YHbvd zM(bHVRUe%v2?+21iA!Np`Lk+BFwuvaifku=PdYl7$RMTvtPXGUoxasRtsRCrrkSs( zvXR~-yk!7>0(13`4E@=^*m;ZaXmaHwk-aQu(e_Cx8Or-huJSmFw}iTHznoO5+=L4X-ritw||ONGV7Mww_1 zX;^84p@ZfonV4z_EllvR4ZcaJk)tQa$7wNvQF*Rg{UpC4)-BdZz ze-fa4O%hF{M31P5Si9v7ViAq@HwE=_IkkMz;~+&yjqg+V5%-r(R~i8<5h~Iuef)w@ z#1pjoZ_6iW^e=hyzb*eq#1+0tUM}}sKEO*k>ypa zh6dZ@ROm6j6~>%THeEu*UR3>nHzNXDRqBXP&q^QTC(F^RX%?!_a3kQZ^|T#irso*n zj=)MT9<&$5BP&YugwUUoC;#g*;ofS?NnU6P{-%uejZ2M6^uJteNgL-xjY=LzQHojn z;(DGKrUFs@oAct&iZW*vA{w0w)2L=w2a=EvU4tNxB@32MuNg|7xA=KazU!KNb6ab* zWFxV=w41mt9$_OFQCU8-K5``AM=4&ErJ;)NIG7*`;rDKV@ADDGs9)&>9{J&QCDpgS zG+D15Hskr3JKaVutOcx!$jby4`5Z!y`@3VBm<9-)m z|L{$g$#6(_(I|Qe4TUG8Gp0b zUgTj4i)#(-2vo=&-K%7z<4YV6u%V~&s%3GzSBbVdY;w!-2$a|LT)s@V1#;c@4I`%2 zoHFeKn;vd^u1&Xh{8}py0m3&v*h{C^G4aH<-;wlULvHuQx)=C!x5x2{&!8=$%^qe% z;do6YV8cYMWlBVk`hTcatut+(gP(Uxc=?_m(+y=Gi`-MUg>Vcn9&adyFaG&>nF5g1 zHFAu?H47m)r8jS(rUi7n-(4nB<40+FjT6b4EMdB>a{`tXX_>~#_G$`lHa;SzabZyp zpI`Te#E#FUeYP0em2fqRz-e}QixYT>ZGe?t23@3kP6)u5WHDr_N+~BEY+KbD3>Lle z*q%P|ej6{y`NiyXPvVCtX|DLUSQw}AF?-XPBS<8zPnNT7sD4@)iHv8BkOOFDb-_-N zKag6?Au0^BB|k%PA$Nsq&2(sg`Lp_-mCp}c9|_|E)wp=IwA{Ds46q8k?~@!~vlhA1 z&ISkBf6;A>?Vzh#+xje2XEk6}?B5tfJJ!Da*575RWdr38QDB=n&B@Ic`;ZPP3c%9e zw@V!xmf^QDn<08p@LB1(kG>GK1e^D%eAEr@Yo056i-jjmRiBmPa5^ zG|k{jRdGl6?9%5MvWO?`S3ikOZxP1WtUn3-iz6$GNMH3#{mOp2 zi6-@ehGa(ZImk8o>tJ1#07C`Y(Ph{5n*giO<{Os+XSX5S3Tj06`g{Q-v=+HcISzFEYjdz3~o_OcR zbZCswtx6Sn&PY8utVWvUkVW*7HT3&6~*U$x~R3JIPaB;v!Qz zLTY`^o!1&3o}1nK(|n(q1$TAV{~15jg~MJHH&wee+lM-%^KR`@&vjE>&-GKl>8Zx? z+_iRhpw_ZCU!`t;y?N;Q;dezD2chU*=%{O+{Yw8hsncXn7qiY4^VRYd-%B4XjpktO z^X<&&zA@2`*tA~I2mgbWQenY@fDzc$x4@`1`=RW2Nh$MPEnCSCC|H`u@wYS^89noN z*LUyEV_`<8stt~hBSx=_ih77&5+B_Bm!d)lb)3~B=M9%s}*;pcw z-=&JcnI1%aaAf1i1}oFzgWS)^0NZsNu%=Wl3M^2i>&qTUI-fJ<+50fpVR(Vn?b152 z&S=3EXy~rI|b7u-(PVq#(KCuUI zxA`D_N^{*VAGd#|zDCR-=jX&nfh6kG`mEG>Xp1x*4SwFBP7Z~$$ z@g6f*vc*$#fH^w;S~LJGQ;F2IQh`8^C2l8wRu=I=uRuR*Nk>%mrNV1bRhw-;PJ{A1 z1_eg;$u|x)XFrT$H9w}VBku%E89PBjMEKWP(eh}vGp6}MMnE~XvYH;u(D^#irkJeG z3e-?N4NXqhql_5frkThG=%N7NfZ6h4F~hEN_yVx3ti2s}!Far~)Rrt8(tGFiEJZ&n zcdzP2k!^Zw)z%Hl_a?aNgRsNvXu)7zSVsa~UC_a5%o?4AUrlh`4Rt(IV@7=H$1Bxd zHIMQr#MXn_^jwRV$-Cz@zxDZiNMGt+336M)t`&#fx$Ue1Fav*EV)xoZ=8%pYvU%Rb z_Fx4|u}U<6sNJ7iV^fUz8)mqoVSnT2H-cPtfaV(&q@6dbx3{V9uxQLRFI9DHmWs;RoY3_Wyt z{;^|T=i_K@(DT}=gK}D^pn=Z=((8WFJ;>qkUwicZn@O;~cC}p^O%1DI)0Lsa3pto8 zZd2}(y`v%RZviv6OH=g?WuzJhp(`lArPA?S4`ZM^WKLbj%SK;h-8gF7LfyZ)`E<@< zNiAyW0n&Q0-ry`e7nmJCHQ*vefZ;2AR>-jWf#0(-fQsjU zEY3~SKvq;12aK~}27BaP5V}QWtlsb8tQMwLqRqHSd`SK0R=Zl9W#*)HDdZm#;M z%j~q>)bSEg^;Y5vd?Y?;VNaEkwwO5!e^0>fs&=zdz)6T9{`V6KzU`3I(|#@xAoTsxa9vKHE23`fa%w zJ0%R5CNo+@2|O2L;@UbGFy-I6tLuN^kWWi&>4`SzYyOJ&|>t57VI7BE+Iw{Zy}LutF)A&$Ddzu6srNwsqS z81v*P`f@~3mI9d&WTXOvDH8v^8P_rI)v`M&0__-Y)^4(S2M9f0Pv?31H{k5E{!Vx}c^@{3bGRb`$20dl3&Ia22rRrvyq0qfyRmi@Vh{|ULL`U233-$ev?#sC+XlKg-SxV4~ zJ6Hj^>)R+)fxBOq_;=||meu)2OA@(2%eAJgokFo5i8;5Gi98&1jpLzmpMXM?9e~WE zsBo<)U6$YS`-I|xDk1BfdF!#FJKh2cZbQGMmb^CbqSEEe+@+q=GHT4L`2v@kD|gW5 z9tM%;LnX#gK=~;o znti#ea3#iCPo?_<;Wff4>Lv2P$=;;5c#Hp??xy4glIacK`+6XT3 zd~CpI!*iqYChYTrJGbwveuBC-w~k8WKH5F|tkf1?;7VHnd)rzUtl-znV^jMzVWzi+ zS4S!FEg3drK>lz1mnQ>QN}q7fcJVQl!OLC%$_{D-#8rij-Jh1Tz|fwtq_+QoJ=A3w zLIHqSrdzGIQrL1BD3m1P^(DMNwoYdohi^Yg4L&d<+Nt6ABN9hY3tk3DU~NO)(4 zZ+u^3lAKQ1hU#6P)y)a(PAy;nj_3B2MUGeI&_+`Yw0py*M_;}49pQZ73;E6e$WU6B zI@^>R`Kw1BS2P!i*GR(22z2eX8&eW-vW**6Z`GSkHb&0yMS^yUi-?TY0j)fH zuD50*-!gn#?`(gF_g$#DCQ<55t#s4bWPLvEobKGk#uZkGqM1=2a z-yxM0ym-FD`)Wk1oa7pv(gHI%zrJkNfP9~NxjMU z^2R;I${5`2+&(kTEJm;a3;)=FCl2NrG4zQ8{=aDu9X0`VD}DsY5+Q)4m}mQc&NyxU zbB3oFFkAK1;nHbnEbPm=+h*=#9Jxc11^+L&ttB`B diff --git a/search.go b/search.go index 04cfcc3..8f37b45 100644 --- a/search.go +++ b/search.go @@ -256,6 +256,13 @@ type SearchOptions struct { // Search returns a list of search results from Google. func Search(ctx context.Context, searchTerm string, opts ...SearchOptions) ([]Result, error) { + if ctx == nil { + ctx = context.Background() + } + + if err := RateLimit.Wait(ctx); err != nil { + return nil, err + } c := colly.NewCollector(colly.MaxDepth(1)) if len(opts) == 0 {