Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Jacky Lin
CSCI308-GOLANG
Commits
ea273338
Commit
ea273338
authored
Feb 22, 2021
by
Jacky Lin
Browse files
update scrapper.go
parent
3b51c61f
Changes
14
Expand all
Hide whitespace changes
Inline
Side-by-side
Phase3-Program/go-v/run.go
deleted
100644 → 0
View file @
3b51c61f
package
main
func
main
()
{
s
:=
[]
int
{
2
,
2
,
3
}
nw
:=
CreateNetwork
(
s
)
}
Phase3-Program/
go-v
/fileHandler.go
→
Phase3-Program/
nn
/fileHandler.go
View file @
ea273338
package
mai
n
package
n
n
import
(
"fmt"
...
...
Phase3-Program/
go-v
/go.mod
→
Phase3-Program/
nn
/go.mod
View file @
ea273338
File moved
Phase3-Program/
go-v
/go.sum
→
Phase3-Program/
nn
/go.sum
View file @
ea273338
File moved
Phase3-Program/
go-v
/helper.go
→
Phase3-Program/
nn
/helper.go
View file @
ea273338
package
mai
n
package
n
n
import
(
"fmt"
...
...
Phase3-Program/
go-v
/network.go
→
Phase3-Program/
nn
/network.go
View file @
ea273338
package
mai
n
package
n
n
import
(
"gonum.org/v1/gonum/mat"
...
...
Phase3-Program/p2p/.env
0 → 100644
View file @
ea273338
PORT=8000
\ No newline at end of file
Phase3-Program/p2p/blackchain.go
0 → 100644
View file @
ea273338
package
blackchain
import
(
"bufio"
"context"
"crypto/rand"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"flag"
"fmt"
"io"
"log"
mrand
"math/rand"
"os"
"strconv"
"strings"
"sync"
"time"
"github.com/davecgh/go-spew/spew"
golog
"github.com/ipfs/go-log"
libp2p
"github.com/libp2p/go-libp2p"
crypto
"github.com/libp2p/go-libp2p-crypto"
host
"github.com/libp2p/go-libp2p-host"
net
"github.com/libp2p/go-libp2p-net"
peer
"github.com/libp2p/go-libp2p-peer"
pstore
"github.com/libp2p/go-libp2p-peerstore"
ma
"github.com/multiformats/go-multiaddr"
//gologging "github.com/whyrusleeping/go-logging"
)
// Blockchain is balaba
var
Blockchain
[]
Block
var
mutex
=
&
sync
.
Mutex
{}
// Block is sd
type
Block
struct
{
Index
int
// position of data record in the block chain
Timestamp
string
// automatically determined and is the time the data is written
BPM
int
// pulse rate
Hash
string
// SHA256 identifier representing this data record
PrevHash
string
// SHA256 identifier of the previous record in the chain
}
func
calculateHash
(
block
Block
)
string
{
record
:=
string
(
block
.
Index
)
+
block
.
Timestamp
+
string
(
block
.
BPM
)
+
block
.
PrevHash
h
:=
sha256
.
New
()
h
.
Write
([]
byte
(
record
))
hashed
:=
h
.
Sum
(
nil
)
return
hex
.
EncodeToString
(
hashed
)
}
func
createBlock
(
prevBlock
Block
,
BPM
int
)
Block
{
// Declare a new block
var
newBlock
Block
// Set the index of new block
newBlock
.
Index
=
prevBlock
.
Index
+
1
// Set the current time stamp
t
:=
time
.
Now
()
newBlock
.
Timestamp
=
t
.
String
()
// Set the BPM
newBlock
.
BPM
=
BPM
// Link the previous Block
newBlock
.
PrevHash
=
prevBlock
.
Hash
// Calculate the current Hash
newBlock
.
Hash
=
calculateHash
(
newBlock
)
return
newBlock
}
func
isBlockValid
(
newBlock
,
oldBlock
Block
)
bool
{
// Index of the new block is the index of the old block plus 1
if
oldBlock
.
Index
+
1
!=
newBlock
.
Index
{
return
false
}
// Hash of two block has to be different
if
oldBlock
.
Hash
!=
newBlock
.
PrevHash
{
return
false
}
// Recalculate the hash value of new block
if
calculateHash
(
newBlock
)
!=
newBlock
.
Hash
{
return
false
}
return
true
}
// makeBasicHost creates a LibP2P host with a random peer ID listening on the
// given multiaddress. It will use secio if secio is true.
func
makeBasicHost
(
listenPort
int
,
secio
bool
,
randseed
int64
)
(
host
.
Host
,
error
)
{
// If the seed is zero, use real cryptographic randomness. Otherwise, use a
// deterministic randomness source to make generated keys stay the same
// across multiple runs
var
r
io
.
Reader
if
randseed
==
0
{
r
=
rand
.
Reader
}
else
{
r
=
mrand
.
New
(
mrand
.
NewSource
(
randseed
))
}
// Generate a key pair for this host. We will use it
// to obtain a valid host ID.
priv
,
_
,
err
:=
crypto
.
GenerateKeyPairWithReader
(
crypto
.
RSA
,
2048
,
r
)
if
err
!=
nil
{
return
nil
,
err
}
opts
:=
[]
libp2p
.
Option
{
libp2p
.
ListenAddrStrings
(
fmt
.
Sprintf
(
"/ip4/127.0.0.1/tcp/%d"
,
listenPort
)),
libp2p
.
Identity
(
priv
),
}
if
!
secio
{
opts
=
append
(
opts
,
libp2p
.
NoSecurity
)
}
basicHost
,
err
:=
libp2p
.
New
(
context
.
Background
(),
opts
...
)
if
err
!=
nil
{
return
nil
,
err
}
// Build host multiaddress
hostAddr
,
_
:=
ma
.
NewMultiaddr
(
fmt
.
Sprintf
(
"/ipfs/%s"
,
basicHost
.
ID
()
.
Pretty
()))
// Now we can build a full multiaddress to reach this host
// by encapsulating both addresses:
addr
:=
basicHost
.
Addrs
()[
0
]
fullAddr
:=
addr
.
Encapsulate
(
hostAddr
)
log
.
Printf
(
"I am %s
\n
"
,
fullAddr
)
if
secio
{
log
.
Printf
(
"Now run
\"
go run main.go -l %d -d %s -secio
\"
on a different terminal
\n
"
,
listenPort
+
1
,
fullAddr
)
}
else
{
log
.
Printf
(
"Now run
\"
go run main.go -l %d -d %s
\"
on a different terminal
\n
"
,
listenPort
+
1
,
fullAddr
)
}
return
basicHost
,
nil
}
func
handleStream
(
s
net
.
Stream
)
{
log
.
Println
(
"Got a new stream!"
)
// Create a buffer stream for non blocking read and write.
rw
:=
bufio
.
NewReadWriter
(
bufio
.
NewReader
(
s
),
bufio
.
NewWriter
(
s
))
go
readData
(
rw
)
go
writeData
(
rw
)
// stream 's' will stay open until you close it (or the other side closes it).
}
func
readData
(
rw
*
bufio
.
ReadWriter
)
{
for
{
str
,
err
:=
rw
.
ReadString
(
'\n'
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
if
str
==
""
{
return
}
if
str
!=
"
\n
"
{
chain
:=
make
([]
Block
,
0
)
if
err
:=
json
.
Unmarshal
([]
byte
(
str
),
&
chain
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
mutex
.
Lock
()
if
len
(
chain
)
>
len
(
Blockchain
)
{
Blockchain
=
chain
bytes
,
err
:=
json
.
MarshalIndent
(
Blockchain
,
""
,
" "
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
// Green console color: \x1b[32m
// Reset console color: \x1b[0m
fmt
.
Printf
(
"
\x1b
[32m%s
\x1b
[0m> "
,
string
(
bytes
))
}
mutex
.
Unlock
()
}
}
}
func
writeData
(
rw
*
bufio
.
ReadWriter
)
{
go
func
()
{
for
{
time
.
Sleep
(
5
*
time
.
Second
)
mutex
.
Lock
()
bytes
,
err
:=
json
.
Marshal
(
Blockchain
)
if
err
!=
nil
{
log
.
Println
(
err
)
}
mutex
.
Unlock
()
mutex
.
Lock
()
rw
.
WriteString
(
fmt
.
Sprintf
(
"%s
\n
"
,
string
(
bytes
)))
rw
.
Flush
()
mutex
.
Unlock
()
}
}()
stdReader
:=
bufio
.
NewReader
(
os
.
Stdin
)
for
{
fmt
.
Print
(
"> "
)
sendData
,
err
:=
stdReader
.
ReadString
(
'\n'
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
sendData
=
strings
.
Replace
(
sendData
,
"
\n
"
,
""
,
-
1
)
bpm
,
err
:=
strconv
.
Atoi
(
sendData
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
newBlock
:=
createBlock
(
Blockchain
[
len
(
Blockchain
)
-
1
],
bpm
)
if
isBlockValid
(
newBlock
,
Blockchain
[
len
(
Blockchain
)
-
1
])
{
mutex
.
Lock
()
Blockchain
=
append
(
Blockchain
,
newBlock
)
mutex
.
Unlock
()
}
bytes
,
err
:=
json
.
Marshal
(
Blockchain
)
if
err
!=
nil
{
log
.
Println
(
err
)
}
spew
.
Dump
(
Blockchain
)
mutex
.
Lock
()
rw
.
WriteString
(
fmt
.
Sprintf
(
"%s
\n
"
,
string
(
bytes
)))
rw
.
Flush
()
mutex
.
Unlock
()
}
}
func
main
()
{
t
:=
time
.
Now
()
genesisBlock
:=
Block
{}
genesisBlock
=
Block
{
0
,
t
.
String
(),
0
,
calculateHash
(
genesisBlock
),
""
}
Blockchain
=
append
(
Blockchain
,
genesisBlock
)
// LibP2P code uses golog to log messages. They log with different
// string IDs (i.e. "swarm"). We can control the verbosity level for
// all loggers with:
golog
.
SetAllLoggers
(
golog
.
LevelInfo
)
// Change to DEBUG for extra info
// Parse options from the command line
listenF
:=
flag
.
Int
(
"l"
,
0
,
"wait for incoming connections"
)
target
:=
flag
.
String
(
"d"
,
""
,
"target peer to dial"
)
secio
:=
flag
.
Bool
(
"secio"
,
false
,
"enable secio"
)
seed
:=
flag
.
Int64
(
"seed"
,
0
,
"set random seed for id generation"
)
flag
.
Parse
()
if
*
listenF
==
0
{
log
.
Fatal
(
"Please provide a port to bind on with -l"
)
}
// Make a host that listens on the given multiaddress
ha
,
err
:=
makeBasicHost
(
*
listenF
,
*
secio
,
*
seed
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
if
*
target
==
""
{
log
.
Println
(
"listening for connections"
)
// Set a stream handler on host A. /p2p/1.0.0 is
// a user-defined protocol name.
ha
.
SetStreamHandler
(
"/p2p/1.0.0"
,
handleStream
)
select
{}
// hang forever
/**** This is where the listener code ends ****/
}
else
{
ha
.
SetStreamHandler
(
"/p2p/1.0.0"
,
handleStream
)
// The following code extracts target's peer ID from the
// given multiaddress
ipfsaddr
,
err
:=
ma
.
NewMultiaddr
(
*
target
)
if
err
!=
nil
{
log
.
Fatalln
(
err
)
}
pid
,
err
:=
ipfsaddr
.
ValueForProtocol
(
ma
.
P_IPFS
)
if
err
!=
nil
{
log
.
Fatalln
(
err
)
}
peerid
,
err
:=
peer
.
IDB58Decode
(
pid
)
if
err
!=
nil
{
log
.
Fatalln
(
err
)
}
// Decapsulate the /ipfs/<peerID> part from the target
// /ip4/<a.b.c.d>/ipfs/<peer> becomes /ip4/<a.b.c.d>
targetPeerAddr
,
_
:=
ma
.
NewMultiaddr
(
fmt
.
Sprintf
(
"/ipfs/%s"
,
peer
.
IDB58Encode
(
peerid
)))
targetAddr
:=
ipfsaddr
.
Decapsulate
(
targetPeerAddr
)
// We have a peer ID and a targetAddr so we add it to the peerstore
// so LibP2P knows how to contact it
ha
.
Peerstore
()
.
AddAddr
(
peerid
,
targetAddr
,
pstore
.
PermanentAddrTTL
)
log
.
Println
(
"opening stream"
)
// make a new stream from host B to host A
// it should be handled on host A by the handler we set above because
// we use the same /p2p/1.0.0 protocol
s
,
err
:=
ha
.
NewStream
(
context
.
Background
(),
peerid
,
"/p2p/1.0.0"
)
if
err
!=
nil
{
log
.
Fatalln
(
err
)
}
// Create a buffered stream so that read and writes are non blocking.
rw
:=
bufio
.
NewReadWriter
(
bufio
.
NewReader
(
s
),
bufio
.
NewWriter
(
s
))
// Create a thread to read and write data.
go
writeData
(
rw
)
go
readData
(
rw
)
select
{}
// hang forever
}
}
Phase3-Program/p2p/go.mod
0 → 100644
View file @
ea273338
module blackchain
go 1.16
require (
github.com/davecgh/go-spew v1.1.1
github.com/ipfs/go-log v1.0.4
github.com/libp2p/go-libp2p v0.13.0
github.com/libp2p/go-libp2p-core v0.8.5 // indirect
github.com/libp2p/go-libp2p-crypto v0.1.0
github.com/libp2p/go-libp2p-host v0.1.0
github.com/libp2p/go-libp2p-net v0.1.0
github.com/libp2p/go-libp2p-peer v0.2.0
github.com/libp2p/go-libp2p-peerstore v0.2.6
github.com/multiformats/go-multiaddr v0.3.1
)
Phase3-Program/p2p/go.sum
0 → 100644
View file @
ea273338
This diff is collapsed.
Click to expand it.
Phase3-Program/scrapper/go.mod
0 → 100644
View file @
ea273338
module scrapper
go 1.16
require (
github.com/PuerkitoBio/goquery v1.6.1 // indirect
github.com/andybalholm/cascadia v1.2.0 // indirect
github.com/antchfx/htmlquery v1.2.3 // indirect
github.com/antchfx/xmlquery v1.3.4 // indirect
github.com/antchfx/xpath v1.1.11 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gocolly/colly v1.2.0
github.com/golang/protobuf v1.4.3 // indirect
github.com/kennygrant/sanitize v1.2.4 // indirect
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
github.com/temoto/robotstxt v1.1.1 // indirect
golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d // indirect
golang.org/x/text v0.3.5 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.25.0 // indirect
)
Phase3-Program/scrapper/go.sum
0 → 100644
View file @
ea273338
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/PuerkitoBio/goquery v1.6.1 h1:FgjbQZKl5HTmcn4sKBgvx8vv63nhyhIpv7lJpFGCWpk=
github.com/PuerkitoBio/goquery v1.6.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/andybalholm/cascadia v1.2.0 h1:vuRCkM5Ozh/BfmsaTm26kbjm0mIOM3yS5Ek/F5h18aE=
github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz6M=
github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0=
github.com/antchfx/xmlquery v1.3.4 h1:RuhsI4AA5Ma4XoXhaAr2VjJxU0Xp0W2zy/f9ZIpsF4s=
github.com/antchfx/xmlquery v1.3.4/go.mod h1:64w0Xesg2sTaawIdNqMB+7qaW/bSqkQm+ssPaCMWNnc=
github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/antchfx/xpath v1.1.10/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/antchfx/xpath v1.1.11 h1:WOFtK8TVAjLm3lbgqeP0arlHpvCEeTANeWZ/csPpJkQ=
github.com/antchfx/xpath v1.1.11/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI=
github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/jawher/mow.cli v1.2.0 h1:e6ViPPy+82A/NFF/cfbq3Lr6q4JHKT9tyHwTCcUQgQw=
github.com/jawher/mow.cli v1.2.0/go.mod h1:y+pcA3jBAdo/GIZx/0rFjw/K2bVEODP9rfZOfaiq8Ko=
github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/temoto/robotstxt v1.1.1 h1:Gh8RCs8ouX3hRSxxK7B1mO5RFByQ4CmJZDwgom++JaA=
github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d h1:1aflnvSoWWLI2k/dMUAl5lvU1YO4Mb4hz0gh+1rjcxU=
golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
Phase3-Program/scrapper/scrapper.go
0 → 100644
View file @
ea273338
package
main
import
(
"fmt"
"github.com/gocolly/colly"
"strings"
)
func
scp
()
{
fmt
.
Println
(
"Scrapper"
)
c
:=
colly
.
NewCollector
(
colly
.
AllowedDomains
(
"go-colly.org"
),
)
c
.
OnHTML
(
"a[href]"
,
func
(
e
*
colly
.
HTMLElement
)
{
link
:=
e
.
Attr
(
"href"
)
// Print link
//fmt.Printf("Link found: %q -> %s\n", e.Text, link)
// Visit link found on page
// Only those links are visited which are in AllowedDomains
if
strings
.
HasPrefix
(
link
,
"/"
)
{
fmt
.
Printf
(
"Link found: %q -> %s
\n
"
,
e
.
Text
,
link
)
link
=
strings
.
Join
([]
string
{
"https://"
,
"go-colly.org"
,
link
},
""
)
}
//fmt.Printf("%q\n",strings.Split(link, "/"))
//if len(strings.Split(link, "/")) >
if
err
:=
c
.
Visit
(
e
.
Request
.
AbsoluteURL
(
link
));
err
!=
nil
{
//fmt.Println("Error")
}
})
// Before making a request print "Visiting ..."
c
.
OnRequest
(
func
(
r
*
colly
.
Request
)
{
fmt
.
Println
(
"Visiting"
,
r
.
URL
.
String
())
})
if
err
:=
c
.
Visit
(
"http://go-colly.org/"
);
err
!=
nil
{
fmt
.
Println
(
"Error"
)
}
}
func
main
()
{
}
Phase3-Program/scrapper/tree.go
0 → 100644
View file @
ea273338
package
main
import
(
"fmt"
"strings"
)
type
Node
struct
{
level
int
link
string
title
string
child
[]
*
Node
}
func
NewNode
(
link
string
,
title
string
)
*
Node
{
fmt
.
Printf
(
"%q
\n
"
,
strings
.
Split
(
link
,
"/"
))
return
&
Node
{
level
:
len
(
strings
.
Split
(
link
,
"/"
)),
title
:
title
,
link
:
link
,
child
:
nil
}
}
type
Tree
struct
{
root
*
Node
}
func
NewTree
(
link
string
,
title
string
)
*
Tree
{
return
&
Tree
{
root
:
NewNode
(
link
,
title
)}
}
func
(
t
*
Tree
)
insert
(
link
string
,
title
string
)
{
t
.
root
.
insert
(
link
,
title
)
}
func
(
n
*
Node
)
insert
(
link
string
,
title
string
)
{
keys
:=
strings
.
Split
(
link
,
"/"
)
// Same level
fmt
.
Printf
(
"%d, %d
\n
"
,
n
.
level
,
len
(
keys
)
-
1
)
if
len
(
keys
)
-
1
==
n
.
level
{
// Child level