网络爬虫-抓取1000W百度文库doc文档

news/2024/11/16 14:29:30/

今天抓取的是百度文库doc文档,但是要求确实随机的1000万份文档并存为txt文本,下载百度文库的开源项目已经有了,那么去哪里找到1000万个百度文库doc文档的url呢,并且在短时间内下载下来。
因为爬虫是一个IO密集型业务,所以使用协程效率则最高,第一时间想到了gevent。

首先分析百度文库的url

https://wenku.baidu.com/search?word=%BD%CC%CA%A6&org=0&fd=0&lm=0&od=0&pn=10

不难发现 word为关键字,pn为当前页数,经过测试,pn最大值为760,超过了这个值百度文库也不会显示,那么也就意味着一个关键字最多显示760个url

url_list = re.findall('<a href="(.*)\?from=search', html) # 获取关键词页面的urls

通过循环遍历1-25000的数字,每个数字作为关键词,进行拼接url,便可以得到超过1000W的url来进行下载了。

urls = []
for i in range(1, 25000):for x in range(0, 760, 10):url = 'https://wenku.baidu.com/search/main?word={0}&org=0&fd=0&lm=1&od=0&pn={1}'.format(i, x) # lm=1为下载doc文档urls.append(url)

好了 接下来就是使用gevent协程来跑爬虫了

import re
import sys
import timeimport gevent
from gevent import monkey
from urllib.request import urlopen, Requestmonkey.patch_all()
sys.setrecursionlimit(1000000)def myspider(range1):urls = []if range1 == 50:range2 = 1else:range2 = range1 - 100for i in range(range2, range1):for x in range(0, 760, 10):url = 'https://wenku.baidu.com/search/main?word={0}&org=0&fd=0&lm=1&od=0&pn={1}'.format(i, x)urls.append(url)wenku_urls = []for url in urls:print(url)try:# r = Request(url, headers=headers)resp = urlopen(url)data = resp.read()list1 = re.findall('<a href="(.*)\?from=search', data.decode('gb18030'))wenku_urls += list1print(list1)print(url)except Exception as e:print(e)continueprint(wenku_urls)print(len(wenku_urls))with open('{0}.txt'.format(range1//50), 'w', encoding='utf-8') as f:  # 记录urlsfor i in list(set(wenku_urls)):f.write(i + '\n')async_time_start = time.time()jobs = []
for i in range(50, 25001, 50):jobs.append(i)
print(jobs)job = [gevent.spawn(myspider, range1) for range1 in jobs]
gevent.joinall(job)print("异步耗时:", time.time() - async_time_start)

启动500个协程,瞬间跑满了带宽,我的辣鸡电脑进过长达8个小时的奋战,终与跑完了所有的url
在这里插入图片描述
在这里插入图片描述

Github代码传送门


http://www.ppmy.cn/news/735691.html

相关文章

mysql大数据建立索引 1000W

重新添加索引&#xff0c;对于1000W级的数据&#xff0c;按常规的方式来操作&#xff0c;时间上是一个很大的问题。而且对于1000W级的数据&#xff0c;本人建议对此表进行分表优化。如果非要添加索引操作&#xff0c;方法倒是有的。 1.创建一个新的表结构&#xff1a;create ta…

使用随机算法产生一个数,要求把1-1000W之间这些数全部生成

使用随机算法产生一个数&#xff0c;要求把1-1000W之间这些数全部生成。&#xff08;考察高效率&#xff0c;解决产生冲突的问题&#xff09; 代码虽然实现了。 提高效率的地方有如下&#xff1a; 1.初始化set集合的时候 Sets.newHashSetWithExpectedSize(value)&#xff0c; …

使用随机算法产生一个数,要求把1-1000W之间这些数全部生成。(考察高效率,解决产生冲突的问题)

【记录学习笔记&#xff0c;方便自己理解。 】 参考博客&#xff1a;https://blog.csdn.net/fanbih/article/details/54913787 以100为例&#xff0c;1000W时将value值更改即可&#xff0c;选取1-100范围方便时输出检验是否正确。 先构建一个value大小的数组&#xff0c;按下…

MySQL如何快速批量插入1000w条数据

听说有个面试题是: 如何快速向mysql中插入1000w条数据? 我私下试了一下, 发现插入10000条数据用了0.9s, 插入10w条数据用了4.7s, 插入100w条数据用了58s左右,1000w条数据,我的笔记本吭哧了5分钟,自己停了, 心中1000w只草泥马呼啸而过,我用的是下面的代码: -- 进入数据库 use…

使用随机算法产生一个数,要求把1-1000W之间这些数全部生成。

使用随机算法产生一个数&#xff0c;要求把1-1000W之间这些数全部生成。&#xff08;考察高效率&#xff0c;解决产生冲突的问题&#xff09; 代码虽然实现了。 提高效率的地方有如下&#xff1a; 1.初始化set集合的时候 Sets.newHashSetWithExpectedSize(value)&#xff0c;…

1000W纯正弦波逆变器方案资料EG8010源代码KA3525原理图图纸PCB

1000W纯正弦波逆变器方案资料EG8010源代码KA3525原理图图纸PCB id657880186786&

MySQL快速生成 1000W 条测试数据

好记忆不如烂笔头&#xff0c;能记下点东西&#xff0c;就记下点&#xff0c;有时间拿出来看看&#xff0c;也会发觉不一样的感受. 目录 1、生成思路 2、创建普通表及内存表 3、创建函数 4.创建存储过程 5、调用存储过程 6、插入普通表中 1、生成思路 利用mysql内存表插…

mysql中导入1000W条数据,哪种方式比较快

前言 背景 今天被妹子问到一个问题&#xff0c;往mysql中导入1000W条数据&#xff0c;哪种方式比较快&#xff0c;我居然被问到了&#xff0c;说实话我还真心不知道。 那就找数据呗&#xff0c;搞数据研发的好处就是&#xff0c;数据肯定是很多的&#xff0c;正好还有测试集群…