Я пытаюсь написать свой первый скрипт на Python, и с большим количеством Google, я думаю, я почти закончил.Тем не менее, мне понадобится некоторая помощь, чтобы добраться до финиша.
Мне нужно написать скрипт, который будет входить на сайт с поддержкой cookie, очищать кучу ссылок, а затем создавать несколько процессов для загрузкифайлы.У меня программа работает в однопоточном режиме, поэтому я знаю, что код работает.Но когда я попытался создать пул работников загрузки, я наткнулся на стену.
#manager.py
import Fetch # the module name where worker lives
from multiprocessing import pool
def FetchReports(links,Username,Password,VendorID):
pool = multiprocessing.Pool(processes=4, initializer=Fetch._ProcessStart, initargs=(SiteBase,DataPath,Username,Password,VendorID,))
pool.map(Fetch.DownloadJob,links)
pool.close()
pool.join()
#worker.py
import mechanize
import atexit
def _ProcessStart(_SiteBase,_DataPath,User,Password,VendorID):
Login(User,Password)
global SiteBase
SiteBase = _SiteBase
global DataPath
DataPath = _DataPath
atexit.register(Logout)
def DownloadJob(link):
mechanize.urlretrieve(mechanize.urljoin(SiteBase, link),filename=DataPath+'\\'+filename,data=data)
return True
В этой ревизии код завершается ошибкой, поскольку файлы cookie не были переданы работнику для использования в качестве urlretrieve.Нет проблем, я смог использовать класс механизатора .cookiejar, чтобы сохранить куки в менеджере и передать их работнику.
#worker.py
import mechanize
import atexit
from multiprocessing import current_process
def _ProcessStart(_SiteBase,_DataPath,User,Password,VendorID):
global cookies
cookies = mechanize.LWPCookieJar()
opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cookies))
Login(User,Password,opener) # note I pass the opener to Login so it can catch the cookies.
global SiteBase
SiteBase = _SiteBase
global DataPath
DataPath = _DataPath
cookies.save(DataPath+'\\'+current_process().name+'cookies.txt',True,True)
atexit.register(Logout)
def DownloadJob(link):
cj = mechanize.LWPCookieJar()
cj.revert(filename=DataPath+'\\'+current_process().name+'cookies.txt', ignore_discard=True, ignore_expires=True)
opener = mechanize.build_opener(mechanize.HTTPCookieProcessor(cj))
file = open(DataPath+'\\'+filename, "wb")
file.write(opener.open(mechanize.urljoin(SiteBase, link)).read())
file.close
Но, ЭТО терпит неудачу, потому что новичок (я думаю) хочет переместитьБинарный файл возвращается к менеджеру для обработки, и я получаю сообщение об ошибке «Невозможно засолить объект», ссылаясь на веб-страницу, которую он пытается прочитать в файл.
Очевидное решение - прочитать файлы cookie избанку печенья и вручную добавьте их в заголовок при выполнении запроса urlretrieve, но я пытаюсь избежать этого, и именно поэтому я ищу предложения.