Страницы: 1
RSS
как проверить вебссылки на наличие битых
 
Уважаемые знатоки! Подскажите, пожалуйста, как проверить в EXCEL список из 10000 вебссылок на наличие битых, и подсветить ячейки с работающими ссылками одним цветом, а с неработающими - другим?    
Заранее спасибо!
 
А что вы подразумевате под "битой ссылкой"?  
 
Покажите пример файла (хватит 10 строк со ссылками), где вы вручную пеметили битые ссылки.  
 
Тут нужен макрос, который в цикле пройдёт по всем ссылкам (попытавшись загрузить страницу с каждой ссылки), и в зависимости от результата загрузки страницы пометит ячейку цветом (или в соседнем столбце поставит пометку о битой ссылке)
 
Под "битой ссылкой" я подразумеваю ссылку, по которой в браузере ничего не откроется. В результате работы макроса нужно чтобы получилось что-то похожее на пример в файле.
 
{quote}{login=vaha}{date=12.02.2011 05:00}{thema=как проверить вебссылки на наличие битых}{post}Под "битой ссылкой" я подразумеваю ссылку, по которой в браузере ничего не откроется. В результате работы макроса нужно чтобы получилось что-то похожее на пример в файле.{/post}{/quote}  
 
Sub vaha()  
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row  
On Error Resume Next  
Range("A" & i).Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True  
If Err.Number <> 0 Then Err.Clear: Range("B" & i) = "ERR"  
Next  
End Sub  
 
только не знаю как убить браузер чтобы не открывался, а так работает :)
Спасибо
 
Мне вот интересно - сколько времени потребуется макросу для открытия 10 000 страниц :-)
 
{quote}{login=Юрий М}{date=12.02.2011 06:56}{thema=}{post}Мне вот интересно - сколько времени потребуется макросу для открытия 10 000 страниц :-){/post}{/quote}  
 
Юра так автор про скорость вообще ничего не упоминал.  
Согласно заявленным требованиям задачу решили......  
а ну да..... надо подсветить  
Sub vaha()  
For i = 1 To 10  
On Error Resume Next  
Range("A" & i).Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True  
If Err.Number <> 0 Then Err.Clear: Range("A" & i).Interior.Color = 255  
Next  
End Sub  
 
вот и подсветили, а знал бы как браузер убить убил бы...  
=96000=
Спасибо
 
Дим, так я ведь без какого-либо намёка в твой адрес :-) Мне действительно интересно.
 
{quote}{login=Юрий М}{date=12.02.2011 07:09}{thema=}{post}Дим, так я ведь без какого-либо намёка в твой адрес :-) Мне действительно интересно.{/post}{/quote}  
Юра так можно и рейтинги сайтов поднимать, поставил на ночь пусть молотит пока оперативы хватит. :)
Спасибо
 
:-) Вот сюда глянь: http://www.compress.ru/Article.aspx?id=12471
 
Ещё вот это попалось:  
Private x As Object    
 
Private Sub Command1_Click()    
   Set x = CreateObject("InternetExplorer.Application")    
   ' Окно браузера видимо    
   x.Visible = True    
   ' Переход по ссылке    
   x.Navigate "http://bit.pirit.info/forum"    
End Sub    
 
Private Sub Command2_Click()    
   x.Quit ' Закрытие окна браузера    
End Sub
 
новая вводная: браузер открывать не нужно.
 
{quote}{login=vaha}{date=12.02.2011 10:29}{thema=как проверить вебссылки на наличие битых}{post}новая вводная: браузер открывать не нужно.{/post}{/quote}  
Новая вводная !?  
Гугл Вам поможет, там и вводите (:)<
Спасибо
 
Юра спасибо , познавательно, но скорость точно там не увеличишь.  
Единственное что приходит в голову cmd ping и ловить время отклика или ошибку
Спасибо
 
Так я уже не про скорость - про закрытие обозревателя :-)  
И про ожидание загрузки страницы там тоже мелькало...
 
{quote}{login=Юрий М}{date=12.02.2011 11:25}{thema=}{post}Так я уже не про скорость - про закрытие обозревателя :-)  
И про ожидание загрузки страницы там тоже мелькало...{/post}{/quote}  
я уже нашел решение через cmd , но скорость тоже не ахти, но броузер не участвует проверка занимает около 2 сек  
это ошибка  
ЏаЁ Їа®ўҐаЄҐ бўп§Ё ­Ґ г¤ «®бм ®Ў­ аг¦Ёвм г§Ґ« maiffl.ru. Џа®ўҐам⥠Ё¬п г§«  Ё Ї®ўв®аЁвҐ Ї®ЇлвЄг.  
это верный  
ЋЎ¬Ґ­ Ї ЄҐв ¬Ё б mail.ru [94.100.191.202] Ї® 32 Ў ©в:
 
 
 
ЋвўҐв ®в 94.100.191.202: зЁб«® Ў ©в=32 ўаҐ¬п=37¬б TTL=251  
 
ЋвўҐв ®в 94.100.191.202: зЁб«® Ў ©в=32 ўаҐ¬п=41¬б TTL=251  
 
ЋвўҐв ®в 94.100.191.202: зЁб«® Ў ©в=32 ўаҐ¬п=38¬б TTL=251  
 
ЋвўҐв ®в 94.100.191.202: зЁб«® Ў ©в=32 ўаҐ¬п=41¬б TTL=251  
 
 
 
‘в вЁбвЁЄ  Ping ¤«п 94.100.191.202:  
 
   Џ ЄҐв®ў: ®вЇа ў«Ґ­® = 4, Ї®«г祭® = 4, Ї®вҐап­® = 0 (0% Ї®вҐам),  
 
ЏаЁЎ«Ё§ЁвҐ«м­®Ґ ўаҐ¬п ЇаЁҐ¬ -ЇҐаҐ¤ зЁ ў ¬б:  
 
   ЊЁ­Ё¬ «м­®Ґ = 37¬бҐЄ, Њ ЄбЁ¬ «м­®Ґ = 41 ¬бҐЄ, ‘।­ҐҐ = 39 ¬бҐЄ  
 
осталось обработать временный txt :)
Спасибо
 
Function Test_http(adr_http As String)  
   Dim wsh As Object  
   Dim RegEx As Object, RegM As Object  
   Dim FSO As Object, fil As Object  
   Dim ts As Object, txtAll As String, TempFil As String  
   Set wsh = CreateObject("WScript.Shell")  
   Set FSO = CreateObject("Scripting.FileSystemObject")  
   Set RegEx = CreateObject("vbscript.regexp")  
   TempFil = "C:\http_temp.txt"  
 
   wsh.Run "%comspec% /c ping " & adr_http & " > " & TempFil, 0, True  
   With RegEx  
       .Pattern = "(\d{1,3}\.){3}\d{1,3}"  
       .Global = False  
   End With  
   Set fil = FSO.GetFile(TempFil)  
 
   Set ts = fil.OpenAsTextStream(1)  
   txtAll = ts.ReadAll  
   On Error Resume Next  
   Set RegM = RegEx.Execute(txtAll)  
   If Err.Number = 5 Then  
       Test_http = RegM(0)  
   Else  
       Test_http = "Err"  
   End If  
     
   ts.Close  
 
   Kill TempFil  
       
   Set ts = Nothing  
   Set wsh = Nothing  
   Set fil = Nothing  
   Set FSO = Nothing  
   Set RegM = Nothing  
   Set RegEx = Nothing  
End Function
Спасибо
 
{quote}{login=R Dmitry}{date=13.02.2011 12:05}{thema=ну вот наваял}{post}Function Test_http(adr_http As String)  
   Dim wsh As Object  
   Dim RegEx As Object, RegM As Object  
   Dim FSO As Object, fil As Object  
   Dim ts As Object, txtAll As String, TempFil As String  
   Set wsh = CreateObject("WScript.Shell")  
   Set FSO = CreateObject("Scripting.FileSystemObject")  
   Set RegEx = CreateObject("vbscript.regexp")  
   TempFil = "C:\http_temp.txt"  
 
   wsh.Run "%comspec% /c ping " & adr_http & " > " & TempFil, 0, True  
   With RegEx  
       .Pattern = "(\d{1,3}\.){3}\d{1,3}"  
       .Global = False  
   End With  
   Set fil = FSO.GetFile(TempFil)  
 
   Set ts = fil.OpenAsTextStream(1)  
   txtAll = ts.ReadAll  
   On Error Resume Next  
   Set RegM = RegEx.Execute(txtAll)  
   If Err.Number = 5 Then  
       Test_http = RegM(0)  
   Else  
       Test_http = "Err"  
   End If  
     
   ts.Close  
 
   Kill TempFil  
       
   Set ts = Nothing  
   Set wsh = Nothing  
   Set fil = Nothing  
   Set FSO = Nothing  
   Set RegM = Nothing  
   Set RegEx = Nothing  
End Function{/post}{/quote}  
 
 
 
шьерт перепутал.....  
 
If Err.Number = 5 Then  
     Err.Clear  
     Test_http = "Err"  
   Else  
   Test_http = RegM(0)  
         
   End If
Спасибо
 
от 4 до 6 сек один адрес  
10 000 за три дня перемолотит
Спасибо
 
{quote}{login=R Dmitry}{date=13.02.2011 12:51}{thema=}{post}от 4 до 6 сек один адрес {/post}{/quote}  
Это если узел ответит? А если молчит?
 
{quote}{login=Юрий М}{date=13.02.2011 01:18}{thema=Re: }{post}{quote}{login=R Dmitry}{date=13.02.2011 12:51}{thema=}{post}от 4 до 6 сек один адрес {/post}{/quote}  
Это если узел ответит? А если молчит?{/post}{/quote}  
94.100.191.201***3,218018  
79.174.64.68***3,171875  
Err***0,2189941  
77.88.21.3***3,218994  
Err***2,5  
все равно нахомутал с  ошибкой :) так точно работает  
 
Function Test_http(adr_http As String)  
   Dim wsh As Object  
   Dim RegEx As Object, RegM As Object  
   Dim FSO As Object, fil As Object  
   Dim ts As Object, txtAll As String, TempFil As String  
   Set wsh = CreateObject("WScript.Shell")  
   Set FSO = CreateObject("Scripting.FileSystemObject")  
   Set RegEx = CreateObject("vbscript.regexp")  
   TempFil = "C:\http_temp.txt"  
 
   wsh.Run "%comspec% /c ping " & adr_http & " > " & TempFil, 0, True  
   With RegEx  
       .Pattern = "(\d{1,3}\.){3}\d{1,3}"  
       .Global = False  
   End With  
   Set fil = FSO.GetFile(TempFil)  
 
   Set ts = fil.OpenAsTextStream(1)  
   txtAll = ts.ReadAll  
   On Error Resume Next  
   Set RegM = RegEx.Execute(txtAll)  
   Test_http = RegM(0)  
   If Err.Number <> 0 Then  
     Err.Clear  
     Test_http = "Err"  
   End If  
     
   ts.Close  
 
   Kill TempFil  
       
   Set ts = Nothing  
   Set wsh = Nothing  
   Set fil = Nothing  
   Set FSO = Nothing  
   Set RegM = Nothing  
   Set RegEx = Nothing  
End Function  
 
Sub hdhdh()  
Dim tm As Single  
tm = Timer  
Debug.Print Test_http("yajjjj.ru") & "***" & Timer - tm  
'Debug.Print Timer - tm  
End Sub
Спасибо
 
Может, так немного быстрее будет (1 запрос, 1 байт)  
 
wsh.Run "%comspec% /c ping -n 1 -l 1 " & adr_http & " > " & TempFil, 0, True
 
{quote}{login=Казанский}{date=13.02.2011 10:46}{thema=}{post}Может, так немного быстрее будет (1 запрос, 1 байт)  
 
wsh.Run "%comspec% /c ping -n 1 -l 1 " & adr_http & " > " & TempFil, 0, True{/post}{/quote}  
 
Может, и быстрее, но таким способом ссылки не проверить.  
 
1) не факт, что сервер будет отвечать на ping (на некоторых серверах пинги намеренно закрываются)  
2) наличие пинга ничего не говорит о доступности сайта (пинг может проходить, а сайт быть недоступен - к примеру, если веб-сервер не запущен)  
3) запросы DNS для несуществующих имен занимают много времени (около 5-6 секунд на запрос)  
4) на веб-сервере может быть установлен редирект, и т.д. и т.п.  
 
Короче, единственно верный вариант - пытаться по каждой ссылке загрузить страницу - разумеется, без видимого запуска браузера  
(не обязательно дожидаться полной загрузки - достаточно получить ответ веб-сервера, и проанализировать код возврата)  
Но это тоже весьма длительный процесс - 10 тыс. ссылок будут проверяться ОЧЕНЬ долго.  
 
Могу сделать макрос - но не бесплатно (работы много, если хотите, чтобы работало относительно быстро)
Страницы: 1
Читают тему
Наверх