0

在我以前版本的代码中,我使用for循环来执行网页抓取,并将大块数据添加到字典中。现在,我正在寻找使用multiprocessingPool来加速我的抓取过程。网络抓取中的多处理线程

要做到这一点,我有这样的事情:

# First, create a list of pages to go over 
for currentPage in range(firstPage, lastPage + 1): 
    bookList.append("{}{}".format(PAGE_FORMAT, currentPage)) 

# Multiprocessing for each index page 
pagePool = Pool(lastPage - firstPage + 1) 
pagePool.map(scrapePage(bookList, book), (bookList, book)) 
pagePool.terminate() 
pagePool.join() 

在此块的代码,bookList是一个简单的页面来遍历数组,book是数据最终会被存储在一个字典, scrapePage是一个接收网页和字典并对其进行处理的函数。

我不知道如何编写我的map参数,因为我的函数需要多个参数。我曾尝试将函数单独作为第一个参数,然后将其他参数作为map参数放入,但这也不起作用。

编辑:我检查了几个问题,处理这种情况,但我不知道如何应用它(例如celery)。我想要在程序中实现的是并行抓取数据(同时抓取多个目录页面,然后在每次调用一个页面时,同时抓取目录中的几个条目)。

虽然有问题的网站已经序列化了内容(在我原来的代码中,我会刮目录页面i,然后在页面上刮取条目1-100 ...然后转到第ii页并重复) ,因为我正在使用一本字典,所以我并不关心这些内容是否被序列化。使用multiprocessing还是celery会更好?

回答

0

你试着拨打pagePool.map这样:

pagePool.map(scrapePage, (bookList, book,)) 
+0

我错过这个调用一个位置参数,这样就不会工作。我的'scrapePage'有两个参数。 –

+0

我明白了。让我一分钟。我会尽力帮助 – AndMar