爬虫框架:scrapy使用心得

news2025/6/3 20:36:07

文章目录

  • 前言
  • 一、scrapy是什么?
  • 二、使用步骤
    • 1.安装和创建
    • 2.请求以及参数
    • 3.代理池
    • 4.请求错误处理
    • 5.采集数据入库
    • 6.日志及其他配置
  • 总结


前言

有些时候我们需要采集大量数据时,我们需要程序的运行效率高,当然如果有时候不想写请求代码的时候,这些情况我都会向你推荐scrapy。当然如果你之前学过django,那么你上手会更快,因为设计的架构是差不多的。

一、scrapy是什么?

Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。(更详细的理论介绍可以移步其他文章,会很详细,本文着重于实战)

二、使用步骤

1.安装和创建

1: 安装环境

pip install scrapy

2: 创建爬虫工程文件

scrapy startproject mySpider

3: 生成爬虫脚本

scrapy genspider baidu https://www.baidu.com/ # scrapy genspider 文件名 网址

2.请求以及参数

  1. GET请求
start_url = 'https://www.baidu.com/’
info = {'arg': 'arg'}

yield scrapy.Request(
            url=start_url,
            meta=info , # 传参数
            callback=self.parse_first,# 方法
            dont_filter=False # scrapy它会默认过滤相同请求
        )

def parse_first(self, response):
	arg = response.meta['arg']
  1. POST请求(有很多,这里运用笔者用的次数最多的)
import json
from scrapy.http.request.json_request import JsonRequest
# 这里form_data 最好使用单引号
form_data = {'arg': 'arg'}
yield JsonRequest(
            url=url,
            body=json.dumps(form_data), # 对应requests库 requests.post里的参数 json=data
            method='POST',
            meta=info,
            callback=self.get_pro_price,
            dont_filter=True,
        )

3.代理池

  1. ua代理池,在middlewares.py文件添加类
user_agent_list = ["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
        "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
        "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",…………]
class RotateUserAgentMiddleware(UserAgentMiddleware):
    # 创建ua
    def process_request(self, request, spider):
        user_agent = random.choice(user_agent_list)
        if user_agent:
            request.headers.setdefault('User-Agent', user_agent)
            # print(f"User-Agent:{user_agent} is using.")
        return None

    def process_exception(self, request, exception, spider):
        error_info = f"spider:{spider.name} RotateUserAgentMiddleware has error with {exception}"
        # print(error_info)
        logging.error(error_info)
  1. ip代理池,在middlewares.py文件添加类
class ProxyDownloaderMiddleware:

    def process_request(self, request, spider):
        """
        添加代理
        """
  1. 配置,在setting.py文件:
DOWNLOADER_MIDDLEWARES = {
    "mySpider.middlewares.ProxyDownloaderMiddleware": 543,
    "mySpider.middlewares.RotateUserAgentMiddleware": 544,
} # 数值越低优先级越高

4.请求错误处理

  1. setting文件配置
DUPEFILTER_DEBUG = True
# RETRY_HTTP_CODES = [429, 403, 504, 522,502,400] # 请求状态
# RETRY_TIMES = 5

# 请求失败重新请求50次
RETRY_ENABLED = True
RETRY_TIMES = 50

DOWNLOAD_TIMEOUT = 15  # 设置最大超时时间为15秒
  1. 个性化定制请求错误的逻辑,在middlewares.py文件添加类
from scrapy.downloadermiddlewares.retry import RetryMiddleware
class CustomRetryMiddleware(RetryMiddleware):

    def process_response(self, request, response, spider):
        if response.status != 200:
        # 处理请求状态码不是200
            logger.error(request.url)
            logger.error(response.status)
            logger.error(request.meta)
        return response

    def process_exception(self, request, exception, spider):
        if self._is_max_retry(request):
        # 打印日志
            self._log_failed_request(request)

配置,在setting.py文件:

DOWNLOADER_MIDDLEWARES = {
    "mySpider.middlewares.CustomRetryMiddleware": 544,
}

5.采集数据入库

  1. 定义item
class SanItem(scrapy.Item):

    col1= scrapy.Field()  
    col2= scrapy.Field()
    col3= scrapy.Field()
	
	pass
  1. 数据写入mysql
class MySQLSanPipeline(object):
    def __init__(self):
        self.connection = pymysql.connect(host='localhost',
                                          user='root',
                                          password='1234',
                                          database='test',
                                          charset='utf8mb4',
                                          cursorclass=pymysql.cursors.DictCursor)
        self.cursor = self.connection.cursor()
        self.data = []

    def open_spider(self, spider):
        pass

    def process_item(self, item, spider):
        self.data.append(
            (item['col1'], item['col2'], item['col3'], 
             )
        )
        if len(self.data) >= 100: # 数据量大于100 批量写入数据库
            self._write_to_db()
        return item

    def _write_to_db(self):
        # execute->改为了 executemany  支持多条数据批量传入数据库
        sql = """
              insert into sangon(col1,col2,col3
              ) values (%s,%s,%s)
              """
        self.cursor.executemany(
            sql, self.data
        )
        self.connection.commit()  # 把数据缓冲区的数据提交到数据库
        self.data.clear()  # 每次添加后清空data 避免重复添加数据

    def close_spider(self, spider):
        if len(self.data) >= 0:  # 如果还有残留的数据,但是因为不满100条没有传到数据库也要做好处理
            self._write_to_db()
        self.connection.close()
#=================记得在setting文件配置==================
ITEM_PIPELINES = {
    "mySpider.pipelines.MySQLSanPipeline": 300
}
  1. 更新MongoDB数据
class MongoPipeline(object):

    def __init__(self, host, port, user, pwd, db, table):
        self.host = host
        self.port = port
        self.user = user
        self.pwd = pwd
        self.db = db
        self.table = table

    @classmethod
    def from_crawler(cls, crawler):
        HOST = crawler.settings.get('HOST')
        PORT = crawler.settings.get('PORT')
        USER = crawler.settings.get('USER')
        PWD = crawler.settings.get('PWD')
        DB = crawler.settings.get('DB')
        TABLE = crawler.settings.get('TABLE')
        return cls(HOST, PORT, USER, PWD, DB, TABLE)

    def open_spider(self, spider):
        self.conn = MongoClient("mongodb://{}:{}@{}:{}/{}".format(self.user, self.pwd, self.host, self.port, self.db))
        self.db_conn = self.conn[self.db]
        self.set_conn = self.db_conn[self.table]

    def close_spider(self, spider):
        self.conn.close()

    def process_item(self, item, spider):
        self.set_conn.update_one(
                        {'_id': item['_id'], },  # 查询条件:匹配具有特定_id的文档
                        {'$set': {
                            'col1': item['col1'],
                        }}  # 更新操作
                    )
        # 如果是列表字段内更新
        # {'id':id,'list':[{'code':'1','size':'s1'}]}
        self.set_conn.update_one(
                        {'_id': _id,'list.code':1},  # 查询条件:匹配具有特定_id的文档
                        {'$set': {'list.$.size': 's2'}}  # 更新操作
                    )
        return item
  #=================记得在setting文件配置==================
ITEM_PIPELINES = {
    "mySpider.pipelines.MongoPipeline": 300
}

6.日志及其他配置

  1. 日志配置
import logging
import datetime
class MySpider(scrapy.Spider):
	custom_settings = {
	        'LOG_FILE': 'E:/Lu_zong_data/logs/log_{}_{}_{}_{}.txt'.format(
	            datetime.datetime.today().year,
	            datetime.datetime.today().month,
	            datetime.datetime.today().day,
	            datetime.datetime.today().hour),
	    }
#  写入日志文件信息 logging.info('测试')
  1. 终端运行太麻烦了,可以设置run.py
from scrapy import cmdline

cmdline.execute('scrapy crawl baidu'.split())

总结

scrapy真是一个功能强大的爬虫框架,也建议结合crawlab爬虫管理平台,体感和操作效果会更好!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RV1126-OPENCV 交叉编译

一.下载opencv-3.4.16.zip到自己想装的目录下 二.解压并且打开 opencv 目录 先用 unzip opencv-3.4.16.zip 来解压 opencv 的压缩包,并且进入 opencv 目录(cd opencv-3.4.16) 三. 修改 opencv 的 cmake 脚本的内容 先 cd platforms/linux 然后修改 arm-gnueabi.to…

【深度学习】 19. 生成模型:Diffusion Models

Diffusion Models Diffusion Models 简介 Diffusion 模型是一类通过逐步添加噪声并再逆向还原的方式进行图像生成的深度生成模型。其基本流程包括: 前向过程(Forward Process):将真实图像逐步加噪,最终变为高斯噪声…

JMeter 直连数据库

1.直连数据库的使用场景 1.1 参数化,例如登录使用的账户名密码都可以从数据库中取得 1.2 断言,查看实际结果和数据库中的预期结果是否一致 1.3 清理垃圾数据,例如插入一个用户,它的ID不能相同,在测试插入功能后将数据删…

易路 iBuilder:解构企业 AI 落地困境,重构智能体时代生产力范式

一、从大模型到智能体的产业跃迁 2024 年堪称中国人工智能产业的 "战略拐点" 之年。当 DeepSeek R1 模型以 "技术 价格" 双重普惠模式掀起行业震荡时,各企业纷纷意识到,大模型的真正价值不在于技术炫技,而在于成为企业…

计算机网络之路由表更新

1.解题思路 对新接收到的路由表进行更新,全部"距离"1,且"下一跳路由器"都写成发送方路由器的名称。 开始对比新表和原来的路由表 1.看目的网络 如果是新的目的网络,则直接把对应的各项信息填入表中;如果是相同…

万兴PDF手机版

万兴PDF手机版(万兴PDF编辑器)是一款国产PDF编辑工具.万兴PDF安卓版提供PDF文档编辑,AI撰写摘要,文档签名,设置密码保护等功能,万兴PDF专家APP以简约风格及文档编辑功能为核心,支持多设备终端同步保存.全免 万兴 PDF 编辑器是一款功能强大的 PDF 编辑软件,它支持多种…

Qt -使用OpenCV得到SDF

博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 cv::MatdistanceTransform获得SDF 本文的目标, 是简单学习并使用OpenCV的相关函数, 并获得QImage的SDF(Signed Distance Field 有向距离场) 至…

DDR5 ECC详细原理介绍与基于协议讲解

本文篇幅较长,涉及背景原理介绍方便大家理解其运作方式 以及 基于DDR5协议具体展开介绍。 背景原理介绍 上图参考:DDR 内存中的 ECC 写入操作时,On-die ECC的工作过程如下: SoC将需要写入到Memory中的数据发送给控制器控制器将需要写入的数据直接发送给DRAM芯片在DDR5 DR…

EC800X QuecDuino开发板介绍

支持的模组列表 EG800KEC800MEC800GEC800E 功能列表 基本概述 EC800X QuecDuino EVB 搭载移远 EC800 系列模组。支持模组型号为: EC800M 系列、EC800K 系列、EG800K 系列、EC800E 系列等。 渲染图 开发板的主要组件、接口布局见下图 资料下载 EC800X-QuecDui…

PHP轻量级聊天室源码(源码下载)

最新版本:v2.1.2 (2024.08更新) 运行环境:PHP5.6(无需MySQL) 核心特性:手机电脑自适应、TXT数据存储、50条历史消息 适用场景:小型社区/企业内网/教育培训即时通讯 一、核心功能亮点(SEO关键词布…

leetcode hot100刷题日记——33.二叉树的层序遍历

解题总结二维vector的初始化方法 题目描述情况1:不确定行数和列数情况2:已知行数和列数情况3:已知行数但不知道列数情况4:已知列数但不知道行数 题目描述 解答:用队列 思路都差不多,我觉得对于我自己来说&a…

《数据结构初阶》【番外篇:快速排序的前世今生】

【番外篇:快速排序的前世今生】目录 前言:---------------起源---------------一、诞生:二、突破:三、核心: ---------------发展---------------1. 早期版本:简单但不稳定1960 年:初始版本 2. …

【笔记】基于 MSYS2(MINGW64)的 Poetry 虚拟环境创建指南

#工作记录 基于 MSYS2(MINGW64)的 Poetry 虚拟环境创建指南 一、背景说明 在基于 MSYS2(MINGW64)的环境中,使用 Poetry 创建虚拟环境是一种高效且灵活的方式来管理 Python 项目依赖。本指南将详细介绍如何在 PyChar…

PINNs案例——二维磁场计算

基于物理信息的神经网络是一种解决偏微分方程计算问题的全新方法… 有关PINN基础详见:PINNs案例——中心热源温度场预测问题的torch代码 今日分享代码案例:二维带电流源磁场计算 该案例参考学习论文:[1]张宇娇,孙宏达&#xff0…

算法打开13天

41.前 K 个高频元素 (力扣347题) 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …

广告拦截器:全方位拦截,畅享无广告体验

在数字时代,广告无处不在。无论是浏览网页、使用社交媒体,还是观看视频,广告的频繁弹出常常打断我们的体验,让人不胜其烦。更令人担忧的是,一些广告可能包含恶意软件,威胁我们的设备安全和个人隐私。AdGuar…

主数据编码体系全景解析:从基础到高级的编码策略全指南

在数字化转型的浪潮中,主数据管理(MDM)已成为企业数字化转型的基石。而主数据编码作为MDM的核心环节,其设计质量直接关系到数据管理的效率、系统的可扩展性以及业务决策的准确性。本文将系统性地探讨主数据编码的七大核心策略&…

Selenium操作指南(全)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 大家好,今天带大家一起系统的学习下模拟浏览器运行库Selenium,它是一个用于Web自动化测试及爬虫应用的重要工具。 Selenium测试直接运行在…

智绅科技——科技赋能健康养老,构建智慧晚年新生态

当老龄化浪潮与数字技术深度碰撞,智绅科技以 “科技赋能健康,智慧守护晚年” 为核心理念,锚定数字健康与养老服务赛道,通过人工智能、物联网、大数据等技术集成,为亚健康群体与中老年人群构建 “监测 - 预防 - 辅助 - …

STM32通过KEIL pack包轻松移植LVGL,并学会使用GUI guider

先展示最终实现的功能效果如下: 1.目的与意义 之前在学习STM32移植LVGL图形库的时候,搜到的很多教程都是在官网下载LVGL的文件包,然后一个个文件包含进去,还要添加路径,还要给文件改名字,最后才能修改程序…