Я совершенно новичок в scrapy и python, однако мой проект и мои знания успешно развиваются благодаря замечательным людям здесь! Чтобы завершить sh моего паука, мне просто нужно настроить некоторые части URL (например, все URL, содержащие bottom.htm , панель действий или такие как ? ? *), который scrapy следует использовать для фильтрации. Но мне кажется, что я борюсь с синтаксисом регулярных выражений, так что поисковый робот хотя бы бегает по странице, но не фильтрует. Кто-нибудь здесь, чтобы объяснить мне, что я делаю не так?
Вот паук:
import scrapy
from scrapy.loader import ItemLoader
from ..items import NorisbankItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class NorisbankSpider(CrawlSpider):
name = "nbtest"
allowed_domains = ['norisbank.de']
start_urls = ['https://www.norisbank.de']
custom_settings={ 'FEED_URI': "norisbank_%(time)s.json",
'FEED_FORMAT': 'json',
}
rules = (
Rule(
LinkExtractor(allow=(''),
deny=('\*start\.do\?*',
'\*WT\.mc_id*',
'\*.js',
'\*.ico',
'\*_frame\.htm*',
'\*actionbar*',
'\*actionframe*',
'\*bottom\.htm*',
'\*navbar_m\.html',
'\*top\.htm*',
'\*expandsection*\.*',
'\*\?*\?*',
'\*\.xml',
'\*kid=*',
'\*\/dienste\/*',
'\*\.do',
'\*\.db',
'\*redirect',
'\*.html\?pi_*',
),
),
callback='parse_item',
follow=True
),
)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'nbtest-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
#Content Extraction
print(response.url)
l = ItemLoader(NorisbankItem(), response=response)
l.add_xpath('sitename', "//meta[@property='og:site_name']/@content")
l.add_xpath('siteurl', "//link[@rel='canonical']/@href")
l.add_xpath('dbCategory',"//meta[@name='dbCategory']/@content")
l.add_css('title','title::text')
l.add_xpath('descriptions',"normalize-space(//meta[@name='description']/@content)")
l.add_xpath('date',"//meta[@name='date']/@content")
l.add_xpath('version',"//meta[@name='v']/@content")
l.add_xpath('time',"//meta[@name='time']/@content")
l.add_xpath('sitecontent','//body//p//text()')
yield l.load_item()
all_pages = response.xpath('//a[contains(@href, "html")]/@href').getall()
for next_page in all_pages :
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)