Python中的Scrapy框架怎么使用
更新时间:2023-09-10什么是Scrapy框架
Scrapy是一个用于爬取Web内容的高级Python框架。它同时支持静态和动态网站,并且拥有灵活、模块化和可重用的架构。Scrapy主要由三个部分组成:Spider、Item、Pipeline。其中Spider用于定义如何爬取网站,Item用于定义爬取的数据结构,Pipeline用于定义数据的处理方法。
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" start_urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] def parse(self, response): for quote in response.css('div.quote'): yield { 'text': quote.css('span.text::text').get(), 'author': quote.css('span small::text').get(), 'tags': quote.css('div.tags a.tag::text').getall(), } next_page = response.css('li.next a::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse)
如何使用Scrapy框架
使用Scrapy框架的步骤如下:
1. 创建Scrapy项目
scrapy startproject myproject
这将创建一个名为myproject的目录,其中包含Scrapy项目的结构和文件。
2. 创建Spider
import scrapy class MySpider(scrapy.Spider): name = "myspider" def start_requests(self): urls = [ 'http://www.example.com/page1.html', 'http://www.example.com/page2.html', 'http://www.example.com/page3.html', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): # 解析响应并提取数据 pass
这个Spider将访问三个URL请求,并在每个响应上调用parse()回调函数进行解析。要运行此Spider,可以使用以下命令:
scrapy crawl myspider
3. 提取数据并定义Item
在Spider内部定义Item,可以让Scrapy爬取和处理的数据看起来更加清晰。
import scrapy class MyItem(scrapy.Item): title = scrapy.Field() description = scrapy.Field() date = scrapy.Field()
在Spider内部,可以使用Item来存储数据:
def parse(self, response): item = MyItem() item['title'] = response.css('h1::text').get() item['description'] = response.css('p::text').get() item['date'] = response.css('span.date::text').get() yield item
4. 存储数据
在完成数据爬取和处理后,通常需要将数据存储到数据库或文件中。Scrapy提供了Item Pipeline机制,可以自定义如何对Item进行处理。
class MyPipeline(object): def process_item(self, item, spider): # 处理Item并将其存储到数据库或文件中 pass
可以在settings.py中定义Pipeline的优先级和参数:
ITEM_PIPELINES = { 'myproject.pipelines.MyPipeline': 300, # 优先级越小,越先执行 }
Scrapy框架的优缺点
Scrapy框架的优点:
- 高效:Scrapy使用异步IO框架Twisted,具有非常高的并发能力。
- 多用途:Scrapy适用于多种类型的网站,包括静态和动态网站。
- 可扩展:Scrapy的框架结构非常灵活、模块化和可重用,可以根据需求进行定制和扩展。
- 容错能力强:Scrapy具备自动重试、自动降速等多种机制,可以自动处理网络错误。
Scrapy框架的缺点:
- 学习曲线较陡峭:初学者需要掌握一定的Python和Twisted知识,而且Scrapy的文档更新较慢。
- 可定制性与解耦性不足:Scrapy的框架结构虽然可重用性高,但是在扩展和定制时可能会受到原有架构的限制。
- 无法处理JavaScript:Scrapy只能处理静态网页,对于使用JavaScript的网页需要使用Splash等外部库来处理。