Scrapy-自动爬虫

2023-05-16

在前面几篇博文当中,我们使用Scrapy框架编写的爬虫项目,只能爬取起始网址中设置的网页。有时候,我们需要让爬虫持续不断的自动爬取多个网页,此时,我们需要编写自动爬取网页的爬虫。在本章中,我们以我的博客为例,为大家讲解如何编写自动爬取网页的Scrapy爬虫

Items的编写

我们在使用scrapy startproject blog --nolog命令创建好爬虫项目之后,首先需要编写items.py,在该文件中定义好我们关注的需要的数据。我们要爬取的这些网页中包含了大量的数据,但并不是每一样数据我们都关注,如果我们将这些网页所有的数据都存储起来,那么会比较乱并且浪费大量的服务器资源。比如,我们比较关注这些文章中的标题,阅读数, 发布时间等数据,我们可以只提取各网页中每个商品的这5项信息。修改后items.py文件,代码如下:

import scrapy

class BlogItem(scrapy.Item):
    title = scrapy.Field()
    page_views = scrapy.Field()
    published_date = scrapy.Field()

编写好items.py后,我们就定义好了需要关注的结构化数据了

定制Item Pipeline

编写好items.py文件之后,还需要对爬取的数据做进一步的处理,比如存储到json文件中,这就要说到Item Pipeline。当ItemSpider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。Item Pipeline主要有以下典型应用:

  • 清理HTML数据
  • 验证爬取的数据的合法性,检查Item是否包含某些字段
  • 查重并丢弃
  • 将爬取结果保存到文件或者数据库中

定制Item Pipeline的方法其实很简单,每个Item Pipeline组件是一个独立的Python类,必须实现process_item方法,方法原型如下:

def process_item(self, item, spider)

每个Item Pipeline组件都需要调用该方法,这个方法必须返回一个Item对象,或者抛出DropItem异常,被丢弃的Item将不会被之后的Pipeline组件所处理。参数说明如下:

  • item: 被爬取的Item对象
  • spider: 代表着爬取该Item的Spider

我们需要将爬虫爬取的Item存储到本地的json文件中。我们将该爬虫项目中的pipeline.py文件修改后代码如下:

import json

class BlogPipeline(object):

    def __init__(self):
        self.file = open("blog.json", 'w', encoding='utf-8')

    def process_item(self, item, *args, **kwargs):
        for i in range(len(item['title'])):
            title = item['title'][i]
            page_views = item['page_views'][i]
            published_date = item['published_date'][i]
            i = json.dumps({'title': title, 'page_views': page_views, 'published_date': published_date}, ensure_ascii=False)
            line = i + '\n'
            self.file.write(line)
        return item

    def close_spider(self, *args, **kwargs):
        self.file.close()

此时,我们通过pipelines.py文件将获取到的博客信息存入到了当前目录下的blog.json文件当中了。

激活Item Pipeline

定制完Item Pipeline,它是无法工作的,需要进行激活。要启用一个Item Pipeline组件,必须将它的类添加到settings.py中的ITEM_PIPLINES变量中,代码如下:

ITEM_PIPELINES = {
    'blog.pipelines.BlogPipeline': 300,
}
COOKIES_ENABLED = False # 禁用cookie

Spider的编写

设置好settings.py文件之后,我们需要对该项目中最核心的部分—爬虫文件进行相应的编写,来实现网页的自动爬取以及关键字信息的提取。如下:

import scrapy
from scrapy.http import Request
from blog.items import BlogItem


class BlogSpider(scrapy.Spider):
    name = "blog"
    allowed_domains = ["csdn.net"]
    start_urls = ["https://blog.csdn.net/y472360651/article/list/1"]

    def parse(self, response, **kwargs):
        item = BlogItem()
        res = response.xpath(
            '//*[@id="articleMeList-blog"]/div[2]/div/h4/a/text()').extract()
        item['title'] = []
        for i in res:
            i = i.replace('\n', '').replace(' ', '')
            if i:
                item['title'].append(i)

        item['page_views'] = response.xpath('//*[@id="articleMeList-blog"]/div[2]/div/div[1]/p/span[2]/text()').extract()
        item['published_date'] = response.xpath('//*[@id="articleMeList-blog"]/div[2]/div/div[1]/p/span[1]/text()').extract()
        # 提取完后返回
        yield item
        # 通过循环自动爬取6页的数据
        for i in range(2, 7):
            url = f"https://blog.csdn.net/y472360651/article/list/{i}"
            # 实现自动爬取
            yield Request(url=url, callback=self.parse)

上面的爬虫文件中,关键部分为通过XPath表达式对我们所关注的数据信息进行提取,要爬取的网址的构造以及通过yield返回Request实现网页的自动爬取等。

我们可以运行以下该爬虫,如下:

scrapy crawl blog --nolog

运行完成之后,我们可以在当前目录发现一个名为blog.json的文件,里面就是我们爬取的博客内容啦!

自此,Over~~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy-自动爬虫 的相关文章

  • 好斗的。开始爬行后如何更改蜘蛛设置?

    我无法更改解析方法中的蜘蛛设置 但这绝对是一个办法 例如 class SomeSpider BaseSpider name mySpider allowed domains example com start urls http examp
  • Scrapy Python Craigslist Scraper

    我正在尝试使用 Craigslist 分类广告Scrapy提取待售物品 我能够提取日期 帖子标题和帖子 URL但提取时遇到问题price 由于某种原因 当前代码提取all的价格 但是当我删除 在价格范围之前查找价格字段返回为空 有人可以查看
  • 如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用?

    我需要在Scrapy中运行一些多线程 多处理工作 因为我有一些使用阻塞调用的库 并在完成后将请求放回Scrapy引擎 我需要这样的东西 def blocking call self html do some work in blocking
  • 使用scrapy到json文件只得到一行输出

    好吧 我对一般编程很陌生 并且具体使用 Scrapy 来实现此目的 我编写了一个爬虫来从 pinterest com 上的 pin 获取数据 问题是我以前从我正在抓取的页面上的所有引脚获取数据 但现在我只获取第一个引脚的数据 我认为问题出在
  • scrapy中如何处理302重定向

    我在抓取网站时收到来自服务器的 302 响应 2014 04 01 21 31 51 0200 ahrefs h DEBUG Redirecting 302 to
  • 如何使用scrapy Selector获取节点的innerHTML?

    假设有一些 html 片段 例如 a text in a b text in b b a
  • Python Scrapy:allowed_domains从数据库添加新域

    我需要向 allowed domains 添加更多域 因此我没有收到 已过滤的异地请求 我的应用程序获取从数据库获取的网址 因此我无法手动添加它们 我试图覆盖蜘蛛init 像这样 def init self super CrawlSpide
  • 我的扩展中未收到 Scrapy Spider_idle 信号

    我在几个蜘蛛之间有共同的行为spider idle正在接收信号 我想将此行为移至扩展中 我的分机已经监听spider opened and spider closed信号成功 但是 那spider idle未收到信号 这是我的扩展 为简洁起
  • 运行Scrapy的Django自定义管理命令:如何包含Scrapy的选项?

    我希望能够运行Scrapy网络爬虫框架 http scrapy org 来自 Django 内部 Scrapy本身只提供了一个命令行工具scrapy执行其命令 即该工具不是故意编写为从外部程序调用的 用户米哈伊尔 科罗博夫 https st
  • scrapy:当蜘蛛退出时调用函数

    有没有办法在 Spider 类终止之前触发该方法 我可以自己终止蜘蛛 如下所示 class MySpider CrawlSpider Config stuff goes here def quit self Do some stuff ra
  • scrapy-如何停止重定向(302)

    我正在尝试使用 Scrapy 抓取 url 但它会将我重定向到不存在的页面 Redirecting 302 to
  • Scrapy规则如何与爬行蜘蛛一起工作

    我很难理解 scrapy 爬行蜘蛛规则 我有一个例子 它并不像我希望的那样工作 所以它可能是两件事 我不明白规则是如何运作的 我形成了不正确的正则表达式 导致我无法获得所需的结果 好吧 这就是我想做的 我想编写爬行蜘蛛 它将获取所有可用的统
  • scrapyd-client 命令未找到

    我刚刚在 virtualenv 中安装了 scrapyd client 1 1 0 并成功运行命令 scrapyd deploy 但是当我运行 scrapyd client 时 终端显示 命令未找到 scrapyd client 根据自述文
  • 使用 Selenium 在选项卡之间切换并对个人执行操作

    我正在尝试提取 URL 将其打开到新选项卡中 然后执行一些操作 我的代码是 urls self driver find elements by xpath div id maincontent table tbody tr td a hre
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • Scrapy 文件管道不下载文件

    我的任务是构建一个可以下载所有内容的网络爬虫 pdfs 在给定站点中 Spider 在本地计算机和抓取集线器上运行 由于某种原因 当我运行它时 它只下载一些但不是全部的 pdf 通过查看输出中的项目可以看出这一点JSON 我已经设定MEDI
  • 从带有文件输出的脚本运行 Scrapy

    我目前正在使用带有以下命令行参数的 Scrapy scrapy crawl my spider o data json 不过 我更愿意将此命令 保存 在 Python 脚本中 下列的https doc scrapy org en lates
  • 蜘蛛内的Scrapyd jobid值

    Scrapy 框架 Scrapyd 服务器 我在获取蜘蛛内部的 jobid 值时遇到一些问题 将数据发布到后http localhost 6800 schedule json http localhost 6800 schedule jso
  • 如何限制scrapy请求对象?

    所以我有一个蜘蛛 我认为它正在泄漏内存 结果当我检查 telnet 控制台 gt gt gt prefs 时 它只是从链接丰富的页面中抓取了太多链接 有时它会超过 100 000 个 现在我已经一遍又一遍地浏览文档和谷歌 但我找不到一种方法

随机推荐

  • ROS-----pluginlib使用总结

    1 简介 pluginlib是一个C 43 43 库 xff0c 可以实现为一个ROS包动态的加载和卸载插件 这里的插件通常是一些功能类 xff0c 且以运行时可动态加载的库 xff08 如共享对象 xff0c 动态链接库 xff09 的形
  • sumo生成随机车流

    在安装好sumo后 xff0c 生成模拟道路及模拟随机车辆 xff1a 主要参考链接 xff1a https blog csdn net qq 44045364 article details 102912041 以下对于该链接的内容进行一
  • 49天精通Java,第11天,java接口和抽象类的异同,default关键字

    目录 一 什么是接口 二 接口的特点 三 接口和类的区别 四 接口和抽象类的区别 五 接口的声明方式 六 default默认方法 大家好 我是哪吒 一 什么是接口 Java接口是一系列方法的声明 是一些方法特征的集合 一个接口只有方法的特征
  • 解决150%分辨率下拉框错位和echarts鼠标移入焦点错位的问题

    解决150 分辨率下拉框错位和echarts鼠标移入焦点错位的问题 当我们在前端开发的过程中 xff0c 可能会被要求适配主流分辨率 当我们把电脑分辨率调成150 的时候 xff0c 一些下拉框会发生错位现象 xff0c echarts图标
  • 互联网公司面试五大禁忌

    互联网这几年成为求职者追求的热门行业 xff0c 薪水也是水涨船高 xff0c 想要进入这个行业的人也是越来越多了 xff0c 本文给大家讲述一下互联网公司面试的五大禁忌 一 互联网公司HR最不想听到的离职原因 1 无意中泄漏公司机密而被辞
  • 真实面试经历:十面阿里,七面头条,六个Offer

    这是一篇很好的面试经验 xff0c 转载过来 xff0c 希望各位小伙伴可以借鉴 01 面试者背景简介 双非末流一本 xff0c 大三 xff0c CS xff08 计算机科学 xff09 专业 xff0c 有百度实习经历 02 面试情况
  • 程序员之歌:我是一个程序员

    工作一天 xff0c 来一起唱首歌缓解疲劳吧猿媛们
  • 如何准备校招技术面试+一只小菜鸟的面试之路

    校 招一路走来很幸运 xff0c 从最初的迷茫 xff0c 到偶尔的被否认 xff0c 然后慢慢调整心态 xff0c 有缺憾才能有进步 xff0c 正视的自己不足 xff0c 静下心努力提高 xff0c 勇敢尝试各种面试机会 xff0c 因
  • 获取对象属性值的两种方式

    获取对象属性值的方式有两种 xff1a 点 括号 span class token keyword let span obj span class token operator 61 span span class token punctu
  • 5 分钟,教你用 Docker 部署一个 Python 应用!

    在使用传统物理机或云服务器上部署项目都会存在一些痛点 比如 xff1a 项目部署速度慢 资源浪费 迁移难且扩展低 而使用 Docker 部署项目的优势包含 xff1a 高效利用系统资源 服务启动更快 环境一致 xff0c 迁移更加方便 本篇
  • nginx SSL证书

    SSL证书 什么是SSL证书 SSL xff08 Secure Sockets Layer xff09 证书是数字证书的一种 xff0c 类似于驾驶证 护照和营业执照的电子副本 因为配置在服务器上 xff0c 也称为SSL服务器证书 SSL
  • NX搭载Wecat载版SD卡

    写这篇文章原因是 xff1a 1是看官网的文档太长了 xff0c 二是确实想偷懒直接csdn登陆然后复制粘贴就好了 xff0c 三是文档确实很多坑 xff0c 四是实验室刷机电脑跑着个人实在是苔藓了 xff0c 别人盯着有不太好意思玩电脑
  • ROS学习第五天 ROS常用的组件库(一)——TF

    题外话 xff1a 首先给大家道个歉 xff0c 因为之前迷上了无人驾驶apollo仿真 xff0c 花了一段时间研究 后来发现没有资源 xff0c 没有设备 xff0c 是真的难学 xff0c 所以放弃了apollo 最近又到了开题答辩时
  • mysql数据库基础知识,mysql数据库简介(一看就懂,一学就会)

    目录 一 MySQL学习路线二 MySQL常见操作1 查看所有数据库show databases 2 MySQL 创建数据库3 删除数据库4 选择数据库use databasename5 查看该数据库下所有表show tables6 创建数
  • 账号和权限管理

    用户 xff1a 超级用户 xff1a uid gid为0 xff0c 超级用户是系统管理员 xff0c 具备系统最高权限 程序用户 xff1a 每个程序在创建时会自动创建一个程序用户 xff0c uid gid为1到999 xff0c 一
  • 科班程序员逆袭为渗透测试工程师的坎坷路(第一篇)

    渗透测试工程师 1 什么是渗透测试 渗透测试 xff08 penetration test xff09 事实上并没有一个标准的定义 xff0c 在国外的大部分安全组织达成的统一说法是 xff1a 渗透测试是通过模拟恶意黑客的攻击方法 xff
  • 《对抗攻击与防御分类方法综述》阅读笔记20220401

    对抗攻击与防御分类方法综述 A Review of Adversarial Attack and Defense for Classification Methods DOI 10 1080 00031305 2021 2006781 文章
  • Docker Desktop功能讲解

    2013 年发布至今 xff0c Docker 一直广受瞩目 xff0c 被认为可能会改变软件行业 概述 许多人并不清楚 Docker 到底是什么 xff0c 要解决什么问题 xff0c 好处又在哪里 xff1f 本文就来详细解释 xff0
  • rman备份报RMAN-00571、RMAN-00569、RMAN-03009

    rman备份时报错信息 xff1a RMAN 03009 failure of backup command on ORA DISK 1 channel at 07 03 2012 10 35 17 ORA 19809 limit exce
  • Scrapy-自动爬虫

    在前面几篇博文当中 xff0c 我们使用Scrapy框架编写的爬虫项目 xff0c 只能爬取起始网址中设置的网页 有时候 xff0c 我们需要让爬虫持续不断的自动爬取多个网页 xff0c 此时 xff0c 我们需要编写自动爬取网页的爬虫 在