python爬虫之scrapy框架详解

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实现查询剪贴板自动匹配信息的思路详解

    一、背景介绍近期,笔者在工作中遇到了这样一个问题:需要从多个excel表中查找特定的信息。由于excel中数据很多,如果一个一个地查找,显得非常耗时费力。经过调研和尝试,笔者最终决定使用Python实现查询剪贴板自动匹配信息的功能。下面将讲解这个功能的具体实现思路。 二、思路详解Python实现查询剪贴板自动匹配信息的思路如下: 1.获取剪贴板中的文本内容。…

    python 2023年5月18日
    00
  • jupyter notebook引用from pyecharts.charts import Bar运行报错

    为了详细讲解如何解决在Jupyter Notebook中使用pyecharts库时出现ImportError: cannot import name ‘Bar’ from ‘pyecharts.charts’错误,我们需要进行以下步骤: 1. 安装pyecharts 在使用pyecharts之前,我们需要先通过pip命令安装pyecharts库: !pip …

    python 2023年5月13日
    00
  • python-xpath获取html文档的部分内容

    Python-XPath获取HTML文档的部分内容 在本文中,我们将介绍如何使用Python和XPath从HTML文档中获取部分内容。XPath是一种用于在XML和HTML文档中选择元素的语言。我们将提供两个示例,以帮助读者更好地理解如何实现这个目标。 步骤1:安装必要的库 在使用Python和XPath获取HTML文档的部分内容之前,我们需要安装必要的库。…

    python 2023年5月15日
    00
  • python实现用户登录系统

    1. 简介 用户登录系统是网站及应用程序中非常基础、常见的功能之一。通过使用Python语言,可以容易地构建出一个用户登录系统。 2. 实现步骤 2.1. 设计数据库结构 创建一张用户表,包含如下字段:- 用户ID- 用户名- 密码- 邮箱 2.2. 用户注册 用户注册功能需要用户在网站上输入自己的用户名、密码和邮箱等信息,然后将这些信息写入到用户表中。 2…

    python 2023年5月19日
    00
  • Python中的xlrd模块使用整理

    下面是详细讲解Python中的xlrd模块的使用整理: 什么是xlrd模块 xlrd是Python语言的一个库,用于读取和处理Excel文件,支持.xls和.xlsx格式的文件。该模块可以帮助我们读取Excel文件中的所有数据,并对其进行处理和分析。 安装xlrd模块 使用pip install xlrd命令即可安装xlrd模块,如下所示: pip inst…

    python 2023年5月13日
    00
  • python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算

    让我们来详细讲解一下Python3中的字符串操作及其与数字类型的运算。 1. 字符串类型 在Python中,字符串类型是一种不可变的的数据类型,用于表示文本数据。字符串可以使用单引号、双引号、三引号来定义,例如: str1 = ‘hello world’ str2 = "hello world" str3 = ”’hello world…

    python 2023年6月5日
    00
  • pip报错“AttributeError: ‘NoneType’ object has no attribute ‘splitlines’”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “AttributeError: ‘NoneType’ object has no attribute ‘splitlines'” 错误。这个错误通常是由于 pip 安装不正确或者版本不兼容导致的。以下是详细讲解 pip 报错 “AttributeError: ‘NoneType’ object has …

    python 2023年5月4日
    00
  • python K近邻算法的kd树实现

    以下是关于“Python K近邻算法的kd树实现”的完整攻略: 简介 K近邻算法是一种常用的分类算法,它通过计算样本之间的距离来确定最近的K个邻居,并使用它们的标签来预测新样本的标签。kd树是一种常用的数据结构,它可以加速K近邻算法的计算。本教程将介绍如何使用Python实现K近邻算法的kd树实现,并提供两个示例。 K近邻算法 K近邻算法是一种常用的分类算法…

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