Я использую scrapy для извлечения всех сообщений из моего блога. Проблема в том, что я не могу понять, как создать правило, которое читает все сообщения в любой заданной категории блога?
пример: в моем блоге в категории "Настройка среды" 17 сообщений. Таким образом, в коде scrapy я могу жестко закодировать его как данность, но это не очень практичный подход.
start_urls=["https://edumine.wordpress.com/category/ide- configuration/environment-setup/","https://edumine.wordpress.com/category/ide-configuration/environment-setup/page/2/","https://edumine.wordpress.com/category/ide-configuration/environment-setup/page/3/"]
Я читал похожие сообщения, связанные с этим вопросом, размещенные здесь на SO, например 1, 2, 3, 4, 5, 6, 7, но я не могу найти ответ ни в одном из них. Как видите, единственная разница заключается в количестве страниц в приведенных выше URL-адресах. Как я могу написать правило в scrapy, которое может читать все сообщения в блоге в категории. И еще один тривиальный вопрос: как мне настроить паука для сканирования моего блога, чтобы, когда я публикую новую запись в блоге, краулер мог немедленно обнаружить ее и записать в файл.
Это то, что у меня есть для класса пауков
from BlogScraper.items import BlogscraperItem
from scrapy.spiders import CrawlSpider,Rule
from scrapy.selector import Selector
from scrapy.linkextractors import LinkExtractor
from scrapy.http import Request
class MySpider(CrawlSpider):
name = "nextpage" # give your spider a unique name because it will be used for crawling the webpages
#allowed domain restricts the spider crawling
allowed_domains=["https://edumine.wordpress.com/"]
# in start_urls you have to specify the urls to crawl from
start_urls=["https://edumine.wordpress.com/category/ide-configuration/environment-setup/"]
'''
start_urls=["https://edumine.wordpress.com/category/ide-configuration/environment-setup/",
"https://edumine.wordpress.com/category/ide-configuration/environment-setup/page/2/",
"https://edumine.wordpress.com/category/ide-configuration/environment-setup/page/3/"]
rules = [
Rule(SgmlLinkExtractor
(allow=("https://edumine.wordpress.com/category/ide-configuration/environment-setup/\d"),unique=False,follow=True))
]
'''
rules= Rule(LinkExtractor(allow='https://edumine.wordpress.com/category/ide-configuration/environment-setup/page/'),follow=True,callback='parse_page')
def parse_page(self, response):
hxs=Selector(response)
titles = hxs.xpath("//h1[@class='entry-title']")
items = []
with open("itemLog.csv","w") as f:
for title in titles:
item = BlogscraperItem()
item["post_title"] = title.xpath("//h1[@class='entry-title']//text()").extract()
item["post_time"] = title.xpath("//time[@class='entry-date']//text()").extract()
item["text"]=title.xpath("//p//text()").extract()
item["link"] = title.select("a/@href").extract()
items.append(item)
f.write('post title: {0}\n, post_time: {1}\n, post_text: {2}\n'.format(item['post_title'], item['post_time'],item['text']))
print "#### \tTotal number of posts= ",len(items), " in category####"
f.close()
Любая помощь или предложения по ее решению?