Загрузка файлов с нескольких сайтов.

Это мой первый проект Python, поэтому он очень простой и рудиментарный. Мне часто приходится очищать вирусы от друзей, а бесплатные программы, которые я использую, часто обновляются. Вместо ручной загрузки каждой программы я пытался создать простой способ автоматизации процесса. Поскольку я также пытаюсь изучить python, я думал, что это будет хорошая возможность практиковать.

Вопросов:

Мне нужно найти файл .exe с некоторыми ссылками. Я могу найти правильный URL-адрес, но при попытке загрузки я получаю сообщение об ошибке.

Есть ли способ добавить все ссылки в список, а затем создать функцию для перехода по списку и запустить функцию на каждом URL-адресе? У меня Google довольно много, и я просто не могу заставить его работать. Может быть, я не думаю в правильном направлении?

import urllib, urllib2, re, os from BeautifulSoup import BeautifulSoup # Website List sas = 'http://cdn.superantispyware.com/SUPERAntiSpyware.exe' tds = 'http://support.kaspersky.com/downloads/utils/tdsskiller.exe' mbam = 'http://www.bleepingcomputer.com/download/malwarebytes-anti-malware/dl/7/?1' tr = 'http://www.simplysup.com/tremover/download.html' urllist = [sas, tr, tds, tr] urrllist2 = [] # Find exe files to download match = re.compile('\.exe') data = urllib2.urlopen(urllist) page = BeautifulSoup(data) # Check links #def findexe(): for link in page.findAll('a'): try: href = link['href'] if re.search(match, href): urllist2.append(href) except KeyError: pass os.chdir(r"C:\_VirusFixes") urllib.urlretrieve(urllist2, os.path.basename(urllist2)) 

Как вы можете видеть, я оставил функцию закомментированной, поскольку я не могу заставить ее работать правильно.

Должен ли я отказаться от списка и просто загрузить их отдельно? Я пытался быть эффективным.

Любые предложения или если вы можете указать мне в правильном направлении, это было бы очень признательно.

3 Solutions collect form web for “Загрузка файлов с нескольких сайтов.”

В дополнение к ответу mikez302 , вот немного более читаемый способ написать свой код:

 import os import re import urllib import urllib2 from BeautifulSoup import BeautifulSoup websites = [ 'http://cdn.superantispyware.com/SUPERAntiSpyware.exe' 'http://support.kaspersky.com/downloads/utils/tdsskiller.exe' 'http://www.bleepingcomputer.com/download/malwarebytes-anti-malware/dl/7/?1' 'http://www.simplysup.com/tremover/download.html' ] download_links = [] for url in websites: connection = urllib2.urlopen(url) soup = BeautifulSoup(connection) connection.close() for link in soup.findAll('a', {href: re.compile(r'\.exe$')}): download_links.append(link['href']) for url in download_links: urllib.urlretrieve(url, r'C:\_VirusFixes', os.path.basename(url)) 

urllib2.urlopen – это функция для доступа к одному URL-адресу. Если вы хотите получить доступ к нескольким, вы должны перебрать список. Вы должны сделать что-то вроде этого:

 for url in urllist: data = urllib2.urlopen(url) page = BeautifulSoup(data) # Check links for link in page.findAll('a'): try: href = link['href'] if re.search(match, href): urllist2.append(href) except KeyError: pass os.chdir(r"C:\_VirusFixes") urllib.urlretrieve(urllist2, os.path.basename(urllist2)) 

Код выше не работал для меня, в моем случае это было потому, что страницы собирают свои ссылки через скрипт, а не включают его в код. Когда я столкнулся с этой проблемой, я использовал следующий код, который является просто скребком:

 import os import re import urllib import urllib2 from bs4 import BeautifulSoup url = '' connection = urllib2.urlopen(url) soup = BeautifulSoup(connection) #Everything the same up to here regex = '(.+?).zip' #Here we insert the pattern we are looking for pattern = re.compile(regex) link = re.findall(pattern,str(soup)) #This finds all the .zip (.exe) in the text x=0 for i in link: link[x]=i.split(' ')[len(i.split(' '))-1] # When it finds all the .zip, it usually comes back with a lot of undesirable # text, luckily the file name is almost always separated by a space from the # rest of the text which is why we do the split x+=1 os.chdir("F:\Documents") # This is the filepath where I want to save everything I download for i in link: urllib.urlretrieve(url,filename=i+".zip") # Remember that the text we found doesn't include the .zip (or .exe in your case) so we want to reestablish that. 

Это не так эффективно, как коды предыдущих ответов, но он будет работать практически для любого сайта.

Python - лучший язык программирования в мире.