Перед сканированием с помощью Scrapy проверьте, существует ли URL в файле - PullRequest
1 голос
/ 10 марта 2019

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

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

Таким образом, сканер проверяет веб-сайт, извлекает элементы ответа , проверяет, существует ли извлеченный 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)

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

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

1 Ответ

0 голосов
/ 13 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...