Я хочу использовать 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-адреса. Но я думаю, что, возможно, здесь что-то не так, что мешает этому произойти.