我正在尝试弄清楚如何使用代理和多线程。
下面的代码可以工作:
requester = urllib3.PoolManager(maxsize = 10, headers = self.headers)
thread_pool = workerpool.WorkerPool()
thread_pool.map(grab_wrapper, [item['link'] for item in products])
thread_pool.shutdown()
thread_pool.wait() 然后在grab_wrapper中
requested_page = requester.request('GET', url, assert_same_host = False, headers = self.headers)标头包括: Accept、Accept-Charset、Accept-Encoding、Accept-Language和User-Agent
但这在生产中不起作用,因为它必须通过代理,不需要授权。
我尝试了不同的方法(将proxies传递给request,在headers中,等等)。唯一有效的方法是:
requester = urllib3.proxy_from_url(self._PROXY_URL, maxsize = 7, headers = self.headers)
thread_pool = workerpool.WorkerPool(size = 10)
thread_pool.map(grab_wrapper, [item['link'] for item in products])
thread_pool.shutdown()
thread_pool.wait() 现在,当我运行该程序时,它将发出10个请求(10个线程),然后...停。没有错误,没有任何警告。这是我绕过代理的唯一方法,但是似乎不可能同时使用proxy_from_url和WorkerPool。
你有什么办法把这两个组合成一个有效的代码吗?由于时间限制,我宁可避免将其重写为scrappy等。
问候
发布于 2013-03-08 01:40:40
您似乎正在丢弃调用thread_pool.map()的结果,尝试将其赋值给一个变量:
requester = urllib3.proxy_from_url(PROXY, maxsize=7)
thread_pool = workerpool.WorkerPool(size=10)
def grab_wrapper(url):
return requester.request('GET', url)
results = thread_pool.map(grab_wrapper, LINKS)
thread_pool.shutdown()
thread_pool.wait()注意:如果你使用的是Python3.2或更高版本,你可以使用concurrent.futures.ThreadPoolExecutor。它的报价类似于workerpool,但包含在标准库中。
发布于 2013-03-04 18:32:58
首先,我建议避免像瘟疫一样使用urllib,而是使用请求,它对代理的支持非常容易:http://docs.python-requests.org/en/latest/user/advanced/#proxies
接下来,我没有在多线程中使用它,而是在多进程中使用它,它工作得很好,你唯一需要弄清楚的是,你是否有一个动态队列或一个相当固定的列表,你可以在工作进程中分布,后者的一个例子是将urls列表均匀分布在x个进程中:
# *** prepare multi processing
nr_processes = 4
chunksize = int(math.ceil(total_nr_urls / float(nr_processes)))
procs = []
# *** start up processes
for i in range(nr_processes):
start_row = chunksize * i
end_row = min(chunksize * (i + 1), total_nr_store)
p = multiprocessing.Process(
target=url_loop,
args=(start_row, end_row, str(i), job_id_input))
procs.append(p)
p.start()
# *** Wait for all worker processes to finish
for p in procs:
p.join()每个url_loop进程都会将自己的数据集写到数据库中的表中,因此我不必担心在Python语言中将它们连接在一起。
编辑:在进程之间共享数据有关详细信息,请参阅:http://docs.python.org/2/library/multiprocessing.html?highlight=multiprocessing#multiprocessing ->
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 3.1415927
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print num.value
print arr[:]但正如您所看到的,基本上这些特殊类型(值和数组)允许在进程之间共享数据。如果你想找一个队列来做一个类似舍入的过程,你可以使用JoinableQueue。希望这能有所帮助!
https://stackoverflow.com/questions/14978434
复制相似问题