适用人群:零基础、对网络爬虫有兴趣但不知道从何开始的小白。
什么是 Scrapy?
Scrapy 是一个基于 Python 的网络爬虫框架,它能帮助你快速爬取网站上的数据,并将数据保存到文件或数据库中。
特点:
- 高效:支持高并发爬取,性能强悍。
- 易用:模块化设计,代码清晰,易于上手。
- 灵活:支持爬取静态页面,还可以结合其他工具爬取动态页面。
准备工作
-
安装 Python
下载并安装 Python 3.x,建议从 Python 官网 获取最新版。
-
安装 Scrapy
在命令行中运行以下命令安装 Scrapy:
bashpip install scrapy
-
验证安装
输入以下命令检查是否安装成功:
bashscrapy version
如果显示版本号,说明安装成功!
第一步:创建 Scrapy 项目
-
创建项目
在命令行进入你想保存项目的目录,运行以下命令:
bashscrapy startproject myproject
这会创建一个名为
myproject
的文件夹,结构如下:myproject/ scrapy.cfg # 项目配置文件 myproject/ __init__.py # 标识包的文件 items.py # 定义数据结构 middlewares.py # 中间件 pipelines.py # 数据处理管道 settings.py # 项目配置 spiders/ # 存放爬虫的目录 __init__.py
-
进入项目目录
bashcd myproject
第二步:创建爬虫
我们以一个简单的网站为例: Quotes to Scrape
目标:爬取网站上的名言和作者。
-
生成爬虫文件
运行以下命令生成爬虫模板:
bashscrapy genspider quotes quotes.toscrape.com
这会在
spiders
文件夹下生成一个quotes.py
文件。 -
编辑爬虫代码
打开
quotes.py
,替换为以下代码:pythonimport scrapy class QuotesSpider(scrapy.Spider): name = "quotes" start_urls = [ 'http://quotes.toscrape.com/' ] def parse(self, response): for quote in response.css("div.quote"): yield { 'text': quote.css("span.text::text").get(), 'author': quote.css("span small.author::text").get(), } # 继续爬取下一页 next_page = response.css("li.next a::attr(href)").get() if next_page: yield response.follow(next_page, self.parse)
第三步:运行爬虫
-
运行爬虫
在命令行运行以下命令:
bashscrapy crawl quotes
-
保存数据
如果想将爬取的数据保存为 JSON 文件:
bashscrapy crawl quotes -o quotes.json
数据会被保存到
quotes.json
文件中。
第四步:分析代码
-
start_urls
定义起始 URL,即爬虫开始爬取的网站。
-
parse
方法负责处理 HTTP 响应,提取数据和下一页链接。
response.css
是 CSS 选择器,用于提取网页内容。yield
返回一个字典,保存爬取到的数据。
-
next_page
爬取下一页的链接并继续调用
parse
方法。
第五步:进阶功能
-
清洗数据
在
pipelines.py
中清洗和格式化数据。例如,将作者名统一大小写。 -
存储到数据库
修改
pipelines.py
,将数据存储到 MySQL 或 MongoDB。 -
添加 User-Agent
在
settings.py
中添加自定义 User-Agent,避免被网站屏蔽:pythonUSER_AGENT = 'my-scrapy-bot (http://mywebsite.com)'
常见问题
-
爬虫被屏蔽 :
使用随机 User-Agent 或代理 IP。
-
动态页面爬取 :
Scrapy 对静态页面支持很好,但对动态加载的内容可能无效。可结合 Selenium 或 Playwright。
总结
恭喜你完成了第一个 Scrapy 爬虫!通过 Scrapy,你可以轻松爬取各种网站的数据。接下来,你可以:
- 尝试爬取不同类型的网站。
- 深入学习 Scrapy 的高级功能,如自定义中间件、多线程优化等。
完整代码
项目目录中的爬虫代码最终如下:
python
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/'
]
def parse(self, response):
for quote in response.css("div.quote"):
yield {
'text': quote.css("span.text::text").get(),
'author': quote.css("span small.author::text").get(),
}
next_page = response.css("li.next a::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse)
动手实践是学习的最好方式!希望这篇文章对你有帮助。如果喜欢,请点赞、评论支持!如果有任何疑问,欢迎留言讨论! 😊