爬虫

451次阅读
没有评论

目录

一、项目启动

二、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 激活管道

爬虫

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-25发表,共计3584字。
新手QQ群:570568346,欢迎进群讨论 Python51学习