微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

爬虫 - scrapy 框架 - 基本爬取流程

目录

一、项目启动

二、Item 指定对象内容 - 类比 ORM

三、Spider 爬取数据

四、执行爬虫

五、pipeline 数据数据库存储

5-1 存储

5-2 配置参数

5-3 激活管道


scrapy - 官方1.6版本文档

一、项目启动

scrapy 入门教程

确认环境

创建 scrapy 项目目录

进入自定义目录创建项目目录
scrapy startproject yourprojectname

 

二、Item 指定对象内容 - 类比 ORM

类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个 Item。

用于将数据封装成类,在其他地方进行基于类的快速调用

import scrapy
​
class GetBabtItem(scrapy.Item):
    title = scrapy.Field()
    content = scrapy.Field()
    time = scrapy.Field()
    wherefrom = scrapy.Field()

 

三、Spider 爬取数据

Spiders/爬虫脚本.py - 制作爬虫爬取网页

注意点总结

  • scrapy.Spider 类内 name 属性必须重写,且值唯一
  • scrapy.Spider 类内 parse() 方法必须重写,作为爬取数据的处理函数
import scrapy
​
​
class BabtSpider(scrapy.Spider):
    # 必须为每一个Spider脚本重写name属性,且必须唯一
    name = 'Babt'
​
    # 爬虫爬取数据 url 列表
    start_urls = [
        'https://www.8btc.com/flash'
    ]
​
    # 必须重写!! 不然设置报错
    def parse(self, response):
        '''
        对爬取数据的业务逻辑处理
        :param response: urls列表的爬取数据
        :return:
        '''
        print(response)
​

 

四、执行爬虫

import scrapy
from bs4 import BeautifulSoup
​
from myscrapy.items import GetBabtItem
​
​
class BabtSpider(scrapy.Spider):
    # 必须为每一个Spider脚本重写name属性,且必须唯一
    name = 'Babt'
​
    # 爬虫爬取数据 url 列表
    start_urls = [
        'https://www.8btc.com/flash'
    ]
​
    # 必须重写!! 不然设置报错
    def parse(self, response):
        '''
        对爬取数据的业务逻辑处理
        Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给 spider parse() 方法。
        :param response: urls列表的爬取数据
        :return:
        '''
        # print('===============爬取对象============', response)
        # print('==============爬取网址内容==============', response.body)
        # print('==============获取爬取网址================', response.url)
        # print('=============基于xpath的数据获取===============', response.xpath('//ul/li/text()').extract())
​
        body = str(response.body, encoding='utf-8')
        babt = BeautifulSoup(body, 'lxml')
        flash_li = babt.find_all('li', class_='flash-item')
​
        for flash in flash_li:
            flash_content = flash.find('div', class_='flash-item__content')
            title = flash_content.find_prevIoUs_sibling('a').span.text.strip(' ')
            content = flash_content.text
            time = flash_content.find_prevIoUs_sibling('span').text
            wherefrom = flash.find('span', class_='operate-item operate-item__source').a.text.strip(' ')
​
            item = GetBabtItem()
            item['time'] = time
            item['wherefrom'] = wherefrom
            item['title'] = title
            item['content'] = content
            yield item
​

 

五、pipeline 数据数据库存储

官方文档 - pipeline

5-1 存储

# pipelines.py
import pymongo
import time
​
class MongoPipeline(object):
    collection_name = 'scrapy_items'
​
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
​
    # 创建管道实例 crawler,必须返回管道的新实例
    @classmethod
    def from_crawler(cls, crawler):
        '''
        :param crawler: Crawlerobject - 使用此管道的爬网程序
        :return:
        '''
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )
​
    # 当打开spider时,被调用
    # 执行爬虫时建立数据库连接
    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
​
    # 关闭spider时,被调用
    # 关闭爬虫时关闭连接
    def close_spider(self, spider):
        self.client.close()
​
    # 必重写
    def process_item(self, item, spider):
        '''
        业务逻辑处理
         - 去重
         - 存储
        :param item: item对象
        :param spider: spider对象
        :return:
        '''
        today = time.strftime('%Y/%m/%d')
        self.db[today].insert_one(dict(item))
        return item

5-2 配置参数

MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'crawlers'

5-3 激活管道

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐