请教一个问题,怎么提高 python 爬虫的爬取效率

如题所述

很多爬虫工作者都遇到过抓取非常慢的问题,尤其是需要采集大量数据的情况下。那么如何提高爬虫采集效率就十分关键,一块了解如何提高爬虫采集效率问题。
1.尽可能减少网站访问次数
单次爬虫的主要把时间消耗在网络请求等待响应上面,所以能减少网站访问就减少网站访问,既减少自身的工作量,也减轻网站的压力,还降低被封的风险。
第一步要做的就是流程优化,尽量精简流程,避免在多个页面重复获取。
随后去重,同样是十分重要的手段,一般根据url或者id进行唯一性判别,爬过的就不再继续爬了。
2.分布式爬虫
即便把各种法子都用尽了,单机单位时间内能爬的网页数仍是有限的,面对大量的网页页面队列,可计算的时间仍是很长,这种情况下就必须要用机器换时间了,这就是分布式爬虫。
第一步,分布式并不是爬虫的本质,也并不是必须的,对于互相独立、不存在通信的任务就可手动对任务分割,随后在多个机器上各自执行,减少每台机器的工作量,费时就会成倍减少。
例如有200W个网页页面待爬,可以用5台机器各自爬互不重复的40W个网页页面,相对来说单机费时就缩短了5倍。
可是如果存在着需要通信的状况,例如一个变动的待爬队列,每爬一次这个队列就会发生变化,即便分割任务也就有交叉重复,因为各个机器在程序运行时的待爬队列都不一样了——这种情况下只能用分布式,一个Master存储队列,其他多个Slave各自来取,这样共享一个队列,取的情况下互斥也不会重复爬取。IPIDEA提供高匿稳定的IP同时更注重用户隐私的保护,保障用户的信息安全。含有240+国家地区的ip,支持API批量使用,支持多线程高并发使用。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-11-18
代码使用了 coroutine ,但仍然是单线程在跑,没有利用到多核的优势,如果不考虑对方的反爬而只考虑效率的提高的话 可以再加上多进程试试
写了个简单的协程爬虫爬取 B 站用户信息,代码如下:
import requestsimport reimport json
import datetimeimport asynciodef get_info(uid):
url_info = "htax/member/GetInfo?mid=" #基本信息
uid = str(uid) return loop.run_in_executor(None, requests.get, url_info+uid)
async def user_info(num):
for uid in range(num, num+10):
info = await get_info(uid)
info = json.loads(info.text)["data"] try: # print(datetime.datetime.fromtimestamp(info['regtime']))
print("ok", uid)
print(info) except UnicodeEncodeError as e:
print("UnicodeEncodeError:", e) except TypeError:
print(info)

loop = asyncio.get_event_loop()try:
loop.run_until_complete(asyncio.wait([user_info(x) for x in range(1, 1000, 10)]))except Exception as e:
print("Error:", e)

爬取 1000 条需要 50 秒左右,而且带宽占用也只有 220Kbps 左右的样子,有没有什么办法提高爬取的速度? B 站用户有 3800 万左右。本回答被提问者采纳
第2个回答  2021-07-28
大数据时代,企业和个人会利用爬虫工具爬取大量数据,并利用这些数据分析一个行业的长期发展趋势、监控竞争对手等。现在很多网站都有访问限制。如果经常抓取数据,很容易被禁止访问。那么,如何提高python爬虫的效率呢?
1、设置http代理
使用高质量http代理切换不同的IP进行爬取信息,绕过防爬机制,提高爬虫效率。
2、优化抓取策略
(1)、尽量减少发送的请求数。发送请求和等待响应是使用爬虫最慢的部分。如果您可以减少发送的请求数量,您的抓取工具会快得多。减少请求的常用方法:增加结果页面上的结果数量(例如从10个增加到100个);在抓取之前应用过滤器。
(2)批量上传项目到数据库。抓取缓慢的另一个原因是人们倾向于抓取他们的数据,然后立即将该数据添加到他们的数据库中。批量处理总是比逐项添加更快。
上述内容介绍提高python爬虫的效率的方法,http代理是爬虫不可或缺的工具,有了这个工具,再配上合理的抓取策略,爬虫效率肯定不会低。
相似回答