添加多线程或异步到网络抓取
Add multithreading or asynchronous to web scrape
实现多线程以加快网络抓取速度的最佳方法是什么?
使用 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 带有基于进程和线程的池。使用哪个是一个权衡。进程更适合并行化 运行 代码,但在将结果传回主程序时成本更高。在你的情况下,你的代码主要是在等待 url 并且有一个相对较大的 return 对象,所以线程池是有意义的。
我根据需要在 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')
实现多线程以加快网络抓取速度的最佳方法是什么? 使用 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 带有基于进程和线程的池。使用哪个是一个权衡。进程更适合并行化 运行 代码,但在将结果传回主程序时成本更高。在你的情况下,你的代码主要是在等待 url 并且有一个相对较大的 return 对象,所以线程池是有意义的。
我根据需要在 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')