Сканер Scrapy для возврата только URL и реферера при сканировании - PullRequest
0 голосов
/ 31 октября 2019

Я ОЧЕНЬ новичок в scrapy, только что нашел его вчера и имею только базовый опыт работы с Python.

У меня есть группа поддоменов (около 200), которые мне нужно сопоставить, каждая внутренняя и внешняя ссылка,

Я просто не понимаю сторону вывода вещей, которые я думаю.

Это то, что я имею до сих пор.

import scrapy

class LinkSpider(scrapy.Spider):
    name = 'links'

    allowed_domains = ['example.com']
    start_urls = ['https://www.example.com/']

    def parse(self, response):
        # follow all links
        for href in response.css('a::attr(href)'):
            yield response.follow(href, self.parse)

это выводит на терминал, как так:

DEBUG: Crawled (200) <GET http://www.example.com/> (referer: None)
DEBUG: Crawled (200) <GET http://www.example.com/aaa/A-content-page> (referer: http://www.example.com/)
DEBUG: Crawled (200) <GET http://aaa.example.com/bbb/something/> (referer: http://www.example.com/)

Что мне нужно, так это CSV или TSV

URL                                         Referer
http://www.example.com/                     None
http://www.example.com/aaa/A-content-page   http://www.example.com/
http://aaa.example.com/bbb/something/       http://www.example.com/
http://aaa.example.com/bbb/another/         http://aaa.example.com/bbb/something/

Любая помощь приветствуется, но я бы предпочел направление в документы, чем прямое решение.

Это решение, которое я придумал.

    def parse(self, response):
        filename = "output.tsv"
        f = open(filename, 'w')
        f.write("URL\tLink\tReferer\n")
        f.close()
        # follow all links
        for href in response.css('a::attr(href)'):            
            yield response.follow(href, self.parse)
            with open(filename, 'a') as f:
                url = response.url
                links = response.css('a::attr(href)').getall()
                referer = response.request.headers.get('referer', None).decode('utf-8')
                for item in links:
                    f.write("{0}\t{1}\t{2}\n".format(url, item, referer))

        f.close()

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Вы можете получить оба URL просто в разборе.

referer = response.request.headers.get('Referer') original_url = response.url

yield {'referer': referer, 'url': original_url}

Вы можете записать вывод в файл, используя

scrapy crawl spider_name -o bettybarclay.json

0 голосов
/ 31 октября 2019

Хотя это не на 100% правильно, это хорошее начало.

    def parse(self, response):
    filename = "output.tsv"
    # follow all links
    for href in response.css('a::attr(href)'):            
        yield response.follow(href, self.parse)
        with open(filename, 'a') as f:
            links = response.css('a::attr(href)').getall()
            referer = response.request.headers.get('Referer', None)
            for item in links:
                f.write("{0}\t{1}\n".format(item, referer))
...