Python爬虫——Scrapy框架的基本使用

目录

1.选取目标站点

目标站点分析

2.流程框架

3.爬虫实战

创建项目

创建spider

输出调试信息

4.抓取:

1.分析源代码

2.爬取中的存储(数据结构)

3.定义解析的方法

3.命令行交互模式

4.赋值

5.翻页

6.保存


1.选取目标站点

目标站点分析

http://quotes.toscrape.com/:scrapy官方提供的抓取网站

显示名人名言,作者,标签等信息

翻页为最简单的GET请求,通过改变URL的名称进行翻页

网页结构简单,没有任何的反爬虫措施

2.流程框架

抓取第一页

请求第一页的URL并得到源代码,进行下一步的分析

获取内容和下一页链接

分析源代码,提取首页内容,获取下一页链接等待进一步获取

翻页提取

请求下一页信息,分析内容并请求再下一页链接

保存爬取结果

将爬取结果保存为特定格式如文本,数据库

3.爬虫实战

在命令行中输入scrapy会输出提示

创建项目

scrapy startproject quotetutorial

会在当前目录生成项目文件

cd quotetutorial 进入项目文件夹

scrapy.cfg:配置文件,定义scrapy一些相关的部署信息

创建spider

scrapy genspider quotes quotes.toscrape.com

quotes:spider名称

quotes.toscrape.com:需要爬取网站的域名

scrapy.cfg

items.py:保存数据的数据结构

middlewares.py:在爬取过程中定义的中间件,用来处理request,response和exceptions等操作,可以在其中修改request,response和exceptions的相关配置

pipelines.py:项目管道,用来输出一些items

settings.py:定义配置信息

主要运行代码在spiders文件夹中

解析的操作在parse函数中

 

scrapy crawl quotes:执行spider

输出调试信息

info:提示信息

scrapy.utils.log:显示已启动

2019-06-01 19:34:39 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: firstscrapy)

scrapy.crawler:settings

Overridden settings: {'BOT_NAME': 'firstscrapy', 'NEWSPIDER_MODULE': 'firstscrapy.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['firstscrapy.spiders']}

scrapy.middleware:中间件(下载中间件:downloadermiddlewares;爬虫中间件:spidermiddlewares)

INFO: Spider opened:调用spider,开始抓取

2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)

2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/> (referer: None)

首先寻找robots.txt,没有返回状态码404,随后访问主页正常为200

statscollectors:输出爬取信息

 

quotes.py

改写代码:parse:请求完成后默认调用的方法/默认回调

eg:

def parse(self, response):
        print(response.text)

请求成功后将response的内容打印出来

4.抓取:

1.分析源代码

内容:text

作者:author

标签:tags(tags数量不固定,有几个抓几个)

2.爬取中的存储(数据结构)

items.py

定义field变量赋值,作为一个整体生成

3.定义解析的方法

quotes.py

11:定义选择每个区块

之后遍历每个区块,进一步筛选

13:声明对象

::text:选择标签内的文本内容

extract_first():拿到里面的文本内容

extract():把所有结果都找出来,类似于find和findall

3.命令行交互模式

scrapy shell quotes.toscrape.com

进入到交互模式下,可以进行一些相关的调试

爬取到的quotes为list格式,每一项为selector选择器    

同为list

同为list,data类型为str

返回列表,内容为文本

返回第一个值

若为tags,就需要用extract()获取所有的标签

4.赋值

item['text'] = text
item['author'] = author
item['tags'] = tags
yield item#将item生成出来

再次运行,即可完成单页索引信息的爬取

5.翻页

1.可通过改变URL来完成翻页

2.在next中对应着下一页的超链接,从网页代码中获取

提取:

next = response.css('.pager .next a::attr(href)').extract_first()

attr():获取属性的内容

补全为完整的URL:

url = response.urljoin(next)

urljoin():补全URL

生成request,实现翻页循环:

url = response.urljoin(next)

callback:回调函数,定义response请求之后谁来处理

6.保存

保存为json格式

scrapy crawl quotes -o quotes.json

生成json文件并保存在项目目录下

保存为jl格式

scrapy crawl quotes -o quotes.jl

将结果保存为一行一行的格式,一行为一个item

保存为csv格式

scrapy crawl quotes -o quotes.csv

保存为xml格式

scrapy crawl quotes -o quotes.xml

其他格式同改后缀即可,如pickle,marshal等

保存至FTP服务器

scrapy crawl quotes -o ftp://user:pass@ftp.example.com/path/quotes.csv

pipelines

在保存前需要做item的处理,如在解析完后有些item不是我们想要的,如要将item保存到数据库里需要借助pipelines工具。

eg:限制名言的长度,如果大于50将后面的变为省略号

pipelines.py

class TextPipeline(object):

    def __init__(self):
        self.limit = 50

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

保存至MongoDB数据库

pipelines中:

class MongoPipeline(object):

    def __init__(self):
        self.mongo_uri = 'localhost'
        self.mongo_db = 'quotestutorial'

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

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

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

settings.py中:

ITEM_PIPELINES = {
    'firstscrapy.pipelines.TextPipeline': 300,
    'firstscrapy.pipelines.MongoPipeline': 400,
}

保存结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值