Как отформатировать вывод из Scrapy Crawler - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть веб-сканер, над которым я работаю некоторое время.Я пытаюсь добавить семантический компонент в веб-сканер, и я думаю, что я успешно это сделал, так как мой сканер теперь включает мои ключевые слова в поиск.Я вижу, что это происходит в моем приглашении CMD.Тем не менее, я пытаюсь выяснить, как напечатать два отдельных вывода в два отдельных файла.Для 1 файла мне нужна веб-страница и соответствующее ключевое слово (что я вижу в приглашении CMD).И, во-вторых, мне нужен вывод, который я первоначально извлек из несемантического сканера, который включает для каждой веб-страницы страницы, на которые она ссылается.У меня проблемы с достижением этой цели.

from io import StringIO
from functools import partial
from scrapy.http import Request
from scrapy.spiders import BaseSpider
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.item import Item

def find_all_substrings(string, sub):

    import re
    starts = [match.start() for match in re.finditer(re.escape(sub), string)]
    return starts

class GraphSpider(CrawlSpider):

    name = "examplespider"
    custom_settings = {
    'DEPTH_LIMIT': '2',
    }
    allowed_domains = []
    start_urls = (
        'https://www.exampleurl.com',
    )

    rules = (
        Rule(LinkExtractor(allow=r'/'), callback='check_buzzwords', follow=True),
    )

    crawl_count = 0
    words_found = 0                                 

    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)
        i = dict()
        i['url'] = response.url
        # i['http_status'] = response.status
        llinks=[]
        for anchor in hxs.select('//a[@href]'):
            href=anchor.select('@href').extract()[0]
            if not href.lower().startswith("javascript"):
                i['linkedurl'] = urljoin_rfc(response.url,href)
                yield i

    def check_buzzwords(self, response):

        self.__class__.crawl_count += 1

        crawl_count = self.__class__.crawl_count

        wordlist = [
            "keyword1",
            "keword2"
            ]

        url = response.url
        contenttype = response.headers.get("content-type", "").decode('utf-8').lower()
        data = response.body.decode('utf-8')

        for word in wordlist:
                substrings = find_all_substrings(data, word)
                for pos in substrings:
                        ok = False
                        if not ok:
                                self.__class__.words_found += 1
                                print(word + ";" + url + ";")
        return Item()

    def _requests_to_follow(self, response):
        if getattr(response, "encoding", None) != None:
                return CrawlSpider._requests_to_follow(self, response)
        else:
                return []

    def _response_downloaded(self, response):
        filename = response.url.split("/")[-1] + '.html'
        with open(filename, 'wb') as f:
            f.write(response.body)    
        rule = self._rules[response.meta['rule']]
        return self._parse_response(response, rule.callback, rule.cb_kwargs, rule.follow)

По сути мне нужен CSV-файл с:

Keyword1, website1, # вхождений

keyword1, website2, #вхождений

ключевое слово2, веб-сайт3, количество вхождений

и второй файл CSV с:

веб-сайт1, веб-сайт2

веб-сайт1, веб-сайт3

website2, website4

Я все еще изучаю Python, поэтому я ценю помощь в том, чтобы заставить это работать.

...