Итак, я спустился в кроличью нору и перестроил паука в базовый, а не в ползучий.Я не мог понять, почему в наборе правил LinkEctract не было обратного вызова парсера.
В любом случае я создал функцию cvs_exporter, чтобы лучше управлять выводом.Добавил его и его аргументы в настройки и вуаля.
Паук перемещается по сайту через ту же логику, что и паук "Сканирование", хотя цель указана для URL, а не для широкого сканирования.От "parse_district"> "parse_postions"> наконец до "parse_person", где существуют элементы, которые вы хотите очистить.
#stlSpider.py
import scrapy
from stltoday.items import StltodayItem
class StlspiderSpider(scrapy.Spider):
name = 'stlSpider'
allowed_domains = ['graphics.stltoday.com']
start_urls = ['http://graphics.stltoday.com/apps/payrolls/salaries/teachers/']
def parse(self, response):
for href in response.xpath("//th/a/@href").re(".*/teachers/[0-9]+/"):
yield scrapy.Request(response.urljoin(href),
callback=self.parse_district)
def parse_district(self, response):
for href in response.xpath("//th/a/@href").re(".*position.*"):
yield scrapy.Request(response.urljoin(href),
callback=self.parse_position)
def parse_position(self, response):
for href in response.xpath("//td/a/@href").extract():
yield scrapy.Request(response.urljoin(href),
callback=self.parse_person)
def parse_person(self, response):
item = StltodayItem()
name = response.xpath('//p[@class="table__title"]/text()').extract_first()
row = response.xpath('//th[@scope="row"]')
item["url"] = response.url
item["fullname"] = name
item["district"] = row.xpath('//th[contains(., "District")]/following-sibling::td/text()').extract_first()
item["school"] = row.xpath('//th[contains(., "School")]/following-sibling::td/text()').extract_first()
item["degree"] = row.xpath('//th[contains(., "Degree")]/following-sibling::td/text()').extract_first()
item["salary"] = row.xpath('//th[contains(., "Salary")]/following-sibling::td/text()').extract_first()
item["extcontractpay"] = row.xpath('//th[contains(., "Extended")]/following-sibling::td/text()').extract_first()
item["extraduty"] = row.xpath('//th[contains(., "Extra")]/following-sibling::td/text()').extract_first()
item["totalpay"] = row.xpath('//th[contains(., "Total")]/following-sibling::td/text()').extract_first()
item["yearsindistrict"] = row.xpath('//th[contains(., "Years in district")]/following-sibling::td/text()').extract_first()
item["yearsinmoschools"] = row.xpath('//th[contains(., "Years in MO")]/following-sibling::td/text()').extract_first()
yield item
Детализировал ... items lol
#items.py
import scrapy
class StltodayItem(scrapy.Item):
url = scrapy.Field()
fullname = scrapy.Field()
district = scrapy.Field()
school = scrapy.Field()
degree = scrapy.Field()
salary = scrapy.Field()
extcontractpay = scrapy.Field()
extraduty = scrapy.Field()
totalpay = scrapy.Field()
yearsindistrict = scrapy.Field()
yearsinmoschools = scrapy.Field()
Создан модуль "csv_exporter", в который вы можете обращаться к нему для настройки способа вывода вашего файла, включая установку разделителей и порядка элементов для вывода
#csv_exporter.py
_author_ = 'Erick'
from scrapy.conf import settings
from scrapy.contrib.exporter import CsvItemExporter
class MyProjectCsvItemExporter(CsvItemExporter):
def __init__(self, *args, **kwargs):
delimiter = settings.get('CSV_DELIMITER', ',')
kwargs['delimiter'] = delimiter
fields_to_export = settings.get('FIELDS_TO_EXPORT', [])
if fields_to_export :
kwargs['fields_to_export'] = fields_to_export
super(MyProjectCsvItemExporter, self).__init__(*args, **kwargs)
Включите экспортер в ваш файл settings.py, здесь вы включаете аргументы set ins "csv_exporter", который является разделителем, который вы хотите использовать, и порядок полей (элементов) для экспорта
#settings.py
OT_NAME = 'stltoday'
SPIDER_MODULES = ['stltoday.spiders']
NEWSPIDER_MODULE = 'stltoday.spiders'
FEED_FORMAT = 'csv'
FEED_URI = 'tmp/stltoday1.csv'
FIELDS_TO_EXPORT = ["url", "fullname", "district", "school", "degree", "salary", "extcontractpay", "extraduty", "totalpay", "yearsindistrict", "yearsinmoschools"]
FEED_EXPORTERS = {
'csv': 'stltoday.csv_exporter.MyProjectCsvItemExporter',
}
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'stltoday (+http://www.yourdomain.com)'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
...