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全站爬取