python Scrapy 进行数据爬取数据
使用 Scrapy 进行数据爬取的核心流程可概括为:创建项目 → 定义数据结构 → 编写爬虫逻辑 → 配置项目 → 运行爬虫并处理数据。以下是详细步骤,以爬取一个示例网站(如书籍信息网站)为例:
一、准备工作
1. 安装 Scrapy:
bash
pip install scrapy
2. 确认目标网站(以 Books to Scrape 为例,一个练习用的书籍信息网站)。
二、步骤详解
1. 创建 Scrapy 项目
首先通过命令创建项目框架,项目名自定义(如 book_crawler ):
bash
scrapy startproject book_crawler
cd book_crawler # 进入项目目录
项目结构说明:
plaintext
book_crawler/
├── scrapy.cfg # 项目部署配置
└── book_crawler/ # 主模块
├── items.py # 定义爬取的数据结构(Item)
├── middlewares.py # 中间件(处理请求/响应)
├── pipelines.py # 数据处理管道(如保存到文件/数据库)
├── settings.py # 项目配置(如User-Agent、延迟等)
└── spiders/ # 存放爬虫代码的目录
2. 定义数据结构(Item)
在 items.py 中定义要爬取的数据字段(如书籍名称、价格、评分等),用于规范化存储数据:
python
import scrapy
class BookItem(scrapy.Item):
title = scrapy.Field() # 书籍标题
price = scrapy.Field() # 价格
rating = scrapy.Field() # 评分
link = scrapy.Field() # 书籍详情页链接
3. 编写爬虫(Spider)
在 spiders 目录下创建爬虫文件(如 books.py ),定义爬取规则:
- 起始 URL
- 如何解析页面提取数据
- 如何跟进下一页链接
python
import scrapy
from book_crawler.items import BookItem
class BooksSpider(scrapy.Spider):
# 爬虫唯一名称(启动时使用)
name = "books"
# 允许爬取的域名(限制爬虫范围,避免爬取其他网站)
allowed_domains = ["books.toscrape.com"]
# 起始URL(爬虫开始的页面)
start_urls = ["http://books.toscrape.com/"]
def parse(self, response):
"""解析列表页,提取书籍数据并跟进下一页"""
# 1. 提取当前页的书籍数据
for book in response.css('article.product_pod'):
item = BookItem()
# 使用CSS选择器提取数据(也可使用XPath)
item['title'] = book.css('h3 a::attr(title)').get() # 标题
item['price'] = book.css('p.price_color::text').get() # 价格
item['rating'] = book.css('p.star-rating::attr(class)').re_first('star-rating (\w+)') # 评分(提取class中的星级)
item['link'] = response.urljoin(book.css('h3 a::attr(href)').get()) # 详情页链接(拼接完整URL)
yield item # 将数据传递给管道处理
# 2. 跟进下一页链接
next_page = response.css('li.next a::attr(href)').get()
if next_page:
# 拼接完整URL(如将"catalogue/page-2.html"转为绝对路径)
next_page_url = response.urljoin(next_page)
# 发送请求,回调自身(继续解析下一页)
yield scrapy.Request(next_page_url, callback=self.parse)
4. 配置项目(settings.py)
修改配置文件,优化爬取策略(反爬、效率等):
python
# 1. 设置User-Agent(模拟浏览器,避免被识别为爬虫)
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
# 2. 禁止遵循robots.txt(根据网站规则决定,练习网站可关闭)
ROBOTSTXT_OBEY = False
# 3. 设置请求延迟(单位:秒,避免请求过快被封)
DOWNLOAD_DELAY = 1
# 4. 启用管道(如果需要自定义数据处理,如保存到数据库)
ITEM_PIPELINES = {
'book_crawler.pipelines.BookCrawlerPipeline': 300, # 优先级:数字越小越先执行
}
5. 处理数据(Pipeline,可选)
如果需要自定义数据处理(如去重、保存到数据库),编辑 pipelines.py 。例如,保存数据到 JSON 文件:
python
import json
class BookCrawlerPipeline:
def open_spider(self, spider):
# 爬虫启动时打开文件
self.file = open('books.json', 'w', encoding='utf-8')
self.file.write('[') # JSON数组开始
def close_spider(self, spider):
# 爬虫结束时关闭文件
self.file.write(']') # JSON数组结束
self.file.close()
def process_item(self, item, spider):
# 处理每条数据,转为JSON字符串写入文件
line = json.dumps(dict(item), ensure_ascii=False) + ',\n'
self.file.write(line)
return item # 传递给下一个管道(如果有)
6. 运行爬虫并查看结果
执行以下命令启动爬虫,结果可保存为 JSON、CSV 等格式:
bash
# 直接输出到文件(无需管道)
scrapy crawl books -o books_output.json # 保存为JSON
# 或保存为CSV
scrapy crawl books -o books_output.csv
运行后,会生成 books_output.json 或 books_output.csv ,包含所有爬取的书籍数据。
关键技巧
1. 调试选择器:使用 scrapy shell 交互式测试选择器:
bash
scrapy shell "http://books.toscrape.com/"
# 在shell中测试:response.css('h3 a::attr(title)').get()
2. 处理动态页面:若数据由 JavaScript 加载,可结合 scrapy-splash 或 playwright 渲染页面。
3. 反爬策略:通过中间件添加随机 User-Agent、代理 IP,或设置 CONCURRENT_REQUESTS 控制并发数。
通过以上步骤,即可完成一个基础的 Scrapy 爬虫。对于复杂场景(如登录、分布式爬取),可进一步扩展中间件、管道或集成第三方工具。
更多推荐
所有评论(0)