Web crawler feedback

For the discussion of Perl, Python, Ruby, and PHP and other interpreted languages.

Web crawler feedback

Post by 0phidian on Sun Aug 25, 2013 9:56 pm
([msg=77032]see Web crawler feedback[/msg])

I made this web crawler a little while back and thought it would be good to get some feedback. The crawler is site specific, so it is supoosed to only crawl a specific targeted site and then list all the files and directories it finds. It seems to work fine but I just wanted to know if there was any way to make it more efficient or any thing else I could improve.


Code: Select all
#!/usr/bin/python3
import urllib.request, sys, http.client

if(len(sys.argv) >= 2):
    addr = sys.argv[1]
    if(len(sys.argv) >= 3):
        if(sys.argv[2] == "w"):
            ifwrite = "y"
            if(len(sys.argv) >= 4):
                fname = sys.argv[3]
            else:
                fname = "crawl.txt"
        else:
            ifwrite = "n"
else:
    addr = input("url: ")
    ifwrite = input("Write results to text file?(y/n): ")
    if(ifwrite == "y"):
        fname = input("filename: ")
source = ""
links = []
to_crawl = []
external_links = []

def openurl(url):
    try:
        u = urllib.request.urlopen("http://"+url)
        global source
        source = u.read()
        u.close()
        return True
    except (urllib.request.URLError, http.client.InvalidURL, UnicodeError):
        return False

def findlinks():
    src_len = len(source)
    i = 0
    while(i<src_len):
        if(chr(source[i])=='h'):
            if(chr(source[i+1])=="r"):
                if(chr(source[i+2])=="e"):
                    if(chr(source[i+3])=="f"):
                        if(chr(source[i+4])=="="):
                            if(chr(source[i+5])=="\""):
                                increment=6
                                link = ""
                                while(chr(source[i+increment]) != "\"" and chr(source[i+increment]) != "'"):
                                    link = link + chr(source[i+increment])
                                    increment+=1
                                if(("://" in link) or ("www." in link) or ("mailto:" in link)):
                                    if(link not in external_links):
                                        external_links.append(link)
                                else:
                                    if(link not in links):
                                        directory = ""
                                        z  = link.split()
                                        if(len(z)!=0 and z[-1]==""):
                                            for inc in range(len(z)-2):
                                                directory = directory + z[inc]+"/"
                                        else:
                                            for inc in range(len(z)-1):
                                                directory = directory + z[inc]+"/"
                                        if((link+directory) not in links):
                                            links.append(link+directory)
                                            to_crawl.append(link+directory)
                                i+= increment-1
        elif(chr(source[i])=='s'):
            if(chr(source[i+1])=="r"):
                if(chr(source[i+2])=="c"):
                    if(chr(source[i+3])=="="):
                        if(chr(source[i+4])=="\'" or chr(source[i+4])=="\""):
                            increment=6
                            link = ""
                            while(chr(source[i+increment]) != "\"" and chr(source[i+increment]) != "'"):
                                link = link + chr(source[i+increment])
                                increment+=1
                            if(("://" in link) or ("www." in link) or ("mailto:" in link)):
                                    if(link not in external_links):
                                        external_links.append(link)
                            else:
                                if(link not in links):
                                    directory = ""
                                    z  = link.split()
                                    if(len(z)!=0 and z[-1]==""):
                                        for inc in range(len(z)-2):
                                            directory = directory + z[inc]+"/"
                                    else:
                                        for inc in range(len(z)-1):
                                            directory = directory + z[inc]+"/"
                                    if((link+directory) not in links):
                                        links.append(link+directory)
                                        to_crawl.append(link+directory)
                            i+= increment-1
        elif(chr(source[i])=='a'):
            if(chr(source[i+1])=="c"):
                if(chr(source[i+2])=="t"):
                    if(chr(source[i+3])=="i"):
                        if(chr(source[i+4])=="o"):
                            if(chr(source[i+5])=="n"):
                                if(chr(source[i+6])=="="):
                                    if(chr(source[i+7])=="\""):
                                        increment=8
                                        link = ""
                                        while(chr(source[i+increment]) != "\"" and chr(source[i+increment]) != "'"):
                                            link = link + chr(source[i+increment])
                                            increment+=1
                                        if(("://" in link) or ("www." in link) or ("mailto:" in link)):
                                            if(link not in external_links):
                                                external_links.append(link)
                                        else:
                                            if(link not in links):
                                                directory = ""
                                                z  = link.split()
                                                if(len(z)!=0 and z[-1]==""):
                                                    for inc in range(len(z)-2):
                                                        directory = directory + z[inc]+"/"
                                                else:
                                                    for inc in range(len(z)-1):
                                                        directory = directory + z[inc]+"/"
                                                if((link+directory) not in links):
                                                    links.append(link+directory)
                                                    to_crawl.append(link+directory)
                                        i+= increment-1
        i+=1

def filterto_crawl():
    cnt = 0
    while(cnt < len(to_crawl)):
        s = to_crawl[cnt]
        if((s[-1:] != "/") and (s[-5:] != ".html") and (s[-4:] != ".htm") and (s[-4:] != ".php") and (s[-4:] != ".asp")):
            del to_crawl[cnt]
        else:
            cnt+=1
def writefile(fname):
    file = open(fname, 'w')
    file.write(addr+":\n\n")
    for l in links:
        file.write(l+"\n")
    file.close()
def main():
    openurl(addr)
    findlinks()
    filterto_crawl()

    while(len(to_crawl) > 0):
        print(to_crawl[0])
        if(openurl(addr+to_crawl[0])):
           
            findlinks()
            filterto_crawl()
        del to_crawl[0]

    if(ifwrite == "y"):
        writefile(fname)
   
    links.sort()
    for l in links:
        print(l)
main()
User avatar
0phidian
Poster
Poster
 
Posts: 270
Joined: Sat Jun 16, 2012 7:04 pm
Blog: View Blog (0)


Re: Web crawler feedback

Post by tgoe on Thu Aug 29, 2013 4:47 pm
([msg=77108]see Re: Web crawler feedback[/msg])

+1 for going with py3 :)

I suggest giving PEP 8 a once-over. Explore the standard lib a bit more; specifically: the option parsers, iterators/generators, regex and error handling. Also, most every .py file you write should be importable.
User avatar
tgoe
Contributor
Contributor
 
Posts: 650
Joined: Sun Sep 28, 2008 2:33 pm
Location: q3dm7
Blog: View Blog (0)



Return to Interpreted Languages

Who is online

Users browsing this forum: No registered users and 0 guests