欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-09 22:57:45
...

我们在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加载,在这里就不写了,参考解析规则就可轻松实现.

相关标签: scrapy爬虫