Python3网络爬虫教程19——分布式爬虫Scrapy实例(爬取多个页面)

Python 全栈工程师核心面试 300 问深入解析(2020 版)----全文预览
Python 全栈工程师核心面试 300 问深入解析(2020 版)----欢迎订阅

上接:
Python3网络爬虫教程18——分布式爬虫Scrapy实例(爬取一个页面)
https://blog.csdn.net/u011318077/article/details/86692598

先补充几个常用命令;

7. Scrapy项目常用命令

  • 先打开CMD命令,CD切换到要创建的项目的文件夹下
    • scrapy startproject(创建项目)
  • 创建项目之后切换到项目文件夹下
    • scrapy crawl XX(运行XX蜘蛛)
    • scrapy shell http://www.scrapyd.cn(调试网址为http://www.scrapyd.cn的网站)
  • scrapy version 查看版本
  • scrapy list
    • 这里的蜘蛛就是指spider文件夹下面xx.py文件中定义的name,
    • 你有10个py文件但是只有一个定义了蜘蛛的name,那只算一个蜘蛛
    • 比如我spider文件夹有3个xxx.py,每个里面都只定义了1个蜘蛛,输出如下
    • D:\Hello World\python_work\TLXY_study_note\Spider\mingyan2>scrapy list
      ItemSpider
      ListSpider
      mingyan2

8. scrapy分布式爬取(爬取多个页面的多个数据)

  • 该网站为例:http://lab.scrapyd.cn

  • 查看源代码,找到下一页的连接所在位置

  • 爬取思路:

    • 我们每爬一页就用css选择器来查询,是否存在下一页链接,
    • 存在:则爬取下一页链接:http://lab.scrapyd.cn/page/*/,
    • 然后把下一页链接提交给当前爬取的函数,继续爬取,继续查找下一页,
    • 直到找不到下一页,说明所有页面已经爬完,那结束爬虫。
    • 先提取下一页的连接,并判断是否有下一页连接这个这个值
      next_page = response.css(‘li.next a::attr(href)’).extract_first()
      if next_page is not None:
    • 然后执行urljoin后我们最终next_page的网址就是http://lab.scrapyd.cn/page/2
    • scrapy给我们提供了这么一个方法:scrapy.Request()
    • 参考实例中的详细注释
  • 参考实例NextSpider.py


 # 提取http://lab.scrapyd.cn中的五条名言
# 然后接着继续爬取下一页,下一页......
# 作者-语录合集命名保存

import scrapy

# 定义一个mingyan类,继承Spider父类
class NextSpider(scrapy.Spider):

    # 定义蜘蛛名
    name = 'NextSpider'
    start_urls = ['http://lab.scrapyd.cn']

    def parse(self, response):

        # 提取页面中的所有的名言
        mingyan = response.css('div.quote')

        for v in mingyan:
            # 提取css中text标签对应的文字内容,名言的正文
            text = v.css('.text::text').extract_first()
            # 提取作者
            author = v.css('.author::text').extract_first()
            # 提取标签
            tags = v.css('.tags .tag::text').extract()
            # 数组转换为字符串
            tags = ', '.join(tags)
            # 将爬去的内容存入文件,文件名为:编号. 作者-语录.txt
            filename =  '%s-语录合集.txt' %(author)
            # 以写的方式打开文件并写入内容
            with open(filename, "a+") as f:
                f.write(text)
                f.write('\n')
                f.write('标签: ' + tags)
                f.write('\n---------------\n')
                f.close()

        # 上面已经爬取保存完成了第一页的内容
        # 接下来我们先判断下一页是否存在,如果存在
        # 就提交给上面的parse方法继续执行,下面是提交的方法
        # css选择器提取下一页链接,并判断是否有下一页这个链接

        # 第一次实现时extract_first()写成了extrast_first(),未提示拼写错误
        next_page = response.css('li.next a::attr(href)').extract_first()
        if next_page is not None:

            # 第二页连接是http://lab.scrapyd.cn/page/2
            # 第二页连接是http://lab.scrapyd.cn/page/3
            # 如果是相对路径,如:/page/1
            # url.join能替我们转换为绝对路径,也就是加上我们的域名
            # 执行urljoin后我们最终next_page的网址就是http://lab.scrapyd.cn/page/2

            next_page = response.urljoin(next_page)

            '''
            接下来就是爬取下一页或是内容页的秘诀所在:
            scrapy给我们提供了这么一个方法:scrapy.Request()
            这个方法还有许多参数,后面我们慢慢说,这里我们只使用了两个参数
            一个是:我们继续爬取的链接(next_page),这里是下一页链接,当然也可以是内容页
            另一个是:我们要把链接提交给哪一个函数(callback=self.parse)爬取,
            这里是parse函数,也就是本函数,回到parse函数开头,然后爬取完第2页内容
            同时,又提取到第3页的连接,然后,一直循环下去,直到下一页的连接不存在位置
            当然,我们也可以在下面另写一个函数,比如:内容页,专门处理内容页的数据
            经过这么一个函数,下一页链接又提交给了parse,那就可以不断的爬取了,直到不存在下一页
            yield生成器函数,每次调用都从yield这里开始执行
            '''

            yield scrapy.Request(next_page, callback=self.parse)

本章案例源代码及输出结果图片查看GITHUB:
https://github.com/FangbaiZhang/TLXY_study_note/tree/master/Spider

下接:Python3网络爬虫教程20——分布式爬虫爬取10000个百度百科词条
https://blog.csdn.net/u011318077/article/details/88142040

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个功能强大的Python网络爬虫框架,支持分布式爬虫分布式爬虫是将任务分发给多个机器或节点来执行,可以提高爬虫效率和速度,避免单点故障。 一个Scrapy分布式爬虫实例通常由一个爬虫节点(master)和多个工作节点(slave)组成。爬虫节点负责任务分配和调度,每个工作节点则负责实际的网页抓和数据提工作。爬虫节点和工作节点之间通过网络通信来协作完成任务。 实现Scrapy分布式爬虫需要以下步骤: 1. 在settings.py文件中配置分布式相关的参数,如REDIS_URL、SCHEDULER_PERSIST、DUPEFILTER_CLASS、SCHEDULER、ITEM_PIPELINES等。 2. 创建一个爬虫节点和多个工作节点,可以在不同的机器上运行。启动爬虫节点时,通过命令行传入参数`scrapy crawl [spider_name] -s JOBDIR=[job_directory]`来指定任务保存的目录。 3. 在工作节点上启动爬虫,同样需要指定任务目录和节点标识符。命令行参数格式如下:`scrapy runspider [spider_name] -s JOBDIR=[job_directory] -s NODE_ID=[node_id]` 4. 每个工作节点网页后,会把提到的数据发送给爬虫节点。爬虫节点可以对数据进行去重和存储等操作,也可以把任务分配给其他可用的工作节点。 5. 爬虫节点可以通过web接口实时监控任务状态和进度,也可以在任务完成后生成报告并邮件通知。 Scrapy分布式爬虫可以加速数据抓、处理和存储,提高效率和可靠性。但是需要注意,分布式爬虫需要配合高速网络和高性能计算机使用,否则可能会出现性能瓶颈和任务阻塞的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值