高效爬虫实战经典案例

浪里白条_双河 浪里白条_双河     2022-08-24     418

关键词:

最近,我接到一个任务,具体来说就是:

使用百度来搜索30万关键词,把搜索结果中出现的网站链接全部储存下来。

我们来计算一下,30万关键词,每个关键词百度会给出75个页面,就是2250万个网页的爬虫量。考虑到延时等在内,每秒平均处理一个页面,就需要22500000/(24*3600) = 260天时间,我们用并行处理,十个进程,并行,也需要26天,这简直不可接受

我的改进之路:

首先,考虑多线程,python的多线程不是那么强势,我最开始是这么做的:每一个关键词的75个url的处理,把处理出来的数据放在mysql里面,使用多线程,当处理完后,再来处理下一个关键词,这个程序我的实际运行效率是一个单词大概30秒,也就是一天能处理三千多个单词,程序要运行一百天

然后,我觉得爬每个关键词的结果放在mysql里面,因为要避免放入重复的数据,所以我每次都要判断是否存在,这个步骤很费时间,我想到了redis,并做了实验,由于redis在内存中,而且是键值对的形式,我把爬到的网址当作键,就不用检查是否重复了,并且我计算了一下,假设我最终得到500万不同的网址,每个网址的存储花费30Byte,也才5000000*30/1024 = 146484KB = 143MB,内存完全能够放下,至此,存储方面就可以不用怎么优化了

接着,我们发现一个问题,把每个关键词的75个url作为一个多线程模块,运行完之后,才处理下一个关键词,那么必然有一部分时间的并行量不够,这浪费了,所以我想把所有的单词的url都放入多线程,设置最大并行线程数,但是这样的问题就是不知道某个单词是否已经处理完毕,所以我进行预处理,专门使用一个程序来产生所有的url,并存入txt里面,这一步我也计算过,容量没问题,之后把整个url_list进行多线程操作,就快多了

还有,我发现百度的搜索页面可以一次显示50条信息,而不是最初的十条,这样,我的页面数量瞬间减少到了五分之一,又是一大进步。

同时,我研究了爬取的速度绝对是受网速影响很大的,比如,1MB/S,那么每秒最多处理1MB的数据,所以这个时候,使用Gzip对网页进行压缩,就能大大增加每秒可以下载的网页数目,增加了爬虫效率。

最终结果:

我使用预处理,得到了四百八十多万url,然后,20分钟,处理了28000条,我们算一下,每分钟处理一千四百个url,那么,我们所需时间为:4800000/(24*60*1400) = 2.3天,而且还没有用到多进程,比起最开始的十个进程并行,还需要26天,时间减少到了百分之一不到,真的很爽

高效告别996,开启java高效编程之门3-23汇总操作实战案例(代码片段)

1    重点:1.1  reducedemo组成1.2  准备数据1.3  并行计算 2    规约操作实战案例测试类:packagecom.imooc.zhangxiaoxi.stream;importcom.alibaba.fastjson.JSONObject;importcom.google.common.collect.Lists;importorg.junit.Test;i 查看详情

python爬虫编程思想:实战案例:抓取所有的网络资源(代码片段)

       Python爬虫编程思想(7):实战案例:抓取博客文章列表         到现在为止,我们已经对网络爬虫涉及到的基本知识有了一个初步的了解。本文会编写一个简单的爬虫应用,以便让读者对爬... 查看详情

python应用实战案例:python如何实现异步爬虫?

前言爬虫程序与手机里安装的社交软件和娱乐软件不一样,但它们可能是互相关联的。你早上看到的新闻资讯以及股票走势图,都有可能是爬虫程序收集而来的。爬虫程序的核心是数据——它围绕着数据工作。以下是我为大家准... 查看详情

python应用实战案例:python如何实现异步爬虫?

前言爬虫程序与手机里安装的社交软件和娱乐软件不一样,但它们可能是互相关联的。你早上看到的新闻资讯以及股票走势图,都有可能是爬虫程序收集而来的。爬虫程序的核心是数据——它围绕着数据工作。以下是我为大家准... 查看详情

python爬虫应用实战案例-jsonpath在爬虫中的应用,爬取照片信息(代码片段)

关于JSONJSON是一个标记符序列。这套标记符包括:构造字符、字符串、数字和三个字面值。构造字符JSON包括六个构造字符,分别是:左方括号、右方括号、左大括号、右大括号、冒号与逗号。JSON值JSON值可以是对象、数组、数字... 查看详情

python爬虫应用实战案例-pyquery在爬虫中的应用,爬取猫眼电影数据(代码片段)

什么是pyquerypyquery是类似于jquery的网页解析工具,让你使用jquery的风格来遍历xml文档,它使用lxml操作html的xml文档,它的语法与jquery很像,和我们之前所讲的解析库xpath与BeautifulSoup比起来更加灵活与简便,并且增加了添加类和移... 查看详情

python异步爬虫:引入+线程池实战(代码片段)

...虫(1):引入+线程池实战​使用异步爬虫可以实现高性能高效率的数据爬取操作文章目录python异步爬虫(1):引入+线程池实战一.引入二.线程池实战插播:[pythonresponse.text和response.content的区别](https://www.cnblogs.com/brady-wang/p/96872... 查看详情

案例实战爬虫url去重实战-springboot2.x+guava布隆过滤器

1.爬虫URL去重实战-SpringBoot2.x+Guava布隆过滤器创建项目加入maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot<... 查看详情

网络爬虫开发实战2和一的区别

网络爬虫开发实战2和一的区别Python3网络爬虫开发实战(第二版)》已经上架了!!!!之前我写的第一版的爬虫书《Python3网络爬虫开发实战》在2018年出版,上市三年来,一直处于市面上所有爬虫书的销冠位置,豆瓣评分9.0分... 查看详情

案例篇:python爬虫的多重领域使用

...域承担着重要决策的作用,如互联网就业选择。Python爬虫作为最好的数据采集技术,市场对它需求一直在增涨,同时水涨船高的还有爬虫服务费用。这是近期爬虫接单记录,大家感受一下虽说爬虫项目的订单多、... 查看详情

案例篇:python爬虫的多重领域使用

...域承担着重要决策的作用,如互联网就业选择。Python爬虫作为最好的数据采集技术,市场对它需求一直在增涨,同时水涨船高的还有爬虫服务费用。这是近期爬虫接单记录,大家感受一下虽说爬虫项目的订单多、... 查看详情

案例篇:python爬虫的多重领域使用

...域承担着重要决策的作用,如互联网就业选择。Python爬虫作为最好的数据采集技术,市场对它需求一直在增涨,同时水涨船高的还有爬虫服务费用。这是近期爬虫接单记录,大家感受一下虽说爬虫项目的订单多、... 查看详情

python爬虫应用实战案例-xpath正则表达式使用方法,爬取精美壁纸(代码片段)

使用XPathXPath,全称XMLPathLanguage,即XML路径语言,它是在XML语言中查找信息的语言。它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。在上一篇文章中讲述了正则表达式的使用方法,正则表达式的难度还是比较大的... 查看详情

redis技术专区「实战案例」谈谈使用redis缓存时高效的批量删除的几种方案

前因后果之前我们的服务,在上线的时候发现有一些大Key的使用不是很规范,特别是没有设置过期时间,因此导致redis中内存的数据越来越多,目前Redis节点的内存已经快撑不住了。所以根据缓存键的规则去批量删除这些数据,... 查看详情

怎么用python编写以下要求的程序?

...虫入门实战5.2.1 调用API5.2.2 爬虫实战5.3 爬虫进阶—高效率爬虫5.3.1 多进程5.3.2 多线程5.3.3 协程5.3.4 小结第6章 Python数据存储6.1 关系型数据库MySQL6.1.1 初识MySQL6.1.2 Python操作MySQL6.2 NoSQL之MongoDB6.2.1 初识NoSQL6.2.2 P... 查看详情

python爬虫应用实战案例-jsonpath在爬虫中的应用,爬取照片信息(代码片段)

关于JSONJSON是一个标记符序列。这套标记符包括:构造字符、字符串、数字和三个字面值。构造字符JSON包括六个构造字符,分别是:左方括号、右方括号、左大括号、右大括号、冒号与逗号。JSON值JSON值可以是对象、数组、数字... 查看详情

如何优雅的落地一个分布式爬虫:实战篇(代码片段)

...介绍如何构建一个稳健的分布式微博爬虫。这里我没敢谈高效,抓过微博数据的同学应该都知道微博的反爬虫能力,也知道微博数据抓取的瓶颈在哪里。我在知乎上看过一些同学的说法,把微博的数据抓取难度简单化了,我只能... 查看详情

redis技术专区「实战案例」谈谈使用redis缓存时高效的批量删除的几种方案(代码片段)

前因后果之前我们的服务,在上线的时候发现有一些大Key的使用不是很规范,特别是没有设置过期时间,因此导致redis中内存的数据越来越多,目前Redis节点的内存已经快撑不住了。所以根据缓存键的规则去批量删... 查看详情