Scrapy的基本用法

1 篇文章 0 订阅
1 篇文章 0 订阅

网上有很多关于Scrapy的安装方式,这里不再说了。

新建一个爬虫项目

scrapy startproject quotestutorial

利用上面的命令新建一个scrapy项目,项目名是quotestutorial,因为我爬取的网址是http://quotes.toscrape.com,这是一个格言的网址。现在就可以在当前目录看到一个名为quotestutorial的文件夹。

新建一个爬虫

scrapy genspider quotes quotes.toscrape.com

其中quotes是爬虫的名字,quotes.toscrape.com 是要爬取的网站的域名,注意,一定是域名,不可以带协议比如http://

用编辑器打开当前项目,看到目录结构如下所示。

在这里插入图片描述

spiders文件夹

spiders文件夹存放你构建的Spider类,比如我现在的quotes.py中,有如下代码。

# -*- coding: utf-8 -*-
import scrapy
class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com/']
    start_urls = ['http://quotes.toscrape.com/']
    
    def parse(self, response):
        pass

这些代码是在你执行scrapy genspider quotes quotes.toscrape.com的时候自动生成的,allowed_domains列举了你爬的网站域名,start_url列举了你想要爬取的页面的起始页。

下面的函数 parse是一个回调函数,就是当爬取页面成功时,该做些生么,由你自己定义,其中的参数response中就是一些处理网页的API。

setting.py

这里定义一些配置参数。

items.py

items.py中的初识内容如下

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class QuotestutorialItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

从描述中可以看出这里是定义爬取模型的,也就是说我们想要把我们爬取的内容,变成结构化的数据,类似于Java中bean,可以在这里定义封装格式。定义方式就是

name = scrapy.Field()
age = scrapy.Field()
...

我想爬取格言网站的信息,提取出contentauthortags,三个信息。于是定义Item为。

class QuotestutorialItem(scrapy.Item):
    content = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

pipelines.py

这里的初始内容如下

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.exceptions import DropItem


class QuotestutorialPipeline(object):

    def process_item(self, item, spider):
        pass

pipeline从名字上可是管道的意思,其实就是在生成item之后,如何处理这些item。这里可以定义自己的逻辑。

process_item函数就是逻辑代码定义的地方,item就是上面items.py中定义的Item。

除了process_item方法外,其实还有两个方法,可以对他们进行重写,一个是

@classmethod
def from_crawler(cls, crawler):
    ...
    return cls(
        ...
    )

这里返回一个当前类的对象,也就是当前pipeline的对象,从crawler中可以获取setting.py中的配置参数

crawler.settings.get('[参数名]')

另一个是

def open_spider(self, spider):
    pass

这里可以写爬虫初始化结束,还未开始爬取的时候的逻辑代码。

开始写爬虫

写Spider
class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com/']
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        quotes = response.css('.quote')
        for quote in quotes:
            content = quote.css('.text ::text').extract_first()
            author = quote.css('.author ::text').extract_first()
            tags = quote.css('.tags .tag::text').extract()
            item = QuotestutorialItem()
            item['content'] = content
            item['author'] = author
            item['tags'] = tags
            yield item
        # /page/2/
        next = response.css('.pager .next a ::attr(href)').extract_first()
        if next:
            url = response.urljoin(next)
            yield scrapy.Request(url=url, callback=self.parse, dont_filter=True)

上面代码不难理解,有几点需要说明的。

  • response.css(…)
    responsecss函数可以通过选择器获取页面的结点内容, 其中的::text是固定写法,表示我要获取结点中的text,extract_first是只取第一个结点,因为只有一个。extract函数是取所有节点,tag有多个。
  • item是一个dict
    上面的代码不难看出item是一个dict类型,这里的item就是我们在items.py中定义的。
  • yield item
    通过yield方式可以返回一个遍历器,其实这里的遍历器在底层应该是将item传到我们定义的pipeline中做处理了,当然pipeline需要开启才行,后面会说到,如果pipline没有开启,则默认会打印到控制台。
  • 翻页
    这里的最后一句代码yield scrapy.Request(url=url, callback=self.parse, dont_filter=True) , next是翻页按钮的href,这里是递归的翻页,直到最后一页为止。
开始运行

到目前为止,其实就可以运行了。在命令行输入

scrapy crawl quotes

即可运行名为quotes的爬虫。
如果没有出现你爬取的信息,有以下几种可能

  • robot.txt

这是网站的一个爬虫规则,如果网站中包含这个robot.txt,则网站很有可能与反爬虫措施。如果你在控制台发现如下类似的语句,

<GET http://rd.139site.com/?e=dns&t=http/robots.txt> from <GET http://http/robots.txt>

则就可能是这种情况。
解决办法是,在setting.py中将ROBOTSTXT_OBEY = True修改为ROBOTSTXT_OBEY = False,我们不遵守机器人条约。

  • Header

在setting.py中找到DEFAULT_REQUEST_HEADERS,在里面添加User-Agent, 这个值和浏览器有关,可以在浏览器开发者模式的Network中随便找一个请求,找到其中的Headers选项卡,找到User-Agent,比如我的是

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}

可以将爬取结果保存到文件
只需要修改运行命令

scrapy crawl quteos -o qutoes.csv

在爬取的过程中即可将爬取的数据写入项目根目录的qutoes.csv中,格式是scrapy根据我们的后缀名弄好的,如果后缀名不是csv,是txt或者json,格式都是不一样的。很方便。

写pipeline

我们定义两个pipeline

from scrapy.exceptions import DropItem

class TextLengthPipeline(object):
    def __init__(self):
        self.limit = 50

    def process_item(self, item, spider):
        if item['content']:
            if len(item['content']) > self.limit:
                item['content'] = item['content'][0:self.limit] + '...'
        else:
            return DropItem('Missing Content...')
        return item

class RedisPipeline(object):
    def __init__(self, uri, username, password):
        self.uri = uri
        self.username = username
        self.password = password

    def process_item(self, item, spider):
        print('写入到Redis喽...')

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            uri=crawler.settings.get('URI'),
            username=crawler.settings.get('USERNAME'),
            password=crawler.settings.get('PASSWORD')
        )

    def open_spider(self, spider):
        print('爬虫被初始化...')
        print('uri = ', self.uri)
        print('username = ', self.username)
        print('password = ', self.password)

可以读懂代码,第一个pipeline我想把格言的内容,大于50字符的部分,用...代替,第二个pipeline我想将爬取的数据写入Redis数据库,因为代码较长,所以没有把实现代码列出来。

注意
写完pipeline之后,要在setting.py中打开pipeline

ITEM_PIPELINES = {
    'quotestutorial.pipelines.TextLengthPipeline': 300,
    'quotestutorial.pipelines.RedisPipeline': 400
}

其中的数字,300,400 指的是先后顺序,数字越小,越先执行。

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Scrapy是一个基于Python爬虫框架,它可以帮助我们快速高效地抓取网站数据。在这里,我将介绍Scrapy基本用法,让您能够快速入门。 安装Scrapy ----------------------- 在安装Scrapy之前,我们需要先安装Python。然后,我们可以通过以下命令来安装Scrapy: ``` pip install scrapy ``` 创建Scrapy项目 ----------------------- 创建Scrapy项目的命令是: ``` scrapy startproject project_name ``` 这个命令将会在当前目录下创建一个名为project_name的文件夹,其包含了Scrapy项目的基本结构。 编Spider ----------------------- 在Scrapy,Spider是用来定义爬取网站的规则的。我们可以通过以下命令来创建一个Spider: ``` scrapy genspider spider_name domain_name ``` 其,spider_name是我们自己定义的Spider名称,domain_name是我们要抓取的网站域名。 接下来,我们需要在Spider定义如何爬取网站。这里我们以爬取“http://quotes.toscrape.com/”网站上的名言警句为例。我们可以在Spider定义如下规则: ```python 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) ``` 在上述代码,我们首先定义了Spider的名称,接着定义了我们要爬取的起始URL,最后定义了如何解析网页的函数parse()。在parse()函数,我们使用了Scrapy的选择器来提取网页的名言警句,并将其保存到字典。接着,我们使用response.follow()函数来获取下一页的URL,并继续解析。 运行Spider ----------------------- 要运行我们刚才创建的Spider,我们可以使用以下命令: ``` scrapy crawl spider_name ``` 其,spider_name是我们之前创建的Spider名称。 Scrapy会自动去抓取我们定义的起始URL,并根据我们定义的规则来解析网页。解析成后,Scrapy会将结果保存到我们指定的位置。 总结 ----------------------- Scrapy是一个非常强大的Python爬虫框架,它可以帮助我们快速高效地抓取网站数据。在本教程,我们介绍了Scrapy项目的创建、Spider的定义以及如何运行Spider。如果您想更深入地学习Scrapy,可以参考官方文档:https://docs.scrapy.org/en/latest/。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值