python之自定义爬虫脚本

原创 2015年11月18日 23:35:00

## spider.py


import urllib2,httplib
import os,sys,re,time,random



#[OK]
def removeBR(site):
    result = re.search(r'\n',site)
    if result:
        return site.replace('\n','')
    return site
#[OK]
def getRequestList(fname):
    file = open(fname,"r")
    sites = file.readlines()
    list = []
    for s in sites:
        list.append(removeBR(s))
    return list
#[OK]
def inOldSet(url,set):
    if url in set:
        return True
    return False
#[]

#[OK]
def isEndWithJavascript(site):
    ret = re.search("/javascript:",site)
    if ret:
        return True
    return False

#[OK]
def ignoreJavascript(site):
    if isEndWithJavascript(site):
        s1,s2 = site.rsplit("/javascript:",1)
        return s1
    return site
#[50%_OK]
def isFile(url):
    res = re.search("(.html|.htm|.xml|.txt|.css|.js|.avi|.flv|.jpg|.gif|.bmp|.png|.xhtml|.dat|.doc|.xls|.php|.jsp|.asp)$",url)
    if res:
        return True
    return False
#[OK] http://aa.com/index.txt -> http://aa.com
def getBaseUrl(url):
    if isFile(url):
        s1,s2 = url.rsplit("/",1)
        return s1
    if url[len(url) - 1:] == "/":
        return url[:len(url) - 1]
    else:
        return url
#[OK]
def addIndexForSite(site):
    if isFile(site):
        return site
    bs = getBaseUrl(site)
    return "%s/index.html" % (bs)
#[OK]
def isError(site):
    try:
        getCntList(site)
        return False
    except:
        return True
#[OK]
def isPHPIndex(site):
    site = addIndexForSite(site)
    if isError(site):
        return True
    else:
        return False
#[OK]
def pathToFile(site):
    if isFile(site):
        return site
    bs = getBaseUrl(site)
    ext = "index.html"
    if isPHPIndex(site):
        ext = "index.php"
    return "%s/%s" % (bs,ext)
#[OK] ./a/c.txt  /a/b.txt a/v.txt -> a/a.txt
def getRelPath(sub):
    if sub[:1] == ".":
        if sub[1:2] == ".":
            return sub
        if sub[1:2] == "/":
            return sub[2:]
        return sub
    return sub
#[OK]
def getDomain(url):
    if isFullPath(url):
        s1,s2 = url.split("http://",1)
        if s2.find(r'/') != -1:
            s3,s4 = s2.split(r'/',1)
            return s3
        else:
            return s2
#[OK]
def toFullPath(sub,parent):
    if isFullPath(sub):
        return sub
    if sub == "/":
        return "http://%s" % (getDomain(parent))
    if sub[:1] == "/":
        baseUrl = getDomain(parent)
    else:
        baseUrl = getBaseUrl(parent)
    relPath = getRelPath(sub)
    return "http://%s/%s" % (baseUrl,relPath)
#[OK]
def formatUrl(url):
    url = ignoreJavascript(url)
    #if not isFile(url):
    #    url = pathToFile(url)
    return url
#[OK]
def isFullPath(url):
    if re.match("\s*http://",url):
        return True
    return False
#[OK]
def isPHPFile(site):
    ret = re.search("\.php\?",site)
    if ret:
        return True
    ret = re.search("\.php$",site)
    if ret:
        return True
    return False
#[OK?]
def isValidHTML(url):
    if isPHPFile(url) or not isFullPath(url):
        return False
    return True
def getCntList(url):
    list = []
    try:
        cnt = urllib2.urlopen(url,timeout=240).read()
        cnt = cnt.replace('\n','')
        cnt = cnt.replace('<a ','\n<a ')
        cnt = cnt.replace('<img ','\n<img ')
        sites = cnt.split('\n')
        for s in sites:
            if s:
                #print removeBR(s) + "\n\n"
                list.append(removeBR(s))
    except:
        print "load error~2"
    return list
#[OK]
def getAnchorHref(str):
    return re.finditer(r'<a\s.*href="([^<>\s\"]+)"',str)
def getImgSrc(str):
    return re.finditer(r'<img\s.*src="([^<>\s\"]+)"',str)
#[OK]
def isImage(url):
    res = re.search("(.jpg|.JPG|.gif|.GIF|.bmp|.BMP|.png|.PNG|.jpeg|.JPEG)$",url)
    if res:
        return True
    else:
        return False
#[OK]
def isHTML(url):
    res = re.search("(.html|.htm|.asp|.aspx)$",url)
    if res:
        return True
    else:
        return False
gcnt = 0
#[]
def parseHTML(url):
    global gcnt
    gcnt = gcnt + 1
    print "parsing[%d]-->%s" % (gcnt,url)
    hSet = []
    iSet = []
    res = []
    list = getCntList(url)
    for s in list:
        anchor = getAnchorHref(s)
        for a in anchor:
            print "anchor[sub]->%s" % (a.group(1))
            print "fullPath[sub]->%s" % (formatUrl(toFullPath(a.group(1),url)))
            res.append(formatUrl(toFullPath(a.group(1),url)))
        img = getImgSrc(s)
        for im in img:
            print "image[sub]->%s" % (im.group(1))
            res.append(formatUrl(toFullPath(im.group(1),url)))
    for r in res:
        if isImage(r):
            iSet.append(r)
        if isHTML(r):
            hSet.append(r)
    return iSet,hSet
#[OK]
def updateUrlSet(urlSet,htmlSet,oldSet):
    for h in htmlSet:
        if h in oldSet:
            continue
        if h in urlSet:
            continue
        urlSet.append(h)
#[OK]
def getExt(url):
    s1,s2 = url.rsplit(".",1)
    return s2
#[OK]
def getRandomName():
    return "%d_%d" % (time.time(),random.randint(0,99999))
#[OK]
def getPath(url):
    name = getRandomName()
    ext = getExt(url)
    return "%s.%s" % (name,ext)
#[OK]
def getUrl(url):
    try:
        return urllib2.urlopen(url,timeout=240).read()
    except:
        print "load error~"
        return None
#[OK]
def saveToRoot(str,path):
    newPath = os.path.join(os.getcwd(),"download")
    newPath = os.path.join(newPath,path)
    fp = open(newPath,"wb")
    fp.write(str)
    fp.close()
#[OK]
def saveImage(imgSet):
    for site in imgSet:
        print "Get-->%s" % (site)
        page = getUrl(site)
        if page == None:
            continue
        path = getPath(site)
        print "Save-->%s" % (path)
        saveToRoot(page,path)
#[Test]
def main(fname):
    urlSet = getRequestList(fname)
    oldSet = []
    for url in urlSet:
        if inOldSet(url,oldSet):
            del(url)
            continue
        newUrl = formatUrl(url)
        #print "newUrl::" + newUrl
        #newUrl = ignoreJavascript(url)
        if isValidHTML(newUrl):
            imgSet,htmlSet = parseHTML(newUrl)
            saveImage(imgSet)
            oldSet.append(url)
            oldSet.append(newUrl)
            updateUrlSet(urlSet,htmlSet,oldSet)
        else:
            del(url)

def test(set):
    for t in set:
        print formatUrl(removeBR(t))

main('list.txt')


## list.txt

http://www.gaoxiaola.com/p/gif/index_4.html


@@用法说明

spider.py list.txt

试图从网页中抓取图片

Python 爬虫7——自定义Item Pipeline将数据存入MongoDB

上篇我们介绍了scrapy的安装和基本的使用,本篇主要补充一个比较实用的操作,就是如何把从URL页面爬取到的数据保存到数据库中,以便于其他地方的使用,这里选择了比较简单的MongoDB作为存储数据的数...

[Python]linux自定义Python脚本命令

在window下写好的程序配置到Linux上,要实现任意目录下的命令调用。 由于初学Linux,这里从文件传输等最基本的方法入手,记录配置的过程中遇到的各种问题。...

java爬虫-可自定义webUrl编码

  • 2017年07月28日 22:45
  • 460KB
  • 下载

Scrapy美剧爬虫,自定义页面

  • 2017年05月30日 11:59
  • 40KB
  • 下载

python爬虫——校园网自动重连脚本

一、背景最近学校校园网不知道是什么情况,总出现掉线的情况。每次掉线都需要我手动打开web浏览器重新进行账号密码输入,重新进行登录。系统的问题我没办法解决,但是可以写一个简单的python脚本用于自动登...

yum源python爬虫脚本

  • 2016年03月02日 21:42
  • 2KB
  • 下载

【详解】Python写爬虫脚本的教程

因为过去了一段时间,有好多点都可以直接写,反而不知道从哪儿开始写。所以写一个从零开始的Python爬虫教程,也是自己从头再学习和复习的一个过程。 1.Python的安装 我们这里安装Python2.7...
  • AKAK714
  • AKAK714
  • 2015年10月26日 19:01
  • 1430

shell脚本导出自定义的表列数据

  • 2017年12月04日 09:33
  • 186B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python之自定义爬虫脚本
举报原因:
原因补充:

(最多只允许输入30个字)