【愚公系列】《Python网络爬虫从入门到精通》051-Scrapy 的基本应用
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟
📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!
👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!
💎【行业认证·权威头衔】
✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家
✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主
✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者
🏆【荣誉殿堂】
🎖 连续三年蝉联"华为云十佳博主"(2022-2024)
🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023)
🎖 十余个技术社区年度杰出贡献奖得主
📚【知识宝库】
覆盖全栈技术矩阵:
◾ 编程语言:.NET/Java/Python/Go/Node…
◾ 移动生态:HarmonyOS/iOS/Android/小程序
◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙
◾ 游戏开发:Unity3D引擎深度解析
每日更新硬核教程+实战案例,助你打通技术任督二脉!
💌【特别邀请】
正在构建技术人脉圈的你:
👍 如果这篇推文让你收获满满,点击"在看"传递技术火炬
💬 在评论区留下你最想学习的技术方向
⭐ 点击"收藏"建立你的私人知识库
🔔 关注公众号获取独家技术内参
✨与其仰望大神,不如成为大神!关注"愚公搬代码",让坚持的力量带你穿越技术迷雾,见证从量变到质变的奇迹!✨ |
🚀前言
今天,我们将进一步深入 Scrapy 的基本应用,带你掌握如何高效地使用 Scrapy 完成实际的数据抓取任务。
Scrapy 不仅是一个强大的爬虫框架,它还提供了灵活的 API 和工具,使得我们能够轻松处理各种复杂的网页抓取场景。本篇文章将通过实例讲解 Scrapy 的基本应用,帮助你熟练掌握它的核心功能,为你后续的爬虫开发打下坚实的基础。
在本篇文章中,我们将会学习到:
- Scrapy 爬虫的基本使用:如何编写一个简单的爬虫,并启动抓取任务。
- 定义 Scrapy 项目中的 Item 和 Pipeline:帮助你结构化抓取的数据,并将其存储到指定的格式中。
- 使用 Scrapy 处理请求和响应:如何有效地发起请求、获取响应,并解析网页内容。
- 模拟常见的爬虫需求:如处理分页、提取数据、模拟用户行为等。
通过这篇文章的学习,你将能够熟练掌握 Scrapy 的基础操作,快速开始使用 Scrapy 进行高效的数据抓取工作。如果你还在为如何使用 Scrapy 搭建有效的爬虫而困惑,那么今天的内容将为你提供清晰的解决方案。
🚀一、Scrapy 的基本应用
🔎1.创建Scrapy项目
-
项目创建步骤
- 在任意路径下创建保存项目的文件夹(如
F:\PycharmProjects
)。 - 在文件夹内打开命令行窗口,输入命令:
scrapy startproject scrapyDemo
- 在任意路径下创建保存项目的文件夹(如
-
项目目录结构
使用PyCharm打开项目后,目录结构如下:
🔎2.创建爬虫
-
爬虫文件要求
- 文件需放置在
spiders
文件夹中。 - 爬虫类需继承
scrapy.Spider
,并实现以下核心方法:start_requests()
:初始化网络请求。parse()
:解析响应结果。
- 文件需放置在
-
Scrapy.Spider类属性与方法
属性/方法 说明 name
爬虫唯一标识,建议使用网站名称。 allowed_domains
允许爬取的域名列表(需启用 OffsiteMiddleware
)。start_urls
初始URL列表,未指定特定URL时默认从此列表爬取。 custom_settings
覆盖全局配置的字典(需在类中定义)。 start_requests()
生成网络请求,默认使用 start_urls
发起GET请求,可重写为POST请求。parse()
默认响应处理方法,返回包含 Request
或Item
的可迭代对象。closed()
爬虫关闭时调用,用于资源释放或收尾操作。 -
示例代码
爬取网页并保存HTML文件import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/' ] def start_requests(self): for url in self.urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = f'quotes-{page}.html' with open(filename, 'wb') as f: f.write(response.body) self.log(f'Saved file {filename}')
运行命令:
scrapy crawl quotes
-
POST请求实现
import scrapy import json class QuotesSpider(scrapy.Spider): name = "quotes" data = {'1': '能力是有限的,而努力是无限的。', '2': '星光不问赶路人,时光不负有心人。'} def start_requests(self): # return [scrapy.FormRequest( # url='http://httpbin.org/post', # formdata=self.data, # callback=self.parse # )] yield scrapy.FormRequest( url='http://httpbin.org/post', formdata=self.data, callback=self.parse ) def parse(self, response): response_dict = json.loads(response.text) print(response_dict)
-
程序内启动爬虫
from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settings if __name__ == '__main__': process = CrawlerProcess(get_project_settings()) process.crawl('quotes') process.start()
🔎3.获取数据
-
CSS选择器
# 提取<title>标签内容 response.css('title::text').extract_first() # 返回第一个匹配结果 response.css('title::text')[0].extract() # 返回第一个匹配结果
-
XPath选择器
# 提取<title>标签内容 response.xpath('//title/text()').extract_first()
案例分析:
import scrapy # 导入框架 import twisted class QuotesSpider(scrapy.Spider): name = "quotes" # 定义爬虫名称 def start_requests(self): # 设置爬取目标的地址 urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] # 获取所有地址,有几个地址发送几次请求 for url in urls: # 发送网络请求 yield scrapy.Request(url=url, callback=self.parse) # 响应信息 def parse(self, response): # 获取所有信息 for quote in response.xpath(".//*[@class='quote']"): # 获取名人名言文字信息 text = quote.xpath(".//*[@class='text']/text()").extract_first() # 获取作者 author = quote.xpath(".//*[@class='author']/text()").extract_first() # 获取标签 tags = quote.xpath(".//*[@class='tag']/text()").extract() # 以字典形式输出信息 print(dict(text=text, author=author, tags=tags)) # 导入CrawlerProcess类 from scrapy.crawler import CrawlerProcess # 导入获取项目设置信息 from scrapy.utils.project import get_project_settings # 程序入口 if __name__=='__main__': # 创建CrawlerProcess类对象并传入项目设置信息参数 process = CrawlerProcess(get_project_settings()) # 设置需要启动的爬虫名称 process.crawl('quotes') # 启动爬虫 process.start()
-
翻页提取
import scrapy # 导入框架
import twisted
class QuotesSpider(scrapy.Spider):
name = "quotes" # 定义爬虫名称
def start_requests(self):
# 设置爬取目标的地址
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
# 获取所有地址,有几个地址发送几次请求
for url in urls:
# 发送网络请求
yield scrapy.Request(url=url, callback=self.parse)
# 响应信息
def parse(self, response):
# div.quote
# 获取所有信息
for quote in response.xpath(".//*[@class='quote']"):
# 获取作者
author = quote.xpath(".//*[@class='author']/text()").extract_first()
print(author) # 输出作者名称
# 实现翻页
for href in response.css('li.next a::attr(href)'):
yield response.follow(href, self.parse)
# 导入CrawlerProcess类
from scrapy.crawler import CrawlerProcess
# 导入获取项目设置信息
from scrapy.utils.project import get_project_settings
# 程序入口
if __name__=='__main__':
# 创建CrawlerProcess类对象并传入项目设置信息参数
process = CrawlerProcess(get_project_settings())
# 设置需要启动的爬虫名称
process.crawl('quotes')
# 启动爬虫
process.start()
-
结构化数据
items.py定义:
import scrapy class ScrapydemoItem(scrapy.Item): text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field()
爬虫代码:
import scrapy # 导入框架 from scrapyDemo.items import ScrapydemoItem # 导入ScrapydemoItem类 class QuotesSpider(scrapy.Spider): name = "quotes" # 定义爬虫名称 def start_requests(self): # 设置爬取目标的地址 urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] # 获取所有地址,有几个地址发送几次请求 for url in urls: # 发送网络请求 yield scrapy.Request(url=url, callback=self.parse) # 响应信息 def parse(self, response): # 获取所有信息 for quote in response.xpath(".//*[@class='quote']"): # 获取名人名言文字信息 text = quote.xpath(".//*[@class='text']/text()").extract_first() # 获取作者 author = quote.xpath(".//*[@class='author']/text()").extract_first() # 获取标签 tags = quote.xpath(".//*[@class='tag']/text()").extract() # 创建Item对象 item = ScrapydemoItem(text=text, author=author, tags=tags) yield item # 输出信息 # 导入CrawlerProcess类 from scrapy.crawler import CrawlerProcess # 导入获取项目设置信息 from scrapy.utils.project import get_project_settings # 程序入口 if __name__=='__main__': # 创建CrawlerProcess类对象并传入项目设置信息参数 process = CrawlerProcess(get_project_settings()) # 设置需要启动的爬虫名称 process.crawl('quotes') # 启动爬虫 process.start()
🔎4.数据保存为多种格式
-
命令行保存
scrapy crawl quotes -o test.json # JSON格式 scrapy crawl quotes -o test.csv # CSV格式 scrapy crawl quotes -o test.xml # XML格式
-
代码内保存
from scrapy import cmdline cmdline.execute('scrapy crawl quotes -o test.json'.split())
注意事项
- 若运行时报错
SyntaxError: invalid syntax
,需修改Python37\Lib\site-packages\twisted\conch\manhole.py
中的async
为其他名称(如async_
)。 - 使用正则表达式提取数据时,可通过
response.xpath().re()
调用。
- 点赞
- 收藏
- 关注作者
评论(0)