Я только начал использовать Scrapy. Мне удалось успешно написать и запустить scrapy.Spider, но при этом возникли проблемы, поэтому я начал изучать CrawlSpider.
К сожалению, когда я хочу запустить CrawlSpider с помощью Spyder, скрипт запускается и завершается без исключение и ничего не поцарапав. Не уверен, почему это происходит.
Следующий сценарий работает, но выдает исключения для некоторых страниц, которые я не смог исправить. Кроме того, поскольку нет внутренних правил, первый пакет ссылок не фильтруется и, следовательно, попробуйте очистить ссылки, которые ссылаются на файлы, такие как PDF.
import scrapy
from scrapy.crawler import CrawlerProcess
import re
class ScraperWithLimit(scrapy.Spider):
name = "ScraperWithLimit"
allowed_domains = ['wordperfect.com']
start_urls = [
'https://www.wordperfect.com/en/'
]
custom_settings = {
'DEPTH_LIMIT': 5
}
def parse(self, response):
#for next_page in response.css('a'):
for next_page in response.selector.xpath('//a[not(contains(@href, "#")) and not(contains(@href, "mailto"))and not(contains(@href, "javascript")) and string-length(normalize-space(@href)) > 0]'):
if next_page is not None:
m = re.search(r"""(?i)\.(?:mng|pct|bmp|gif|jpg|jpeg|png|pst|psp|tif|tiff|ai|drw|dxf|eps|ps|svg|mp3|wma|ogg|wav|ra|aac|mid|au|aiff|3gp|asf|asx|avi|mov|mp4|mpg|qt|rm|swf|wmv|m4a|m4v|xls|xlsx|ppt|pptx|pps|doc|docx|odt|ods|odg|odp|css|pdf|exe|bin|rss|zip|rar)$""", next_page.get())
if m == None:
yield response.follow(next_page, self.parse)
body_text_list_raw = response.selector.xpath('//body//text()[not(parent::script) and not(parent::noscript) and string-length(normalize-space(.)) > 0]').getall()
body_text_list = [re.sub(r"\s\s+", " ", re.sub(r"(?:\\(?:r|n|t|f|v))+", "", i)).strip() for i in body_text_list_raw]
body_text_full = ' '.join(body_text_list)
obj = {"url": response.request.url}
obj['output'] = {"body_text_list": body_text_list,
"body_text_full": body_text_full}
yield obj
process = CrawlerProcess(settings={
"FEEDS": {
"items.json": {"format": "json"},
},
})
process.crawl(ScraperWithLimit)
process.start() # the script will block here until the crawling is finished
Когда я запускаю тот же код с помощью CrawlSpider, он инициирует , записывает несколько строк журнала и завершает работу, ничего не делая. Понятия не имею, почему:
import scrapy
from scrapy.crawler import CrawlerProcess
import re
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'crawler'
allowed_domains = ['wordperfect.com']
start_urls = ['https://www.wordperfect.com/en/']
custom_settings = {
'DEPTH_LIMIT': 5
}
rules = (
Rule(LinkExtractor(deny=('(?:#|^mailto|javascript)'), deny_extensions=()), callback='parse_item', follow=True)
)
def parse_item(self, response):
body_text_list_raw = response.selector.xpath('//body//text()[not(parent::script) and not(parent::noscript) and string-length(normalize-space(.)) > 0]').getall()
body_text_list = [re.sub(r"\s\s+", " ", re.sub(r"(?:\\(?:r|n|t|f|v))+", "", i)).strip() for i in body_text_list_raw]
body_text_full = ' '.join(body_text_list)
obj = {"url": response.request.url}
obj['output'] = {"body_text_list": body_text_list,
"body_text_full": body_text_full}
return obj
process = CrawlerProcess(settings={
"FEEDS": {
"items.json": {"format": "json"},
},
})
process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished
Результат:
2020-07-10 07:00:25 [scrapy.utils.log] INFO: Scrapy 2.2.0 started (bot: scrapybot)
2020-07-10 07:00:25 [scrapy.utils.log] INFO: Versions: lxml 4.4.1.0, libxml2 2.9.9, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 20.3.0, Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)], pyOpenSSL 19.0.0 (OpenSSL 1.1.1g 21 Apr 2020), cryptography 2.8, Platform Windows-10-10.0.18362-SP0
2020-07-10 07:00:25 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-07-10 07:00:25 [scrapy.crawler] INFO: Overridden settings:
{}
2020-07-10 07:00:25 [scrapy.extensions.telnet] INFO: Telnet Password: /password/ (not sure what this is...)
2020-07-10 07:00:25 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.feedexport.FeedExporter',
'scrapy.extensions.logstats.LogStats']