Проверьте, существует ли URL в файле перед сканированием с помощью Scrapy

#python #scrapy

#python #scrapy

Вопрос:

Я хочу использовать Scrapy для обхода данных веб-сайта. В содержимом каждой страницы есть элемент, который является URL.

Поскольку на веб-сайте слишком много страниц, я хочу сканировать только те страницы, которые содержат URL, указанный мной в текстовом файле.

Итак, поисковый робот проверяет веб-сайт, извлекает элементы ответа, проверяет, существует ли извлеченный URL-адрес из содержимого страницы в этом файле, сохраняет данные ответа в файл JSON.

Вот что я до сих пор :

 import scrapy
import json
import uuid
import os
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class ItemSpider(CrawlSpider):
    name = "items"
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/template/template1.html']
    rules = (Rule(LxmlLinkExtractor(allow = (), canonicalize=True, unique=True), callback = 'parse_obj', follow = True), )
    def parse_obj(self, response):
        for link in LxmlLinkExtractor(allow = self.allowed_domains, canonicalize=True, unique=True).extract_links(response):
            with open("urls.txt", "r") as checkfile:
                if response.xpath("//a[contains(text(),'example2.net')]/text()").extract() in checkfile.readlines():
                    response_obj = {}
                    counter = 1
                    for item in response.css("#dle-content"):
                        title = item.css(".storytitle::text").extract()
                        title_name = title[0]
                        response_obj[counter] = {
                        'demo': item.xpath("//a[contains(text(),'example2.net')]/text()").extract(),
                        'websiteurl': response.url,
                        'date': item.css(".copy > a:first-child::text").extract(),
                        }
                    counter  = 1
                    filename = str(uuid.uuid4())   ".json"
                    with open(os.path.join('C:/scrapy/tutorial/result/', filename), 'w') as fp:
                        json.dump(response_obj, fp)
  

Вторая проблема:
Кажется, что сканер не прекращает сканирование. На веб-сайте не так много страниц, которые этот сканер сохраняет как результаты. Это вообще не останавливается, сгенерировано более 150 Тыс. файлов результатов, после чего я сам остановил команду.

Я думаю, что это повторный поиск результатов. Я прав? Я знаю, что scrapy не будет сканировать уже просмотренные URL-адреса.Но я думаю, возможно, здесь что-то не так, что мешает этому произойти.

Ответ №1:

Рассматривали ли вы возможность сохранения URL-адресов, которые вы хотите очистить, в базе данных и передачи их в качестве начальных URL-адресов?

Комментарии:

1. Вы получили то, что я просил? URL-адреса для очистки полностью отличаются от URL-адресов, которые я хочу проверить, существуют ли. Например, это URL, который я хочу очистить: example.com/blahblah и это URL, который извлекается при очистке, и я хочу проверить после очистки, доступен ли он в файле (urls.txt ) : demo.com/anotherblahbalh