网页并发爬取笔记

笔记
当我们用requests请求成功一个网页,requests做了三件事:
1、根据链接参数等组成一个请求。(耗时短)
2、把请求发给目标网页,等待响应。(耗时很长)
3、网站响应后,把响应结果包装成便于我们使用的对象。(耗时短)

为了提高效率,于是有了并发爬取。操作系统赋予我们的能力——多线程,
线程的作用,不同的任务放在不同线程中,这些线程可以同时进行。
concurrent 是 Python 自带的库,这个库具有线程池和进程池、管理并行编程任务、处理非确定性的执行流程、进程/线程同步等功能。
线程池futures
线程池规定了最多同时进行的线程数,某个线程的任务完成后,将该任务移除线程池,让其他未执行的任务执行。由于大多数网站都具备反爬机制,所以不应该过快的运行爬虫程序,线程数设置在10较为妥当。(据说如此,下次试试)

	from concurrent import futures
	#导入concurrent.futures模块
	executor=futures.ThreadPoolExecutor(max_workers=5)
	#最大并发线程数为5
提交任务:executor.submit()函数的返回值为future对象。
fs = []
for url in urls:
  # 提交任务到线程池
  f = executor.submit(session.get, url)
  fs.append(f)
因为无法得知线程什么时候执行完毕,所以为了取出所有的结果,应该执行等待函数
# 等待这些任务全部完成
	futures.wait(fs)
fs为上面所有链接结果对象的列表,当列表中所有对象都有值是,线程池结束。
遍历fs得到所有任务的future结果,调用对象的result()方法就能得到任务的结果。
结果的性质取决于任务的返回值是什么性质,如上为response对象,故可调用response.text()方法显示结果
# 获取任务的结果
	result = [f.result().text for f in fs]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值