python爬虫学习------scrapy第三部分(第三十一天)

news2024/11/25 0:56:33

🎈🎈作者主页: 喔的嘛呀🎈🎈
🎈🎈所属专栏:python爬虫学习🎈🎈
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 

兄弟姐妹,大家好哇!我是喔的嘛呀。今天我们来学习 scrapy的第三部分。

目录

一、命令行工具与扩展(Command Line Tools & Extensions)

二. 爬虫优化与反反爬虫策略

爬虫优化

三、数据存储与数据输出

数据存储

数据输出

四、 调试与日志(Debugging & Logging)

调试Scrapy爬虫

日志记录


一、命令行工具与扩展(Command Line Tools & Extensions)

命令行工具与扩展(Command Line Tools & Extensions)在Scrapy爬虫框架中起着至关重要的作用。下面将详细解释如何使用Scrapy的命令行工具来创建项目、生成爬虫和启动爬虫,以及深入了解Scrapy的扩展机制,包括如何使用现有的扩展和编写自定义扩展来增强爬虫功能。

命令行工具

Scrapy提供了一套强大的命令行工具,这些工具使得创建、管理和运行爬虫项目变得简单而高效。

  1. 创建项目

使用scrapy startproject命令可以创建一个新的Scrapy项目。例如:

bash复制代码
scrapy startproject myproject

这将在当前目录下创建一个名为myproject的新目录,其中包含Scrapy项目的默认结构,如spiders文件夹用于存放爬虫文件,以及项目的配置文件settings.py等。

  1. 生成爬虫

在创建了项目之后,可以使用scrapy genspider命令来生成新的爬虫。例如:

bash复制代码
scrapy genspider myspider example.com

这将在spiders文件夹下生成一个名为myspider.py的爬虫文件,其中包含了基本的爬虫结构和示例代码。你可以在这个文件中定义爬取规则、提取数据等。

  1. 启动爬虫

完成爬虫的编写后,使用scrapy crawl命令来启动爬虫并开始抓取数据。例如:

bash复制代码
scrapy crawl myspider

这将启动名为myspider的爬虫,并根据你在爬虫文件中定义的规则开始抓取数据。Scrapy还提供了其他命令,如scrapy list来列出项目中所有的爬虫,scrapy shell来进入交互式调试环境等。

扩展与插件

Scrapy的扩展机制是其灵活性和可扩展性的重要体现。通过扩展和插件,你可以轻松地增强爬虫的功能,满足特定的需求。

  1. 了解Scrapy的扩展机制

Scrapy的扩展机制主要依赖于中间件(Middleware)和信号(Signals)。中间件允许你在Scrapy引擎和组件之间插入自定义代码,以修改请求、响应或处理异常。信号则是一种事件驱动机制,你可以在Scrapy的特定阶段触发事件并处理相应的逻辑。

5. 使用现有的扩展

Scrapy社区提供了许多现成的扩展,这些扩展可以直接集成到你的爬虫项目中。例如,有些扩展可以帮助你处理反爬虫机制,如自动设置请求头、处理Cookie等;有些扩展可以优化爬虫的性能,如控制并发请求数、设置代理等。你可以通过查阅Scrapy的官方文档或社区资源,找到适合你的扩展并按照说明进行安装和配置。

  1. 编写自定义的扩展

如果现有的扩展无法满足你的需求,你可以编写自定义的扩展来扩展Scrapy的功能。编写自定义扩展需要一定的编程技能和对Scrapy框架的深入理解。你可以通过继承Scrapy提供的基类,并实现相应的方法来处理特定的逻辑。例如,你可以编写一个自定义的中间件来处理特定的请求头或响应数据,或者编写一个自定义的Item Pipeline来处理爬取到的数据。

编写自定义扩展时,需要注意以下几点:

  • 确定你的扩展属于哪种类型(如中间件、信号处理器等)。
  • 继承相应的基类并实现必要的方法。
  • 在项目的设置文件中启用你的扩展。
  • 测试你的扩展以确保其正常工作并与Scrapy的其他组件兼容。

通过学习和使用Scrapy的命令行工具和扩展机制,你将能够更加高效地创建、管理和扩展你的爬虫项目,实现更复杂的抓取任务和数据处理需求。

二. 爬虫优化与反反爬虫策略

爬虫优化

  1. 减少请求次数

    可以通过合并请求、使用缓存、避免重复请求等方式来减少请求次数。例如,在Scrapy中,可以通过使用LinkExtractorsRule来定义爬虫跟随的链接规则,避免不必要的请求。

    from scrapy.linkextractors import LinkExtractor  
    from scrapy.spiders import CrawlSpider, Rule  
    
    class MySpider(CrawlSpider):  
        name = 'myspider'  
        allowed_domains = ['example.com']  
        start_urls = ['<http://example.com>']  
    
        rules = (  
            Rule(LinkExtractor(allow=r'/category/'), callback='parse_item', follow=True),  
        )  
    
        def parse_item(self, response):  
            # 解析页面数据  
            pass
    
  2. 降低网络延迟

    使用连接池和异步IO可以显著降低网络延迟。Scrapy默认使用异步IO和连接池,但你也可以通过调整设置来进一步优化。

    # settings.py  
    CONCURRENT_REQUESTS = 100  # 同时发出的请求数  
    DOWNLOAD_DELAY = 1  # 请求之间的延迟,单位为秒  
    REACTOR_THREADPOOL_MAXSIZE = 20  # 线程池大小
    
  3. 提高解析速度

    使用lxml代替正则表达式可以大大提高解析速度。

    from scrapy.selector import Selector  
    
    def parse(self, response):  
        # 使用XPath或CSS选择器解析数据  
        titles = response.xpath('//h1/text()').getall()  
        # ...
    

反反爬虫策略

  1. 设置User-Agent

    在Scrapy中,可以通过设置DEFAULT_REQUEST_HEADERS来定义默认的User-Agent。

    # settings.py  
    DEFAULT_REQUEST_HEADERS = {  
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'  
    }
    
  2. 使用代理

    可以使用中间件来设置代理。以下是一个简单的代理中间件示例:

    class ProxyMiddleware(object):  
        def process_request(self, request, spider):  
            request.meta['proxy'] = "http://your_proxy_address:port"
    

    然后在settings中启用该中间件:

    # settings.py  
    DOWNLOADER_MIDDLEWARES = {  
        'myproject.middlewares.ProxyMiddleware': 100,  
    }
    
  3. 处理验证码

    对于验证码,可以通过Selenium模拟用户行为来绕过。但请注意,Selenium的使用可能会降低爬虫的效率。

    from selenium import webdriver  
    from selenium.webdriver.common.keys import Keys  
    
    # 初始化WebDriver  
    driver = webdriver.Chrome()  
    driver.get('<http://example.com>')  
    
    # 模拟用户操作,如点击、输入等  
    captcha_input = driver.find_element_by_id('captcha-input')  
    captcha_input.send_keys('captcha_text')  
    captcha_input.send_keys(Keys.RETURN)  
    
    # 获取页面内容并关闭WebDriver  
    content = driver.page_source  
    driver.quit()
    
  4. 遵守robots.txt

    Scrapy默认遵守robots.txt,但你也可以通过设置ROBOTSTXT_OBEY来关闭这一行为。

    # settings.py  
    ROBOTSTXT_OBEY = True  # 遵守robots.txt,设置为False则不遵守
    
  5. 模拟用户行为

    在Scrapy中,可以通过设置请求间的下载延迟来模拟用户行为。

    # settings.py  
    DOWNLOAD_DELAY = 3  # 每两个请求之间的下载延迟,单位为秒
    

这些策略并不是孤立的,通常需要根据目标网站的反爬虫机制来组合使用。同时,要注意合法合规地爬取数据,遵守目标网站的robots.txt协议,并尊重网站的版权和使用条款

三、数据存储与数据输出

数据存储

1. 数据库存储 - 使用SQLite

SQLite是一个轻量级的文件型数据库,不需要单独安装,可以直接在Python中使用。

import sqlite3  
  
# 连接到SQLite数据库(如果不存在则创建)  
conn = sqlite3.connect('my_database.db')  
c = conn.cursor()  
  
# 创建一个表  
c.execute('''CREATE TABLE IF NOT EXISTS my_table  
             (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)''')  
  
# 假设我们有一些爬取的数据  
data = [('Alice', 25), ('Bob', 30)]  
  
# 插入数据  
c.executemany('''INSERT INTO my_table (name, age) VALUES (?, ?)''', data)  
  
# 提交事务  
conn.commit()  
  
# 关闭连接  
conn.close()

2. 文件存储 - 使用JSON

JSON是一种常用的数据交换格式,可以很容易地将数据写入文件并再次读取。

import json  
  
# 假设我们有一些爬取的数据  
data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]  
  
# 将数据写入JSON文件  
with open('output.json', 'w', encoding='utf-8') as f:  
    json.dump(data, f, ensure_ascii=False, indent=4)  
  
# 从JSON文件中读取数据  
with open('output.json', 'r', encoding='utf-8') as f:  
    loaded_data = json.load(f)  
print(loaded_data)

数据输出

1. JSON格式输出

import json  
  
# 假设我们有一些爬取的数据  
data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]  
  
# 将数据转换为JSON格式的字符串  
json_data = json.dumps(data, ensure_ascii=False, indent=4)  
  
# 打印JSON数据  
print(json_data)  
  
# 将JSON数据写入文件  
with open('output.json', 'w', encoding='utf-8') as f:  
    f.write(json_data)

2. CSV格式输出

import csv  
  
# 假设我们有一些爬取的数据  
data = [['Alice', 25], ['Bob', 30]]  
  
# 定义CSV文件的列名  
fieldnames = ['name', 'age']  
  
# 将数据写入CSV文件  
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:  
    writer = csv.writer(csvfile)  
  
    # 写入列名  
    writer.writerow(fieldnames)  
  
    # 写入数据行  
    for row in data:  
        writer.writerow(row)

注意

  • 在实际应用中,你可能需要处理更复杂的数据结构和异常情况。
  • 对于大型数据集,直接写入文件或数据库可能会导致内存问题。在这种情况下,你可能需要使用流式处理或分批写入的方法。
  • 安全性也是一个需要考虑的因素。当存储敏感信息时,确保对数据进行适当的加密和匿名化处理。
  • 根据你的具体需求,你可能还需要考虑数据的索引、查询性能、并发控制等因素,特别是在使用数据库时。

四、 调试与日志(Debugging & Logging)

调试Scrapy爬虫

Scrapy 提供了一套强大的工具来帮助你调试爬虫。以下是一些常用的调试方法:

  1. 使用Scrapy ShellScrapy Shell 是一个交互式终端,允许你快速测试XPath或CSS选择器,以及查看页面的响应内容。
scrapy shell '<http://example.com>'

在Shell中,你可以使用 response 对象来访问页面的内容,并使用 fetch 方法获取新的页面。

  1. 查看异常和错误

    当爬虫遇到错误时,Scrapy 会记录异常信息。你可以在终端中查看这些错误信息,并根据它们进行调试。

  2. 设置断点

    在你的爬虫代码中,你可以使用Python的 pdb 模块或IDE(如PyCharm)来设置断点,然后逐步执行代码以查看问题所在。

  3. 打印调试信息

    在代码中添加 print 语句可以帮助你查看变量的值或代码的执行流程。

def parse(self, response):  
    print(response.text)  # 打印响应内容  
    # ... 其他代码 ...

5、使用Scrapy的日志系统Scrapy的日志系统可以帮助你记录不同级别的信息,从DEBUG到ERROR。你可以通过配置日志级别来查看更详细的信息。

日志记录

Scrapy 使用Python的内置 logging 模块进行日志记录。你可以通过修改Scrapy的设置来配置日志系统。

  1. 修改Scrapy的日志级别在Scrapy的设置文件中(通常是 settings.py),你可以设置 LOG_LEVEL 来改变日志的级别。
LOG_LEVEL = 'DEBUG'  # 可以是 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'

2、自定义日志处理器你还可以添加自定义的日志处理器来记录日志到文件或其他地方。

from scrapy import logformatter  
from scrapy.utils.log import configure_logging  
from logging.handlers import RotatingFileHandler  
  
# 配置日志记录到文件  
LOG_FILE = 'scrapy.log'  
logging.basicConfig(  
    level=logging.DEBUG,  
    format='%(asctime)s [%(levelname)s] %(message)s',  
    handlers=[  
        RotatingFileHandler(LOG_FILE, maxBytes=1024*1024, backupCount=5),  
        logging.StreamHandler(),  
    ]  
)  
  
configure_logging(install_root_handler=False)

3、在代码中记录日志在你的爬虫或中间件代码中,你可以使用 self.logger 来记录日志。

class MySpider(scrapy.Spider):  
    name = 'myspider'  
  
    def parse(self, response):  
        self.logger.info('Parsing page %s', response.url)  
        # ... 其他代码 ...

4、使用日志格式化器Scrapy 允许你自定义日志消息的格式。你可以修改 LOG_FORMAT 和 LOG_DATEFORMAT 设置来改变格式。

LOG_FORMAT = '%(asctime)s [%(levelname)s] %(message)s'  
LOG_DATEFORMAT = '%Y-%m-%d %H:%M:%S'

通过结合使用这些调试和日志记录方法,你可以更有效地跟踪和解决Scrapy爬虫中的问题。记得在调试完成后,将日志级别设置回一个更合适的级别(如INFO),以避免记录过多的不必要信息。

好了,今天的学习就到这里啦。我们明天再见啦

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

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

相关文章

数字社交风潮:解析Facebook的影响力

随着互联网的普及和科技的发展&#xff0c;数字社交媒体已经成为现代社会不可或缺的一部分。在众多的社交媒体平台中&#xff0c;Facebook作为其中的佼佼者&#xff0c;影响着数以亿计的用户。本文将深入解析Facebook的影响力&#xff0c;探讨其在数字社交风潮中的地位和作用。…

Spring Security基础教程:从入门到实战

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

2024.1.1 IntelliJ IDEA 使用记录

2024.1.1 IntelliJ IDEA 使用记录 下载设置文件编码maven 配置 插件可以中文语言包安装lombok 插件Smart Tomcat ( 根据需要安装)Smart Tomcat 配置 项目导入java 设置maven 配置 项目运行SpringBoot 项目运行tomcat 运行 (根据需要)相关依赖添加运行配置 下载 IntelliJ IDEA …

5000A信号发生器使用方法

背景 gnss工作需要使用的5000A&#xff0c;所以做成文档&#xff0c;用于其他员工学习。 下载星历数据 https://cddis.nasa.gov/archive/gnss/data/daily/2024/brdc/ 修改daily中的年份&#xff0c;就可以获取相关截至时间的星历数据 brcd数据格式 第一行记录了卫星的PRN号&a…

软考中级-软件设计师(十)网络与信息安全基础知识

一、网络概述 1.1计算机网络的概念 计算机网络的发展&#xff1a;具有通信功能的单机系统->具有通信功能的多机系统->以共享资源为目的的计算机网络->以局域网及因特网为支撑环境的分布式计算机系统 计算机网络的功能&#xff1a;数据通信、资源共享、负载均衡、高…

根据最近拒包项目总结,详细讲解Google最新政策(上)

关于占比最多的移动垃圾软件拒审问题 移动垃圾软件(Mobile Unwanted Software)特征表现1> 具有欺骗性,承诺其无法实现的价值主张。2> 诱骗用户进行安装,或搭载在用户安装的其他程序上。3> 不向用户告知其所有主要功能和重要功能。4> 以非预期方式影响用户的系统…

Linux磁盘IO、网络IO、零拷贝详解

一、什么是I/O&#xff1f; 在计算机操作系统中&#xff0c;所谓的I/O就是输入&#xff08;input&#xff09;和输出&#xff08;output&#xff09;,也可以理解为读&#xff08;read&#xff09;和写&#xff08;write&#xff09;,针对不同的对象&#xff0c;I/O模式可以划分…

探索5个独特AI工具:它们是否值得独立存在?

在这个“地下AI”系列的最新一集中&#xff0c;我们深入挖掘了一些鲜为人知的AI工具。这些工具并非出自OpenAI、微软或谷歌等科技巨头之手&#xff0c;而是独立创造者和小型团队的智慧结晶。我们的目标是发现利用最新AI技术的独特工具。但这次有个新玩法&#xff1a;我们玩一个…

新能源汽车动力电池热管理-液冷方案应用原理与应用前景简介

前言 动力电池是新能源汽车的核心部件之一&#xff0c;其性能和寿命直接影响着车辆的续航里程和使用成本。液冷方案作为一种常见的动力电池温控解决方案&#xff0c;被广泛应用于新能源汽车领域。本文将详细介绍液冷方案的原理、发展方向以及市场前景。 一、液冷方案的原理 …

记录一个练手的js逆向password

很明显 请求加密了password 全局搜索 有个加密函数(搜不到的可以搜临近的其他的关键字 或者url参数) 搜索的时候一定要仔细分析 我就没有仔细分析 我搞了好久 又是xhr又是hook的(还没hook到) 我当时也是疏忽了 我寻思这个也不是js文件 直到后来 我怎么也找不到 我就猜想 不…

01.本地工作目录、暂存区、本地仓库三者的工作关系

1.持续集成 1.持续集成CI 让产品可以快速迭代&#xff0c;同时还能保持高质量。 简化工作 2.持续交付 交付 3.持续部署 部署 4.持续集成实现的思路 gitjenkins 5.版本控制系统 1.版本控制系统概述2.Git基本概述3.Git基本命令 2.本地工作目录、暂存区、本地仓库三者的工作关系…

python abs函数怎么用

abs()函数是Python的数字函数&#xff0c;用以返回数字的绝对值。 语法 以下是 abs() 方法的语法&#xff1a; abs( x ) 参数 x -- 数值表达式&#xff0c;可以是整数&#xff0c;浮点数&#xff0c;复数。 返回值 函数返回 x&#xff08;数字&#xff09;的绝对值&#x…

Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

目录 1、next()、nextInt()、nextLine()的使用方法及区分 2、循环时如何使用hasNext方法 3、用hasNextInt()作为判断下一个输入是否为数字需要配合next()方法使用 1、next()、nextInt()、nextLine()的使用方法及区分 三者简单定义 next()&#xff1a;此方法遇见第一个有效字符…

通过 Java 操作 redis -- 基本通用命令

目录 使用 String 类型的 get 和 set 方法 使用通用命令 exists &#xff0c;del 使用通用命令 keys 使用通用命令 expire,ttl 使用通用命令 type 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 关…

裸辞、裁员、老板跑路、被迫失业,未来是「超级个体」的时代

本期我们邀请的程序员是张立强&#xff0c;裸辞、裁员、老板跑路、被迫失业&#xff0c;管理层利益争夺&#xff0c;职业转型&#xff0c;工作五年&#xff0c;攒出了十年经验。程序员如何寻找自己的第二曲线&#xff0c;不妨听听立强的看法。 裸辞失业 大家好&#xff0c;我…

redis 使用记录

redis 使用记录 下载运行配置文件启动 参考 下载 github: Redis for Windows 或者从百度网盘下载 Redis version 3.2.100 链接: https://pan.baidu.com/s/1kxNOuZFunvVhVy1cfQzCDA?pwdpibh 运行 双击运行 运行效果 如果出错&#xff1a;查看是否项目路径是否包含中文 配…

计算机视觉——OpenCV Otsu阈值法原理及实现

算法简介 Otsu阈值法&#xff0c;也被称为大津算法&#xff0c;是一种在图像处理中广泛使用的自动阈值分割技术。这种方法由日本学者大津展之于1979年提出&#xff0c;旨在根据图像的灰度直方图来自动选择最佳全局阈值。Otsu阈值法的核心思想是最小化类内方差或最大化类间方差…

京东淘宝1688商品采集商品数据抓取API

item_get-获得淘宝商品详情 item_search 关键字搜索商品 公共参数 请求地址: taobao/item_search 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&a…

Azure AKS日志查询KQL表达式

背景需求 Azure&#xff08;Global&#xff09; AKS集群中&#xff0c;需要查询部署服务的历史日志&#xff0c;例如&#xff1a;我部署了服务A&#xff0c;但服务A的上一个版本Pod已经被杀掉由于版本的更新迭代&#xff0c;而我在命令行中只能看到当前版本的pod日志&#xff…

c++匿名比较函数参数顺序逻辑

在使用lower_bound和upper_bound时&#xff0c;想自定义比较函数&#xff0c;在这个过程中出现了参数定义顺序导致的错误问题&#xff0c;于是查找学习了下自定义比较函数需要符合的规则。 目录 1 lower_bound和upper_bound函数 1.1 lower_bound 1.2 upper_bound 2 问题产…