在我以前版本的代码中,我使用for循环来执行网页抓取,并将大块数据添加到字典中。现在,我正在寻找使用multiprocessing
和Pool
来加速我的抓取过程。网络抓取中的多处理线程
要做到这一点,我有这样的事情:
# 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
会更好?
我错过这个调用一个位置参数,这样就不会工作。我的'scrapePage'有两个参数。 –
我明白了。让我一分钟。我会尽力帮助 – AndMar