Python爬虫框架之Scrapy中Spider的用法
简介
Scrapy是一个用于爬取网站数据的Python框架,是Python爬虫工具中的一种,其提供了高效、快捷和可扩展的数据获取方式。其中Spider是Scrapy框架中最基本的爬虫,用于定制和控制Scrapy框架的爬取过程。
Spider的基本用法
创建Spider
在Scrapy框架中,我们通过创建Spider来指定爬取相关数据的网址、数据解析方式及爬取过程细节等。以下是一个基本的Spider示例:
import scrapy
class BooksSpider(scrapy.Spider):
name = "books"
allowed_domains = ["books.toscrape.com"]
start_urls = ['http://books.toscrape.com/']
def parse(self, response):
# 解析爬取页面,获取相关数据
pass
上述代码表示:创建了一个名为“books”的Spider,指定了爬取的域名为“books.toscrape.com”,初始请求网址为"http://books.toscrape.com/"。
定义Spider规则
Spider规则是Scrapy框架中最重要的一部分,通过规则可以定义爬虫如何跟进链接、如何爬取数据、如何处理数据等等细节。以下是一个基本的规则示例:
import scrapy
class BooksSpider(scrapy.Spider):
name = "books"
allowed_domains = ["books.toscrape.com"]
start_urls = ['http://books.toscrape.com/']
# 爬取网页数据:分别获取书籍标题、价格、评分和描述
def parse(self, response):
for book in response.xpath('//article[@class="product_pod"]'):
yield {
'title': book.xpath('h3/a/@title').extract_first(),
'price': book.xpath('div/p[@class="price_color"]/text()').extract_first(),
'rate': book.xpath('p[@class="star-rating"]/@class').re_first('star-rating ([A-Za-z]+)'),
'desc': book.xpath('p[@class="product_desc"]/text()').extract_first()
}
# 获取下一页
next_page = response.xpath('//li[@class="next"]/a/@href')
if next_page:
yield response.follow(next_page, self.parse)
上述代码表示:在Spider规则中,我们通过调用response对象来解析HTML页面,从而获取相关数据。其中,在函数parse()中,我们使用XPath方式快速获取书籍标题、价格、评分和描述等四个数据项。最后,在获取数据的同时,将下一页的链接提取出来,并使用response.follow()函数跟进下一页,进一步获取数据。
运行Spider
在编写完Spider后,我们可以通过以下命令来启动爬虫程序:scrapy runspider myspider.py
,其中myspider.py表示我们编写的爬虫脚本文件名。在启动爬虫程序后,Spider会自动按照我们定义的规则进行爬取操作,并将结果保存在Scrapy框架提供的数据存储结构中。
举例说明
示例一:使用Spider获取糗事百科段子
下面我们通过一个具体的事例来进一步介绍Scrapy框架中Spider的用法。我们以糗事百科(https://www.qiushibaike.com/text/)上的段子为例,通过Scrapy框架中的Spider来实现数据爬取和存储。
import scrapy
class QSBKSpider(scrapy.Spider):
name = "qsbk"
allowed_domains = ["qiushibaike.com"]
start_urls = ['https://www.qiushibaike.com/text/']
def parse(self, response):
for quote in response.xpath('//div[@class="article block untagged noline"]'):
# 获取段子内容和作者信息
content = quote.xpath('div[@class="content"]/text()').extract_first()
author = quote.xpath('div[@class="author clearfix"]/a/h2/text()').extract_first()
yield {
'text': content,
'author': author
}
# 获取下一页
next_page = response.xpath('//span[@class="next"]/a/@href')
if next_page:
yield response.follow(next_page, self.parse)
上述代码中,我们定义了一个名为“qsbk”的Spider,指定了起始网址为糗事百科的段子板块(https://www.qiushibaike.com/text/),然后使用parse()函数来爬取页面数据,并通过XPath方式获取段子内容和作者信息。另外,在获取数据的同时,我们还使用了response.follow()函数来跟进下一页,并进一步获取数据。最后,将爬取到的数据保存到Scrapy框架提供的数据存储结构中。
示例二:使用Spider获取Discuz!论坛帖子
下面我们再举一个例子,通过Scrapy框架中Spider来实现对Discuz!论坛(https://www.discuz.net/)中的帖子进行爬取和分析。该示例涉及到Discuz!论坛的登录,需要使用到Scrapy框架中的登录中间件(详情可以参考Scrapy的官方文档)。
import scrapy
class DiscuzSpider(scrapy.Spider):
name = "discuz"
allowed_domains = ["discuz.net"]
start_urls = ['https://www.discuz.net/forum-2-1.html']
# 登录相关信息
login_url = 'https://www.discuz.net/member.php?mod=logging&action=login'
login_data = {
'username': 'myusername',
'password': 'mypassword',
'quickforward': 'yes',
'handlekey': 'ls'
}
def start_requests(self):
# 提交登录表单,获取cookie
return [scrapy.FormRequest(self.login_url,
formdata=self.login_data,
meta={'cookiejar': 1},
callback=self.parse_login)]
def parse_login(self, response):
# 检查登录结果
if '欢迎您回来' in response.text:
self.logger.info('Login successfully')
# 构造目标帖子页面URL,并请求该页面
target_url = 'https://www.discuz.net/forum.php?mod=viewthread&tid=1084233'
yield scrapy.Request(target_url,
meta={'cookiejar': response.meta['cookiejar']},
callback=self.parse_post)
def parse_post(self, response):
# 分析帖子内容
title = response.xpath('//div[@class="display pi"]/h1/text()')[0]
content = response.xpath('//td[@class="t_f"]/text()')[0]
yield {
'title': title,
'content': content
}
上述代码中,我们首先创建了一个名为“discuz”的Spider,并指定了起始网址为“https://www.discuz.net/forum-2-1.html”。接着,我们定义了登录相关信息,包括登录网址、账号、密码等,然后使用FormRequest来提交登录表单,并获取登录后的cookie。在获取cookie后,我们构造目标帖子页面的URL,并使用Request函数请求该页面。最后,在获取页面数据过程中,我们通过XPath方式获取帖子的标题和内容,并将其存储到Scrapy框架提供的数据存储结构中。
总结
以上就是Python爬虫框架之Scrapy中Spider的用法的完整攻略。总的来说,通过Scrapy框架中Spider的定义和使用,我们可以快速、高效地实现对各类网站数据的爬取和加工。在实际使用过程中,还可以使用一些辅助工具和技巧来提高爬虫的效率和稳定性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫框架之Scrapy中Spider的用法 - Python技术站