Scrapy从json文件加载解析规则,使一个爬虫重复使用.并进行数据清洗

我们在scrapy框架做爬虫的时候,对于不同规则的页面,需要写不同的爬虫文件,在这种情况下,部分代码需要重复书写很不方便,对于这种问题.我们可以通过json文件加载解析规则的方法,来解决这样个问题.
同时在爬取到的数据中也有一些数据是我们不需要的,同时数据的类型/格式也可能不是我们需要的.需要对数据进行清洗整合才能达到我们的需求,并保存.
1.创建一个json文件,并把页面的解析规则写入json文件.

{
    "title":"tr#places_country__row td.w2p_fw::text",
    "population":"tr#places_population__row td.w2p_fw::text"
}

2.创建爬虫.

# -*- coding: utf-8 -*-
import scrapy
import json
from scrapy import Request
from country_spider.items import CountryItem
from country_spider.items import CountryItemLoader


class CountrySpider(scrapy.Spider):
    name = 'country'
    allowed_domains = ['example.com']

    def __init__(self):
        self.urls = ['http://example.webscraping.com/places/default/view/China-47']

    def start_requests(self):
        for url_str in self.urls:
            yield Request(url_str, callback=self.parse, dont_filter=True)

    def parse(self, response):
        item = CountryItemLoader(item=CountryItem(), response=response)

        # 从json文件加载解析规则
        with open("json文件路径", "r", encoding="utf8") as fp:
            datas = json.load(fp)
        for key in datas:
            item.add_css(key, datas[key])

        # 添加相应字段的解析规则
        # 可以使用item.add_xpath / item.add_css    
        # item.add_css("title","tr#places_country__row td.w2p_fw::text")
        # item.add_css("population","tr#places_population__row td.w2p_fw::text")
        return item.load_item()

3.在item中对爬取数据进行清洗

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

from scrapy.loader import ItemLoader
from scrapy.item import Item
from scrapy import Field
from scrapy.loader.processors import MapCompose, TakeFirst, Join


def str_convert(value):
    return "country_" + value


def get_nums(value):
    return value.replace(",", "")


class CountryItemLoader(ItemLoader):
    # TakeFirst 取出数组中的第一个(相当于extract_first)
    # 定义一个默认的输出处理器
    default_output_processor = TakeFirst()


class CountryItem(Item):
    # 定义一个输入处理器,这里将处理函数映射到函数str_convent,进行数据清洗
    title = Field(
        input_processor=MapCompose(str_convert),
    )
    population = Field(
        input_processor=MapCompose(get_nums),
    )

4.在pipelines中对数据进行保存


class CountrySpiderPipeline(object):
    def process_item(self, item, spider):
        print("#" * 50)
        print("item name is ::", item["title"])
        print("item content is ::", item["population"])
        print("#" * 50)
        return item

最后爬虫的起始url也可以通过json加载,在这里就不写了,参考解析规则就可轻松实现.

猜你喜欢

转载自blog.csdn.net/qq_42827960/article/details/84589081
今日推荐