在启用cookie的网站上使用urlretrieve的多线程Web刮板
||
我正在尝试编写我的第一个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类将cookie保存在管理器中,并将它们传递给工作人员。
#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罐中读取cookie,并在发出urlretrieve请求时手动将其添加到标头中,但是我试图避免这种情况,这就是为什么我要寻求建议的原因。
没有找到相关结果
已邀请:
3 个回复
寇剩
黎喊病
因为我只是从列表中下载链接,所以机械化的非线程安全性质似乎不是问题[完全公开:我已经运行了3次此过程,因此在进一步测试中可能会出现问题]。多处理模块及其工作人员池承担了所有繁重的工作。维护文件中的cookie对我来说很重要,因为我从中下载的Web服务器必须为每个线程提供其自己的会话ID,但是实现此代码的其他人可能不需要使用它。我确实注意到,它似乎在初始化调用和运行调用之间“忘记了”变量,因此cookiejar可能不会跳转。
授巨
然后,您可以按照以下方式检索网址: