AI大模型教程
一起来学习

Scrapy 爬虫优化与实战(二):从数据提取到反爬应对​

目录

一、数据提取优化​

二、图片下载实现​

        1、定义 Item:在items.py中定义存储图片信息的字段:​

       2、修改爬虫:将image_url转换为列表赋值给image_urls:​

        3、配置管道:在settings.py中启用ImagesPipeline:​

三、反爬机制应对​

设置请求头:在settings.py中添加 User-Agent:​

    2、控制爬取速度:避免对服务器造成过大压力,同时降低被封禁风险:​

     3、使用代理 IP:对于反爬严格的网站,可配置代理中间件。创建middlewares.py:​

四、日志与调试​

五、分布式爬取思路​

六、总结与扩展​


上一篇文章介绍了 Scrapy 中 CrawlSpider 的基础用法,本文将在此基础上,探讨爬虫的优化技巧和实战经验,帮助你构建更高效、稳定的爬虫系统。​

一、数据提取优化​

在基础案例中,我们仅提取了图片标题。实际应用中,通常需要提取更多信息,以下是优化后的parse_item方法:​

def parse_item(self, response):
    item = {}
    # 提取图片标题
    item['title'] = response.xpath('//*[@id="main"]/div[3]/div[1]/div[1]/h1/text()').get()
    # 提取图片下载链接
    item['image_url'] = response.xpath('//*[@id="img"]/img/@src').get()
    # 处理相对URL
    if item['image_url'] and not item['image_url'].startswith('http'):
        item['image_url'] = response.urljoin(item['image_url'])
    # 提取发布时间
    item['publish_time'] = response.xpath('//*[@class="photoinfo"]/span[1]/text()').get()
    return item

优化点说明:​

  • 使用get()替代extract_first(),前者是 Scrapy 1.5 + 推荐的写法,更简洁。​
  • 提取图片 URL 时,处理相对 URL(如/uploads/xxx.jpg),通过response.urljoin()转换为绝对 URL。​
  • 增加发布时间等更多字段,丰富数据内容。​

二、图片下载实现​

Scrapy 提供了ImagesPipeline专门用于下载图片,步骤如下:​

        1、定义 Item:在items.py中定义存储图片信息的字段:​

import scrapy

class TupianItem(scrapy.Item):
    title = scrapy.Field()
    image_urls = scrapy.Field()  # 用于存储图片URL列表
    images = scrapy.Field()  # 用于存储下载后的图片信息
    publish_time = scrapy.Field()

       2、修改爬虫:将image_url转换为列表赋值给image_urls:​

item['image_urls'] = [item['image_url']] if item['image_url'] else []

        3、配置管道:在settings.py中启用ImagesPipeline:​

ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 300,
}
# 设置图片存储路径
IMAGES_STORE = './images'

三、反爬机制应对​

  1. 设置请求头:在settings.py中添加 User-Agent:​

DEFAULT_REQUEST_HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
}

    2、控制爬取速度:避免对服务器造成过大压力,同时降低被封禁风险:​

# 下载延迟(秒)
DOWNLOAD_DELAY = 2
# 并发请求数
CONCURRENT_REQUESTS = 4

     3、使用代理 IP:对于反爬严格的网站,可配置代理中间件。创建middlewares.py:​

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

settings.py中启用:​

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.ProxyMiddleware': 543,
}

四、日志与调试​

合理配置日志有助于排查问题:​

# 日志级别(DEBUG, INFO, WARNING, ERROR, CRITICAL)
LOG_LEVEL = 'INFO'
# 日志输出到文件
LOG_FILE = 'scrapy.log'

使用scrapy crawl tupian –nolog可关闭控制台日志输出,仅查看文件日志。​

五、分布式爬取思路​

对于大规模数据采集,可采用 Scrapy-Redis 实现分布式爬取:​

1、安装 Scrapy-Redis:pip install scrapy-redis​

2、修改爬虫继承自RedisCrawlSpider​

3、配置 Redis 连接信息​

六、总结与扩展​

本文介绍了 Scrapy 爬虫的优化技巧,包括数据提取增强、图片下载、反爬应对等。实际开发中,还需根据目标网站的特点进行针对性调整:​

  • 对于 JavaScript 动态加载的内容,可结合 Selenium 或 Playwright 处理。​
  • 数据存储可选择 MySQL、MongoDB 等数据库,通过自定义管道实现。​
  • 定期检查网站结构变化,及时更新 XPath 表达式。​

文章来源于互联网:Scrapy 爬虫优化与实战(二):从数据提取到反爬应对​

相关推荐: AIGC浪潮下,风靡全球的Mcp到底是什么?一文讲懂,技术小白都知道!!

个人主页-爱因斯晨 文章专栏-AIGC 长大好多烦恼,好愁! 目录 前言 初步了解 Mcp到底是个啥? 发展 理论基础 核心组件 使用逻辑 于传统API不同之处 模型推荐 前言 上年这个时候,刚拿到录取通知书。哥哥教我用ai智能体,其实就是向我炫技。当时我问他…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » Scrapy 爬虫优化与实战(二):从数据提取到反爬应对​
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们