Python爬虫框架之Scrapy

Scrapy是一个用Python编写的强大的网络爬虫框架,用于高效地从网页中提取所需的数据。

一、安装Scrapy

  1. 确保已经安装了Python(建议使用Python 3.x)。可以通过以下命令来安装Scrapy:
    • 在命令行中使用pip install scrapy(如果使用的是Anaconda环境,可以使用conda install -c conda -forge scrapy)。

二、Scrapy的基本架构

  1. Spider(爬虫)
    • 这是Scrapy的核心组件,用于定义如何爬取网站。例如,你可以定义一个简单的Spider来爬取一个书籍网站的书名和作者信息。
    • 代码示例:
import scrapy

class BookSpider(scrapy.Spider):
    name = "book_spider"
    start_urls = ["https://example.com/books"]

    def parse(self, response):
        for book in response.css('div.book'):
            yield {
                'title': book.css('h2::text').get(),
                'author': book.css('p.author::text').get()
            }
  • 在这个示例中,name属性定义了Spider的名称,start_urls是开始爬取的URL列表。parse方法是处理响应(从网站获取的HTML内容)的回调函数,它使用CSS选择器来提取数据。
  1. Item(数据项)
    • 用于存储爬取到的数据。可以把它看作是一个Python字典,但具有更好的结构和可维护性。
    • 例如:
import scrapy

class BookItem(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
  • 可以在Spider中使用yield关键字返回Item对象,然后通过管道(Pipeline)进行进一步处理。
  1. Pipeline(管道)
    • 主要用于处理Spider提取的数据,比如数据清洗、存储等操作。
    • 例如,将爬取到的书籍信息存储到数据库中:
class BookPipeline:
    def open_spider(self, spider):
        # 连接数据库等初始化操作
        self.connection = sqlite3.connect('books.db')
        self.cursor = self.connection.cursor()
        self.cursor.execute('CREATE TABLE IF NOT EXISTS books (title TEXT, author TEXT)')

    def process_item(self, item, spider):
        self.cursor.execute("INSERT INTO books VALUES (?,?)", (item['title'], item['author']))
        self.connection.commit()
        return item

    def close_spider(self, spider):
        # 关闭数据库连接等清理操作
        self.connection.close()
  • 要启用这个管道,需要在settings.py文件中配置ITEM_PIPELINES选项。
  1. Downloader Middleware(下载中间件)和Spider Middleware(爬虫中间件)
    • Downloader Middleware用于处理请求和响应,比如设置请求头、代理等。例如,设置随机的用户代理来避免反爬虫:
class RandomUserAgentMiddleware:
    def process_request(self, request, spider):
        user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/88.0.1']
        request.headers['User - Agent'] = random.choice(user_agents)
  • Spider Middleware主要用于处理Spider的输入和输出,比如对Spider产生的请求和解析后的数据进行处理。

三、Scrapy的工作流程

  1. 首先,引擎(Engine)从Spider获取初始请求(start_urls中的请求),并将请求发送到调度器(Scheduler)。
  2. 调度器对请求进行排队,然后将请求发送到下载器(Downloader)。
  3. 下载器根据请求下载网页内容,并将响应返回给引擎。
  4. 引擎将响应发送给Spider进行处理,Spider通过parse等回调函数提取数据,并可以产生新的请求。
  5. 提取到的数据被发送到管道进行处理,新产生的请求会再次进入调度器排队,如此循环,直到没有新的请求。

四、Scrapy的优点

  1. 高效性
    • 采用异步I/O和多线程技术,能够快速地并发处理多个请求,大大提高了爬取速度。
  2. 灵活性
    • 可以方便地定制Spider来适应不同的网站结构,通过选择器(CSS选择器或XPath)精确地提取数据。
  3. 可扩展性
    • 中间件和管道机制使得可以很容易地扩展功能,如添加反爬虫策略、数据存储方式等。

五、Scrapy的应用场景

  1. 数据采集
    • 可以用于采集电商网站的商品信息(价格、评论等)、新闻网站的新闻内容、社交媒体的数据等。
  2. 搜索引擎索引构建
    • 帮助搜索引擎构建索引,通过爬取网页内容,提取关键词等信息,为搜索引擎提供数据。
posted @ 2024-12-18 16:03  软件职业规划  阅读(36)  评论(0编辑  收藏  举报