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

本文介绍了一种使用Python和gevent协程批量获取百度文库文档URL的方法,通过循环生成关键词和页码,实现了超过1000万份doc文档URL的快速抓取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天抓取的是百度文库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 time

import gevent
from gevent import monkey
from urllib.request import urlopen, Request

monkey.patch_all()
sys.setrecursionlimit(1000000)


def myspider(range1):

    urls = []
    if range1 == 50:
        range2 = 1
    else:
        range2 = range1 - 100
    for 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 += list1
            print(list1)
            print(url)
        except Exception as e:
            print(e)
            continue
    print(wenku_urls)
    print(len(wenku_urls))

    with open('{0}.txt'.format(range1//50), 'w', encoding='utf-8') as f:  # 记录urls
        for 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代码传送门

python爬虫与项目实战,网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。 随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如: (1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。 (2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。 (3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。 (4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。 网络爬虫 为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值