从动态网页抓取数据可能需要与 JavaScript 进行交互。这就是 Scrapy Splash 发挥作用的地方。完成本指南后,您将学会如何使用 Scrapy Splash 创建一个蜘蛛,从 quotes.toscrape.com 抓取报价。
步骤 1:生成蜘蛛
我们将使用 Scrapy 的内置命令生成蜘蛛。命令如下:
scrapy genspider quotes quotes.toscrape.com
执行后,spiders 目录下将生成一个名为 quotes.py 的新文件。
步骤 2:了解 Scrapy 爬虫的基础知识
打开 quotes.py 文件,你会看到:
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
pass
- name:蜘蛛的名称
- allowed_domains:将蜘蛛限制在列出的域名范围内
- start_urls:待抓取的 URL
- parse:针对每个 URL 调用的解析方法
步骤 3:从单个页面抓取数据
现在,让我们让蜘蛛正常运行。
a) 使用网页浏览器检查元素
使用开发者工具分析 HTML 结构。你会发现每条报价都被包含在一个类名为 quote 的 div 标签中。
b) 准备 SplashscraperItem 类
在 items.py 中进行修改,添加三个字段:author、text 和 tags:
import scrapy
class SplashscraperItem(scrapy.Item):
author = scrapy.Field()
text = scrapy.Field()
tags = scrapy.Field()
c) 实现 parse() 方法
导入 SplashscraperItem 类,并更新 quotes.py 中的 parse 方法:
from items import SplashscraperItem
def parse(self, response):
for quote in response.css("div.quote"):
text = quote.css("span.text::text").extract_first("")
author = quote.css("small.author::text").extract_first("")
tags = quote.css("meta.keywords::attr(content)").extract_first("")
item = SplashscraperItem()
item['text'] = text
item['author'] = author
item['tags'] = tags
yield item
步骤 4:处理分页
添加代码以遍历所有页面:
next_url = response.css("li.next>a::attr(href)").extract_first("")
if next_url:
yield scrapy.Request(next_url, self.parse)
步骤 5:添加 SplashRequest 以获取动态内容
要使用 SplashRequest,您需要对当前的蜘蛛程序进行修改:
from scrapy_splash import SplashRequest
def start_requests(self):
url = 'https://quotes.toscrape.com/'
yield SplashRequest(url, self.parse, args={'wait': 1})
更新 parse 方法以使用 SplashRequest:
if next_url:
yield scrapy.SplashRequest(next_url, self.parse, args={'wait': 1})
恭喜!您刚刚编写了一个利用 Splash 抓取动态内容的、功能完整的 Scrapy 蜘蛛。现在您可以运行该蜘蛛,并从 quotes.toscrape.com 提取所有引文、作者和标签。
该代码为抓取其他结构相似的动态网站提供了绝佳的模板。祝您抓取愉快!