python爬虫scrapy基本使用超详细教程

  • Post category:Python

Python爬虫Scrapy基本使用超详细教程

简介

Scrapy是Python编写的一个Web爬虫框架,基于Twisted异步网络库开发,可以加速爬虫的速度,同时支持XPath, CSS选择器等方式解析页面内容,底层支持分布式部署,可以实现高并发爬虫。

安装Scrapy

可以使用pip安装Scrapy:

pip install scrapy

也可以从Scrapy官网下载源码安装:

git clone https://github.com/scrapy/scrapy.git
cd scrapy
python setup.py install

创建项目

使用命令创建一个新的Scrapy项目:

scrapy startproject myproject

其中myproject是项目的名称。

在创建完项目后,进入项目目录,可以看到如下的文件结构:

myproject/
    scrapy.cfg
    myproject/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py

其中:

  • scrapy.cfg:Scrapy项目的配置文件;
  • myproject:项目的Python模块,实际项目的代码放在这个目录下;
  • items.py:定义爬取的数据结构;
  • middlewares.py:定义的Scrapy中间件;
  • pipelines.py:定义的Scrapy管道,用于处理数据;
  • settings.py:项目的配置文件;
  • spiders:爬虫目录,存放所有爬虫代码。

定义爬虫

spiders目录下创建一个新的文件,命名为spider.py,定义一个简单的爬虫:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com']

    def parse(self, response):
        yield {
            'title': response.css('title::text').extract_first(),
            'body': response.css('body::text').extract_first()
        }

在代码中,创建一个名为MySpider的爬虫类,指定了爬虫的名称为myspider,并指定了爬取的起始网址。parse()方法用于解析并处理抓取到的页面,返回一个字典对象。

运行爬虫

在终端中使用scrapy crawl命令运行爬虫:

scrapy crawl myspider

其中myspider为自定义的爬虫名称。运行后,Scrapy会自动执行parse()方法,并将结果输出到控制台上。

示例1:爬取热门书籍

接下来,我们用Scrapy爬取豆瓣热门图书信息,比如书名、作者、评分等。该爬虫的代码如下:

import scrapy

class BookSpider(scrapy.Spider):
    name = "book"
    allowed_domains = ["book.douban.com"]
    start_urls = [
        "https://book.douban.com/top250"
    ]

    def parse(self, response):
        for book in response.css('tr.item'):
            yield {
                'title': book.css('div.pl2 a::text').extract_first(),
                'author': book.css('p.pl::text').extract_first(),
                'rating': book.css('span.rating_nums::text').extract_first()
            }

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

在代码中,我们定义了一个名为BookSpider的爬虫类。在parse()方法中,使用response.css方法选取页面元素,返回结果为SelectorList对象,使用extract_first()方法提取第一个匹配的内容,并构造一个字典对象返回。

接着,使用response.follow()方法处理翻页,如果存在下一页,则继续调用parse()方法爬取。

示例2:递归爬取网站所有页面

在实际爬取过程中,我们需要递归地爬取一个网站上的所有页面,可以使用Scrapy的CrawlSpider实现。下面是一个从start_urls开始递归地爬取网站上所有页面的爬虫代码:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class MySpider(CrawlSpider):
    name = 'myspider'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/']
    rules = [
        Rule(LinkExtractor(), callback='parse_item', follow=True)
    ]

    def parse_item(self, response):
        yield {
            'url': response.url,
            'title': response.css('title::text').extract_first(),
            'body': response.css('body::text').extract_first()
        }

在代码中,我们使用CrawlSpider作为基类,并定义了一个简单的规则。LinkExtractor用于提取链接,Rule表示如何处理链接。在parse_item()方法中,解析页面并返回内容。

链接

本文参考了Scrapy的官方文档和教程。