Это мой код:
from xgoogle.search import GoogleSearch, SearchError
import urllib, urllib2, sys, argparse
global stringArr
stringArr = ["string 1",
"string 2",
"string 3",
"string etc"]
def searchIt(url):
try:
if(args.verbose>='1'): print "[INFO] Opening URL: "+url
response = urllib.urlopen(url)
except urllib2.URLError, e:
print "[ERROR] "+e.reason
return False
except KeyboardInterrupt:
print "Suspended by user..."
sys.exit()
if(checkForStr(response.read())):
if(args.verbose=='0'): print "[INFO] String found in URL: "+url
else:
if(args.verbose>='1'): print "[INFO] No string found in URL: "+url
def checkForStr(html):
global stringArr
try:
if any(checkStr in html for checkStr in stringArr):
return True
else:
return False
except KeyboardInterrupt:
print "Suspended by user..."
sys.exit()
def main():
try:
i=0
gs = GoogleSearch(args.keyword)
gs.results_per_page = 100
results = []
while True:
tmp = gs.get_results()
i = i+1 # page number
if not tmp: # no more results (pages) were found
break
results.extend(tmp)
for r in results: # process results for page
searchIt(r.url) # check for string
del results[:] # clean results
# finished
except SearchError, e:
print "[ERROR] Search failed: %s" % e
except KeyboardInterrupt:
print "Suspended by user..."
sys.exit()
if __name__ == '__main__':
try:
parser = argparse.ArgumentParser()
parser.add_argument('-v', dest='verbose', default='0', help='Verbosity level', choices='012')
group = parser.add_argument_group('required arguments')
group.add_argument('-k', dest='keyword', help='Keyword to use on google query', required=True)
args = parser.parse_args()
main()
except KeyboardInterrupt:
print "Suspended by user..."
sys.exit()
Я немного сократил его, чтобы было легче читать, но он все равно должен быть функциональным. Этот код будет частью более крупного script.
Я использую эту lib: XGOOGLE, чтобы очистить результаты от google, а затем я нахожу каждый результат для поиска, если веб-сайт содержит любую строку из stringArr.
Я сделал первые тесты без каких-либо проблем (я ctrl + C это после менее 10 результатов), но в первый раз, когда я позволил ему запустить, после того, как около 100 проверенных URL-адресов я получил эту ошибку:
File "./StringScan.py", line 99, in <module>
main()
File "./StringScan.py", line 83, in main
checkForStr(r.url)
File "./StringScan.py", line 39, in checkForStr
response = urllib.urlopen(url)
File "/usr/lib/python2.6/urllib.py", line 86, in urlopen
return opener.open(url)
File "/usr/lib/python2.6/urllib.py", line 205, in open
return getattr(self, name)(url)
File "/usr/lib/python2.6/urllib.py", line 344, in open_http
h.endheaders()
File "/usr/lib/python2.6/httplib.py", line 904, in endheaders
self._send_output()
File "/usr/lib/python2.6/httplib.py", line 776, in _send_output
self.send(msg)
File "/usr/lib/python2.6/httplib.py", line 735, in send
self.connect()
File "/usr/lib/python2.6/httplib.py", line 716, in connect
self.timeout)
File "/usr/lib/python2.6/socket.py", line 500, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
IOError: [Errno socket error] [Errno -2] Name or service not known
(номера строк не совпадают, потому что я изменил код, чтобы опубликовать его здесь)
После этого я вернул свой терминал linux, как если бы script закончил. Но я заметил, что мой компьютер работает не очень хорошо, я проверил System Monitor и увидел, что процесс Python использует 1,3 ГБ памяти, мне пришлось убить процесс, чтобы вернуть свой компьютер в нормальное состояние.
Является ли это чем-то в моем коде, который вызывает это или почему это может произойти?
Я знаю, что мой код может иметь некоторые ошибки, но сейчас меня интересует всякая ошибка, которая может вызвать проблемы с памятью. Любая помощь будет оценена.
Я немного пересмотрел ваш код, чтобы мне было легче читать. Я ничего не вижу здесь, чтобы утечка памяти, хотя
from itertools import count
import urllib, urllib2, sys, argparse
from xgoogle.search import GoogleSearch, SearchError
stringArr = ["string 1",
"string 2",
"string 3",
"string etc"]
def searchIt(url):
try:
if(args.verbose>='1'):
print "[INFO] Opening URL: "+url
response = urllib.urlopen(url)
except urllib2.URLError, e:
print "[ERROR] "+e.reason
return False
if checkForStr(response.read()):
if(args.verbose=='0'):
print "[INFO] String found in URL: "+url
else:
if(args.verbose>='1'):
print "[INFO] No string found in URL: "+url
def checkForStr(html):
return any(checkStr in html for checkStr in stringArr)
def main():
try:
gs = GoogleSearch(args.keyword)
gs.results_per_page = 100
for i in count():
results = gs.get_results()
if not results: # no more results (pages) were found
break
for r in results: # process results for page
searchIt(r.url) # check for string
# finished
except SearchError, e:
print "[ERROR] Search failed: %s" % e
if __name__ == '__main__':
try:
parser = argparse.ArgumentParser()
parser.add_argument('-v', dest='verbose', default='0', help='Verbosity level', choices='012')
group = parser.add_argument_group('required arguments')
group.add_argument('-k', dest='keyword', help='Keyword to use on google query', required=True)
args = parser.parse_args()
main()
except KeyboardInterrupt:
print "Suspended by user..."
sys.exit()
Это может быть urllib.urlopen(). См. http://bugs.python.org/issue1208304
global stringArr
делает не то, что вы думаете, вам не нужны эти строки вообще