簡體   English   中英

Python urllib3和代理

[英]Python urllib3 and proxy

我試圖弄清楚如何使用代理和多線程。

此代碼有效:

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傳遞給請求,在標題中等)。 唯一有效的是:

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_urlWorkerPool

有關如何將這兩者合並為工作代碼的任何想法? 由於時間限制,我寧願避免將其重寫為雜亂無章等

問候

首先,我建議避免使用像瘟疫一樣的urllib,而是使用請求,這些請求非常容易支持代理: http//docs.python-requests.org/en/latest/user/advanced/#proxies
接下來,我沒有使用它與多線程,但多處理,並且工作得很好,你必須要弄清楚的唯一的事情是你是否有一個動態隊列或一個相當固定的列表,你可以傳播over workers,后者的一個例子,它在x進程上均勻地分配url列表:

# *** 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 = multipleprocessing #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。 希望這可以幫助!

看來你丟棄調用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()

注意:如果您使用的是3.2或更高版本的python,則可以使用concurrent.futures.ThreadPoolExecutor 它的引用類似於workerpool但包含在標准庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM