• Python3 Scrapy爬虫框架-使用


    • 创建Scrapy项目
    1 # https://github.com/My-Sun-Shine/Python/tree/master/Python3/Scrapy_Learn/Scrapy_A
    2 scrapy startproject Scrapy_A
    • 项目结构:  
      • scrapy.cfg:Scrapy项目的配置文件,定义了项目文件路径、不算
      • Scrapy_A:项目的模块,需要从这里引入
        • spiders:其中包括一个个Spider的实现,每个Spider都有一个文件
        • items.py:定义Item数据结构,存放所有的Item的定义,定义爬取的数据结构
        • middlewares.py:定义爬取时的中间件,定义Spider Middlewares和Downloader Middlewares的实现
        • pipelines.py:定义数据管道,定义Item Pipeline的实现存放所有的Item Pipeline的实现
        • settings.py:定义项目的全局配置
    • 创建爬虫:进入到Scrapy_A文件中,使用命名行创建一个Spider
     1 # 创建quotes.py这个Spider
     2 scrapy genspider quotes quotes.toscrape.com 
     3 # quotes.py
     4 # -*- coding: utf-8 -*-
     5 import scrapy
     6 
     7 class QuotesSpider(scrapy.Spider):
     8     name = 'quotes'                # 项目的唯一名字,区分不同的Spider
     9     allowed_domains = ['quotes.toscrape.com']     # 允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤掉
    10     start_urls = ['http://quotes.toscrape.com/'] # 爬虫启动时爬取的url列表,初始请求由它来定义
    11     
    12     def parse(self, response):    # 该方法负责解析返回的响应、提取数据或者进一步生成要处理的请求
    13         """默认情况下,在start_urls里面的链接构成的请求完成下载执行后,返回的响应就会作为唯一参数传给该函数"""
    14         pass
    • 创建Item:Item是保存爬取数据的容器
    1 # items.py
    2 import scrapy
    3 
    4 class QuoteItem(scrapy.Item):
    5     """创建Item需要继承scrapy.Item类,定义类型scrapy.Field字段"""
    6     text = scrapy.Field()
    7     author = scrapy.Field()
    8     tags = scrapy.Field()
    • 进行爬虫解析,编写QuotesSpider
     1 # quotes.py
     2 import scrapy
     3 from Scrapy_A.items import QuoteItem
     4 
     5 class QuotesSpider(scrapy.Spider):
     6     name = 'quotes'
     7     allowed_domains = ['quotes.toscrape.com']
     8     start_urls = ['http://quotes.toscrape.com/']
     9     
    10     def parse(self, response):
    11         """response是start_urls里面的链接爬取后的结果,使用parse()方法进行解析,使用CSS选择器或者XPath选择器"""
    12         quotes = response.css('.quote')
    13         for quote in quotes:
    14             item = QuoteItem() # 声明数据类Item
    15             # extract_first()方法获取第一个元素;extract()方法获取所有结果组成的列表
    16             item['text'] = quote.css('.text::text').extract_first()
    17             item['text'] = quote.css('.author::text').extract_first()
    18             item['tags'] = quote.css('.tags .tag::text').extract()
    19             yield item
    20             
    21         next_page = response.css('.pager .next a::attr("href")').extract_first() # 获取下一页
    22         url = response.urljoin(next_page)
    23         # url:请求链接;callback:回调函数,当得到url响应的时候,回调parse()方法
    24         yield scrapy.Request(url=url, callback=self.parse)
    • 运行爬虫
     1 scrapy crawl quotes               # 爬取结果显示到控制台上
     2 scrapy crawl quotes -o quotes.json       # 爬取结果保存在JSON文件中
     3 scrapy crawl quotes -o quotes.jl         # 每一个Item输出一行JSON,jl是jsonlines的缩写
     4 scrapy crawl quotes -o quotes.jsonlines  # 每一个Item输出一行JSON
     5 scrapy crawl quotes -o quotes.csv        # 爬取结果保存在CSV文件中
     6 scrapy crawl quotes -o quotes.xml        # 爬取结果保存在XML文件中
     7 scrapy crawl quotes -o quotes.pickle     # 爬取结果保存在Pickle文件中
     8 scrapy crawl quotes -o quotes.marshal    # 爬取结果保存在marshal格式文件中
     9 # ftp远程输出,需要配置用户名,密码,地址,输出路径
    10 scrapy crawl quotes -o ftp://user:pass@ftp.example.com/path/to/quotes.csv
    • 使用Item Pipeline:Item Pipeline为项目管道,当Item生成后,它会自动被传送到Item Pipeline进行处理(清理HTML数据、验证爬取数据、检测爬取字段、查重并丢弃重复内容、将爬取结果保存到数据库)
     1 # pipelines.py
     2 # -*- coding: utf-8 -*-
     3 from scrapy.exceptions import DropItem
     4 import pymongo
     5 
     6 class TextPipeline(object):
     7     def __init__(self):
     8         self.limit = 50
     9         
    10     def process_item(self, item, spider):
    11         """该方法必须返回包含数据的字典或Item对象或者抛出异常;item:每次爬虫生成的Item对象;spider:爬虫实例"""
    12         if item['text']:
    13             if len(item['text']) > self.limit:
    14                 item['text'] = item['text'][0:self.limit].strip() + '...'
    15             return item
    16         else:
    17             return DropItem("Missing Text")
    18         
    19 class MongoPipeline(object): # 存入数据库
    20     def __init__(self, mongo_uri, mongo_db):
    21         self.mongo_uri = mongo_uri  # 链接
    22         self.mongo_db = mongo_db  # 数据库名
    23         
    24     @classmethod  # 标识这是一个依赖注入的方式
    25     def from_crawler(cls, crawler):
    26         """:param crawler: 得到全局配置的每个配置信息来自settings.py"""
    27         return cls(
    28             mongo_uri=crawler.settings.get('MONGO_URI'),
    29             mongo_db=crawler.settings.get('MONGO_DB')
    30         )
    31     
    32     def open_spider(self, spider): # 当爬虫开启的时候,这个方法被调用
    33         self.client = pymongo.MongoClient(self.mongo_uri)
    34         self.db = self.client[self.mongo_db]
    35         
    36     def process_item(self, item, spider): # 实现数据插入
    37         name = item.__class__.__name__
    38         self.db[name].insert(dict(item))
    39         return item
    40     
    41     def close_spider(self, spider): # 爬虫关闭的时候,该方法被调用
    42         self.client.close()
    • 配置对应Item Pipeline的settings.py
    1 # settings.py
    2 # 键名是Pipeline的类名称,键值是调用优先级,数字越小则对应的Pipeline越先被调用
    3 ITEM_PIPELINES = {
    4     'Scrapy_A.pipelines.TextPipeline': 300,
    5     'Scrapy_A.pipelines.MongoPipeline': 400,
    6 }
    7 MONGO_URL = 'localhost'
    8 MONGO_DB = 'Scrapy_A'
    • 再次运行爬虫
    • Spider运行流程:Spider类定义了如何爬取某个网站的流程和解析方式
      • 以初始的URL初始化Request,并设置回调函数,当Request成功请求并返回时,Response生成并作为参数传给该回调函数
      • 在回调函数中分析返回的网页内容,返回的结果有两种形式:一种是解析到的有效结果返回字典或Item对象,它们可以经过处理或者直接保存;另外一种就是解析得到下一页的链接,可以利用该链接构造Request并设置新的回调函数,返回Request等待后续流程
      • 如果返回的是字典或Item对象,通过Feed Exports等组件将返回结果存入到文件,如果设置了Pipline的话,可以使用Pipline处理(如过滤、修正)并保存
      • 如果返回的是Request,那么Request执行成功得到Response之后,Response会被传递给Request中定义的回调函数,在回调函数中可以使用选择器来分析新得到的网页内容,并根据分析的数据生成Item
     
  • 相关阅读:
    Spring的bean管理(注解)
    IOC 和DI的区别
    java spring属性注入
    Java 接口
    JAVA 修饰符
    Day19-File操作-创建 删除,文件过滤
    Eclipse快捷键大全
    Day17总结
    启动人人项目遇到的问题
    Eclipse 各版本号
  • 原文地址:https://www.cnblogs.com/My-Sun-Shine/p/13551128.html
Copyright © 2020-2023  润新知