python - 添加多线程或异步到网络抓取

标签 python multithreading python-3.x threadpool

实现多线程以加快网页抓取速度的最佳方法是什么? 使用 Pool 是否是一个好的解决方案 - 如果是的话,我将在代码中的何处实现它?

import requests
from multiprocessing import Pool

with open('testing.txt', 'w') as outfile:
    results = []
    for number in (4,8,5,7,3,10):
        url = requests.get('https://www.google.com/' + str(number))
        response =(url)
        results.append(response.text)
        print(results)

    outfile.write("\n".join(results))

最佳答案

这可以轻松移动到池中。 Python 带有基于进程和线程的池。使用哪个是一个权衡。进程对于并行运行代码效果更好,但在将结果传递回主程序时成本更高。在您的情况下,您的代码主要等待网址并且具有相对较大的返回对象,因此线程池是有意义的。

我根据 Windows 计算机上的需要将代码移至 if __name__ 内。

import requests
from multiprocessing import Pool
from multiprocessing.pool import ThreadPool

def worker(number):
    url = requests.get('https://www.google.com/' + str(number))
    return url.text

# put some sort of cap on outstanding requests...
MAX_URL_REQUESTS = 10

if __name__ == "__main__":
    numbers = (4,8,5,7,3,10)
    with ThreadPool(min(len(numbers), MAX_URL_REQUESTS)) as pool:
        with open('testing.txt', 'w') as outfile:
            for result in pool.map(worker, numbers, chunksize=1):
                outfile.write(result)
                outfile.write('\n')

关于python - 添加多线程或异步到网络抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49843439/

相关文章:

python - 如果生成器表达式不是唯一参数,则必须用括号括起来

mysql - 如何使用没有数据库名称的引擎对象查询数据库

python - 将套接字转换为子类型

python - Windows 和 Linux 之间 QT 的形式差异

Python "ImportError: No module named...",但模块存在

python - 使用无服务器的 Numpy lambda 错误

java - ReentrantLock 线程随机终止

Java,使用队列管理器进行大规模消息处理(交易)

android - 由于数据库更新频繁,借助线程每隔 X 秒启动一次服务

python-3.x - Python 3 - 断言一个 bool 值。