Skip to content
wh01sDM edited this page Aug 6, 2014 · 1 revision

##简述


在1.0的基础上缩减为一个基类.搜索相关的细节分别定义在一个字典中,理论上所有从第x页搜索到第y页的那种搜索引擎都可以用下面的方法获得结果。并且支持登录抓取、数据提取(链接,邮箱 ...)。

##普通搜索


googlesearchDict = {
    'searchurl': lambda word, page: 'http://208.117.227.16/search?q=' + word + '&start=' + str(page) +         '00&num=100',
    'urlPattern': r'<li class="g">[\s\S]+?<a href="([\s\S]+?)"[\s\S]+?</li>',
    'contentPattern': r'(?:<li class="g">)(?:.+?)<span class="st">(?:<span class="f">[\s\S]+?</span>)?([\s\S]+?)</span>(?:.+?)</li>',
    'nextPattern': r'下一页',
    "maxPages": None,
    'timeout': 5,
}

class simplesearch(search):
    def __init__(self, word, pages, searchdict):
        super(simplesearch, self).__init__(word, pages, searchdict)


if __name__ == "__main__":
    s = simplesearch("site:x0day.me", None , googlesearchDict)
    s.search()
    print s.urls

##需要登录的搜索


如果需要登录,在继承基类的基础上重写login函数就可以了。注意请求的方法是self.req,因为使用的是requests.session()。 所以在登录后,后续的访问就不会有影响了。

zoomeyesearchDict = {
    'searchurl' : lambda word, page:'http://www.zoomeye.org/search?q=' + word + '&p=' + str(page),
    'urlPattern' : r'<h4><a href="(?:search\?q=)?([\s\S]+?)"',
    'contentPattern' : r' <div class="span7">([\s\S]+?)</div>',
    'nextPattern' : None,
    "maxPages": 10,
    'timeout' : 5,
}

class zoomeyesearch(search):

    def __init__(self, word, pages, searchdict):
        super(zoomeyesearch, self).__init__(word, pages, searchdict)

    def login(self):
        csrfcodeurl = "http://www.zoomeye.org/"
        loginurl = "http://www.zoomeye.org/login"

        resp = self.req.get(csrfcodeurl, headers=headers)

        html = resp.content
        csrfcode = re.findall("name='csrfmiddlewaretoken' value='([\s\S]+?)'", html)[0]

        postdata = {
            "csrfmiddlewaretoken" : csrfcode,
            "username" : "xxxx",
            "password":"xxxx",
        }

        self.req.post(loginurl, data=postdata, headers=headers)

z = zoomeyesearch("wordpress", None , zoomeyesearchDict)

z.search()
print z.urls
print len(z.urls)

##数据处理


在search()中可以看到搜索完后会调用handle(),可以把对contents列表或urls列表的处理过程写在这里。 这里基类中可以放一些基本的过滤函数,继承时可以重写handle(),然后用super先调用基类的方法再用自己的方法处理self.contents。 具体处理方法可以参考theharvester.

##searchDict 细节


1,searchurl

因为不同搜索开始页数不同,有的是从0开始,有的是从1开始,所以需要注意的是searchurl是个lambda表达式。参数为word(搜索关键词),page(当前页)。

2,nextPattern和maxPages

这两项不能同时为空,否则就会exit(),因为代码不能在不知道如果判断是否还有下一页的情况下判断页面总数。 另外如果两项都存在时,会首先满足maxPages条件。

Clone this wiki locally