#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