目录
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'
三、反爬机制应对
-
设置请求头:在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智能体,其实就是向我炫技。当时我问他…
5bei.cn大模型教程网










