python爬虫之scrapy框架详解

yizhihongxing

python爬虫之scrapy框架详解

Scrapy是Python中一个强大的爬虫框架,它可以让我们轻松高效地从各种类型的网站中获取数据。本文将详细讲解Scrapy框架的使用和工作原理,让大家快速上手使用。

Scrapy框架的安装

Scrapy框架依赖于很多第三方库,所以在安装之前必须先安装好其他的依赖。在安装Scrapy之前,我们需要确保已安装好以下软件:

  • Python 3.x
  • pip

接下来,我们可以使用以下命令安装Scrapy框架:

pip install scrapy

Scrapy框架的使用

创建一个新的Scrapy项目

使用Scrapy框架创建一个新的项目非常简单,只需要在命令行中运行以下命令:

scrapy startproject myproject

其中,myproject是我们自定义的项目名称。这个命令将会在当前目录下创建一个名为myproject的新文件夹,其中包含了一个基础的Scrapy爬虫项目结构。

编写爬虫

在Scrapy框架中,每个爬虫都由一个Spider类来定义。我们需要编写一个Spider类来告诉Scrapy框架我们要爬取哪些网站、从哪里开始爬取、如何爬取以及如何处理提取到的数据。

下面是一个简单的Spider类示例,用于爬取example.com网站上的所有页面:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["example.com"]
    start_urls = ["http://www.example.com/"]

    def parse(self, response):
        # 处理提取到的数据
        pass

在上述代码中,我们定义了一个名为ExampleSpider的Spider类。这个类中包含了三个类属性:name、allowed_domains和start_urls。name属性是Spider的唯一标识符,用于在运行Scrapy时区分不同的Spider;allowed_domains属性用于指定我们要爬取的网站的域名;start_urls是一个包含了起始链接的列表,Scrapy将从这些链接开始爬取数据。

parse方法是Spider类的核心方法,它获取爬虫处理的响应并返回一个包含提取到的数据的字典或者生成器对象。在这里,我们可以使用XPath或CSS选择器语法来提取我们感兴趣的数据。

运行爬虫

一旦我们编写好了Spider类,就可以使用以下命令来运行爬虫:

scrapy crawl <spider_name>

其中,是我们自定义的Spider类的name属性。

提取数据

在Scrapy框架中,我们可以使用Item类来表示爬取到的数据。对于每个需要爬取的数据,我们都可以创建一个对应的Item类,并在parse方法中使用yield语句返回一个新的Item实例。

下面是一个简单的Item类示例,用于表示从example.com网站上爬取到的文章数据:

import scrapy

class ArticleItem(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    content = scrapy.Field()

在上述代码中,我们定义了一个名为ArticleItem的Item类,其中包含了三个属性:title、author和content。我们可以通过调用Item类的Field方法来定义每个属性的数据类型。

在parse方法中,我们可以创建一个新的ArticleItem实例,并将提取到的数据赋值给对应的属性:

def parse(self, response):
    title = response.css("h1.title::text").extract_first()
    author = response.css("a.author::text").extract_first()
    content = response.css("div.content::text").extract_first()

    item = ArticleItem(title=title, author=author, content=content)
    yield item

在这里,我们使用CSS选择器语法从响应中提取title、author和content数据,并将这些数据赋值给新的ArticleItem实例的属性。最后,我们使用yield语句来返回这个新的Item实例。

数据存储

在Scrapy框架中,我们可以使用管道(Pipeline)来处理从Spider中提取到的数据。每个管道类都需要实现process_item方法,该方法将会在Spider提取到数据并返回Item实例后被调用。

下面是一个简单的管道类示例,用于将数据存储到MongoDB数据库中:

import pymongo

class MongoDBPipeline(object):
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[item.__class__.__name__.lower()].insert(dict(item))
        return item

在这个示例中,我们使用了pymongo库连接MongoDB数据库。在process_item方法中,我们将Item实例转换为Python字典,并插入到MongoDB中。

示例一:爬取豆瓣电影TOP250

下面是一个实际的爬取豆瓣电影TOP250的Spider类示例,用于从https://movie.douban.com/top250上爬取电影的名称、导演、评分、简介等数据:

import scrapy

class DoubanMovieSpider(scrapy.Spider):
    name = "douban_movie"
    allowed_domains = ["movie.douban.com"]
    start_urls = ["https://movie.douban.com/top250"]

    def parse(self, response):
        for movie in response.css(".item"):
            yield {
                "title": movie.css(".title::text").extract_first(),
                "director": movie.css(".bd p::text")[0].extract().split(" ")[1],
                "star": movie.css(".star span.rating_num::text").extract_first(),
                "quote": movie.css(".quote span::text").extract_first(),
            }

        next_page = response.css(".next a::attr(href)").extract_first()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

在这里,我们使用了CSS选择器语法提取电影的名称、导演、评分和简介数据,并使用response.follow方法来构造下一页的URL。

示例二:爬取知乎用户信息

下面是一个实际的爬取知乎用户信息的Spider类示例,用于从https://www.zhihu.com上爬取用户ID、昵称、行业、性别、地址等数据:

import scrapy

class ZhihuUserSpider(scrapy.Spider):
    name = "zhihu_user"
    allowed_domains = ["www.zhihu.com"]
    start_urls = ["https://www.zhihu.com"]

    def parse(self, response):
        yield scrapy.Request(
            "https://www.zhihu.com/api/v4/me",
            callback=self.parse_user_info,
            headers={"authorization": "Bearer " + self.settings.get("ZHIHU_TOKEN")},
        )

    def parse_user_info(self, response):
        data = response.json()

        yield {
            "user_id": data["id"],
            "name": data["name"],
            "gender": data["gender"],
            "headline": data["headline"],
            "business": data["business"]["name"],
            "locations": [location["name"] for location in data["locations"]],
            "description": data["description"],
        }

在这个示例中,我们使用了知乎的API接口获取当前用户的信息,并提取其ID、昵称、行业、性别、地址等数据。

总结

Scrapy框架是一个功能强大、灵活性高、可扩展性强的Python爬虫框架。在本文中,我们详细讲解了Scrapy框架的使用和工作原理,包括创建一个新的Scrapy项目、编写爬虫、运行爬虫、提取数据和数据存储等方面。两个实际的Spider类示例也为大家提供了更加直观的参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬虫之scrapy框架详解 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python项目生成exe

    前言 做了个python的小项目,需要打包为桌面端的exe使用,结果一打包,体积直接上百兆了,研究了下,使用虚拟环境打出的包会更干净小巧。 安装anaconda anaconda用作python的虚拟环境管理工具,安装命令:https://repo.anaconda.com/archive/Anaconda3-2023.03-Windows-x86_64.e…

    python 2023年4月17日
    00
  • Python爬取股票信息,并可视化数据的示例

    下面我将为您详细讲解“Python爬取股票信息,并可视化数据的示例”的完整攻略,步骤如下: 1. 确定目标网站并分析页面结构 首先,我们需要确定目标网站,并分析该网站的页面结构和获取数据的方式。在这里,我们选择使用新浪财经网站作为示例,目标链接为:https://finance.sina.com.cn/realstock/company/sh600519/n…

    python 2023年5月14日
    00
  • Python自动化办公之生成PDF报告详解

    Python自动化办公之生成PDF报告详解 简介 本攻略将详细介绍如何使用Python语言自动化生成PDF报告。我们将使用Python中的reportlab库,Pillow库,以及Pandas库,通过数据处理和图表可视化来生成具有分析性质的PDF报告。 准备工作 在使用reportlab库来生成PDF文件之前,需要进行以下准备工作: 1.安装reportla…

    python 2023年6月5日
    00
  • APPium+Python编写真机移动端自动化脚本的项目实践

    下面我将详细讲解“APPium+Python编写真机移动端自动化脚本的项目实践”的完整攻略。 一、项目背景 在移动互联网时代,移动端自动化测试已成为软件测试的一个重要环节。而APPium+Python是目前最受欢迎的移动端自动化测试组合。本项目主要是利用APPium和Python编程语言,编写真机移动端自动化脚本,来检验移动应用的稳定性、兼容性和性能等方面的…

    python 2023年5月23日
    00
  • python中django框架通过正则搜索页面上email地址的方法

    在 Django 中,我们可以使用正则表达式来搜索页面上的 email 地址。本文将详细介绍如何在 Django 中使用正则表达式搜索 email 地址,包括正则表达式的编写、如何在 Django 中使用正则表达式等。 编写正则表达式 在编写正则表达式之前,我们需要了解 email 地址的格式。一般来说,email 地址的格式为 username@domai…

    python 2023年5月14日
    00
  • python分布式爬虫打造搜索引擎——–scrapy实现

    http://www.cnblogs.com/jinxiao-pu/p/6706319.html 最近在网上学习一门关于scrapy爬虫的课程,觉得还不错,以下是目录还在更新中,我觉得有必要好好的做下笔记,研究研究。 第1章 课程介绍  1-1 python分布式爬虫打造搜索引擎简介 07:23  第2章 windows下搭建开发环境  2-1 pychar…

    爬虫 2023年4月8日
    00
  • Python爬虫基础讲解之请求

    Python爬虫基础讲解之请求 本篇文章将从Python爬虫的基础知识开始讲解,主要介绍请求的概念、请求的种类、请求的参数以及使用Python发送请求的方法。本篇文章的目的是为了初学者对Python爬虫的请求操作有一个全面的了解。 什么是请求 在网络通信中,请求指的是客户端向服务端发送的一种数据包,客户端可以通过请求获取服务端所提供的各种资源。在爬虫中,请求…

    python 2023年5月14日
    00
  • python 时间处理之月份加减问题

    下面就为大家详细讲解”python 时间处理之月份加减问题”的完整攻略。 一、问题描述 我们在使用Python处理时间日期的时候,经常需要进行加减操作获取想要的日期。但是,在进行月份加减的时候,很容易遇到一些问题,特别是跨年的情况,导致结果不符合预期。下面我们就来探讨一下如何正确地进行月份加减。 二、错误的操作示例 我们先来看一个错误的操作示例: impor…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部