def getUrls(self): ''' :获取给定页面的所有超链接 ''' gh = GetHtmlText() pp = PreProcess() soup = gh.getHtml(self.url) if not soup: return None links = soup.findAll('a', href = True) #超链接html标志 urls = [] if self.url.strip().endswith('/'): #拼接链接时防止出现两个斜杆相邻 self.url=self.url.strip()[:-1] for link in links: link = link.get('href') pattern0 = re.compile(r'^\./') #本网站的链接不带http等协议开头的,直接以'./'开头 pattern1 = re.compile(r'^(/\w+)') #以'/'开头不带协议的本站链接 pattern2 = re.compile(r'^(htt\w+)') #带http协议的链接 if pattern0.match(link): #此类链接需要拼接,拼接时去除'.'符号 link = self.url + link[1:] link = pp.preProcess(link) if link: urls.append(link) elif pattern1.match(link): #此类链接直接拼接即可 link = self.url + link link = pp.preProcess(link) if link: urls.append(link) elif pattern2.match(link): #此类链接需要特殊处理,链接没有问题之后就直接添加 link = pp.preProcess(link) if link: urls.append(link) return set(urls)
def getAlexa(self,url): ''' :从Alexa网站上获取全球排名中文排名信息 :param url:待获取排名信息的超链接 ''' if ggv.pterminate:return None ranks = [] numR = 0 gd = GetDomain() domain = gd.getDomain(url) #提取超链接的域名 url = cgv.alexaUrl + domain time.sleep(10) #休眠10秒 htmlText = GetHtmlText() soup = htmlText.getHtml(url) #获取网页源码,不能直接根据网页文本进行判断,因为有的信息不存在 if soup: rankrow = soup.findAll('div',{'class':'rank-row'}) for rk in rankrow: rkl = rk.find('div') if type(rkl) == types.NoneType: continue numR += 1 rank = rkl.find('a').text #如果有排名,排名处会出现超链接 ranks.append(rank) if numR < 2: ranks.append('-') else: #没有相关标志则表示不存在 ranks.append('-') ranks.append('-') return ranks
def getUrls(self): ''' :获取给定页面的所有超链接 ''' gh = GetHtmlText() pp = PreProcess() soup = gh.getHtml(self.url) if not soup: return None links = soup.findAll('a', href=True) #超链接html标志 urls = [] if self.url.strip().endswith('/'): #拼接链接时防止出现两个斜杆相邻 self.url = self.url.strip()[:-1] for link in links: link = link.get('href') pattern0 = re.compile(r'^\./') #本网站的链接不带http等协议开头的,直接以'./'开头 pattern1 = re.compile(r'^(/\w+)') #以'/'开头不带协议的本站链接 pattern2 = re.compile(r'^(htt\w+)') #带http协议的链接 if pattern0.match(link): #此类链接需要拼接,拼接时去除'.'符号 link = self.url + link[1:] link = pp.preProcess(link) if link: urls.append(link) elif pattern1.match(link): #此类链接直接拼接即可 link = self.url + link link = pp.preProcess(link) if link: urls.append(link) elif pattern2.match(link): #此类链接需要特殊处理,链接没有问题之后就直接添加 link = pp.preProcess(link) if link: urls.append(link) return set(urls)
def getAlexa(self, url): """ :从Alexa网站上获取全球排名中文排名信息 :param url:待获取排名信息的超链接 """ if ggv.pterminate: return None ranks = [] numR = 0 gd = GetDomain() domain = gd.getDomain(url) # 提取超链接的域名 url = cgv.alexaUrl + domain time.sleep(10) # 休眠10秒 htmlText = GetHtmlText() soup = htmlText.getHtml(url) # 获取网页源码,不能直接根据网页文本进行判断,因为有的信息不存在 if soup: rankrow = soup.findAll("div", {"class": "rank-row"}) for rk in rankrow: rkl = rk.find("div") if type(rkl) == types.NoneType: continue numR += 1 rank = rkl.find("a").text # 如果有排名,排名处会出现超链接 ranks.append(rank) if numR < 2: ranks.append("-") else: # 没有相关标志则表示不存在 ranks.append("-") ranks.append("-") return ranks
def getSinglePageResult(self, url): ''' :获取单个页面的搜索结果链接,百度的链接需要单独处理,因为其返回结果加密重定向了。 :本函数返回所有搜索结果的链接,以及判断是否有下一页的链接。 :param url: 给定的url链接 ''' ru = RemoveUrl() gh = GetHtmlText() signal = 1 flag = 0 retry = 10 #程序可能不能一次完全加载反馈所有内容,故需要等待重新加载 while signal: if ggv.pterminate: break soup = gh.getHtml(url) if type(soup) == types.NoneType: retry -= 1 if retry == 0: break continue navcnt = soup.find(self.navId[0], {self.navId[1]: self.navId[2]}) if (type(navcnt) == types.NoneType): #print 'Not find the engine result resource div, span, h3 : NoneType retry:',retry logging.error( 'Not find the engine result resource div, span, h3 : NoneType retry: %d' % retry) retry -= 1 if retry == 0: flag = 0 break continue signal = 0 #已经获取到网页的内容,直接跳出while循环 navends = navcnt.findAll('a') #找到所有超链接的html标志 if not navends: break #返回为空停止运行 navend = navends[-1] if navend.text.find(self.nextId) >= 0: flag = 1 else: flag = 0 h3s = soup.findAll('h3') #定位返回结果链接所属范围 for h3 in h3s: if (type(h3) == types.NoneType): continue link = h3.find('a') #定位结果链接位置 if (type(link) == types.NoneType): continue link = link['href'] #提取链接 if (self.engine == 'baidu'): #百度返回结果需要特殊处理 try: link = requests.get(link.strip()) except: continue link = link.url if ru.removeUrl(link): #去除常见的非少数网站url # print link logging.info('Get Link: %s' % link) self.window.scanlogUpdate(link) #主界面同步显示 self.queue.put(link) self.window.SetStatusText(u'获取到:%d个结果' % self.queue.qsize(), 2) #在状态栏第二栏显示当前获取到的结果数量 return flag
def getSinglePageResult(self,url): ''' :获取单个页面的搜索结果链接,百度的链接需要单独处理,因为其返回结果加密重定向了。 :本函数返回所有搜索结果的链接,以及判断是否有下一页的链接。 :param url: 给定的url链接 ''' ru = RemoveUrl() gh = GetHtmlText() signal = 1 flag = 0 retry = 10 #程序可能不能一次完全加载反馈所有内容,故需要等待重新加载 while signal: if ggv.pterminate:break soup = gh.getHtml(url) if type(soup) == types.NoneType: retry -= 1 if retry == 0:break continue navcnt = soup.find(self.navId[0],{self.navId[1]:self.navId[2]}) if(type(navcnt) == types.NoneType): #print 'Not find the engine result resource div, span, h3 : NoneType retry:',retry logging.error('Not find the engine result resource div, span, h3 : NoneType retry: %d'%retry) retry -= 1 if retry == 0: flag = 0 break continue signal = 0 #已经获取到网页的内容,直接跳出while循环 navends = navcnt.findAll('a') #找到所有超链接的html标志 if not navends:break #返回为空停止运行 navend = navends[-1] if navend.text.find(self.nextId) >= 0:flag = 1 else:flag = 0 h3s = soup.findAll('h3') #定位返回结果链接所属范围 for h3 in h3s: if(type(h3) == types.NoneType):continue link = h3.find('a') #定位结果链接位置 if(type(link) == types.NoneType):continue link = link['href'] #提取链接 if(self.engine == 'baidu'): #百度返回结果需要特殊处理 try:link = requests.get(link.strip()) except:continue link = link.url if ru.removeUrl(link): #去除常见的非少数网站url # print link logging.info('Get Link: %s'%link) self.window.scanlogUpdate(link) #主界面同步显示 self.queue.put(link) self.window.SetStatusText(u'获取到:%d个结果'%self.queue.qsize(),2) #在状态栏第二栏显示当前获取到的结果数量 return flag
def getBeian(self,url): ''' :从360服务器读取所要网站的建站的详细信息 :如,网站名称、网站主页、网站所有者、网站所有单位、所有单位性质、备案信息、检验时间等信息。 :param url:需要获取相关信息的网站链接 ''' if ggv.pterminate:return None gd = GetDomain() domain = gd.getDomain(url) #提取链接中的域名,因为360根据域名获取网站建站信息 gi = GetItems() base64Code = base64.b64encode(domain) #编码为base64,因为360获取网站建站信息的超链接域名是base64编码的 beianUrl = cgv.url360 + base64Code htmlText = GetHtmlText() #获取网页文本 text = htmlText.getHtmlText(beianUrl) return gi.getItems(text, cgv.beiAnInfoItem, cgv.beiAnNoInfo)
def getBeian(self, url): """ :从360服务器读取所要网站的建站的详细信息 :如,网站名称、网站主页、网站所有者、网站所有单位、所有单位性质、备案信息、检验时间等信息。 :param url:需要获取相关信息的网站链接 """ if ggv.pterminate: return None gd = GetDomain() domain = gd.getDomain(url) # 提取链接中的域名,因为360根据域名获取网站建站信息 gi = GetItems() base64Code = base64.b64encode(domain) # 编码为base64,因为360获取网站建站信息的超链接域名是base64编码的 beianUrl = cgv.url360 + base64Code htmlText = GetHtmlText() # 获取网页文本 text = htmlText.getHtmlText(beianUrl) return gi.getItems(text, cgv.beiAnInfoItem, cgv.beiAnNoInfo)
def sitld(self,url): ''' :识别判断给定的url的语言是否为给定的语言 :param url: 给定的url ''' if ggv.pterminate:return None self.mksure = False ld = LangDect() html = GetHtmlText() text,htmlitems = html.getHtmlText(url,reply=True) if ggv.lang_use == 'mn' and text: #蒙古文网站复杂需要特殊处理 msignal = [u'蒙文',u'蒙古语',u'蒙古学会',u'蒙古文'] if len(htmlitems['generator']) > 5: #数字5没有特殊的意义 self.mksure = True elif not self.mksure: for ms in msignal: if htmlitems['title'].find(ms) >= 0: self.mksure = True if re.search(r'蒙古族.*(中|大|小)学'.decode('utf8'),htmlitems['title'],re.I): self.mksure = True elif not self.mksure: for mf in ggv.fontfamily['mn'].split(','): if htmlitems['font-family'].find(mf) >= 0: self.mksure = True if self.mksure: self.window.scanlogUpdate(u'语 言:%s\r\n可信度:1.000000000\r\n链 接:%s\r\n'%(ggv.lang_use,url)) #主界面同步显示扫描结果 return [{ggv.lang_use:'1.0'},htmlitems['charset-web']] if text: ldRst = ld.langDect(ggv.lang_use, text) #此处只需要返回的语言及其可信度,不需要接受编码方式 if ldRst: # print '语言:%s\t可信度:%s\t链接:%s\t'%(ldRst[0].keys()[0],ldRst[0].values()[0],url) logging.info('语言:%s\t可信度:%s\t链接:%s\t'%(ldRst[0].keys()[0],ldRst[0].values()[0],url)) self.window.scanlogUpdate(u'语 言:%s\r\n可信度:%s\r\n链 接:%s\r\n'\ %(ldRst[0].keys()[0],ldRst[0].values()[0],url)) #主界面同步显示扫描结果 if ggv.lang_use in ldRst[0] and ldRst[0][ggv.lang_use] > ggv.systemSetList[3]*0.01: #用户设定的阈值乘以0.01 return ldRst return None return None