Как проверить, поддерживает ли сайт http, htts и www префикс с помощью scrapy - PullRequest
0 голосов
/ 30 августа 2018

Я использую scrapy, чтобы проверить, нормально ли работает какой-либо веб-сайт, когда я использую http://example.com, https://example.com или http://www.example.com. Когда я создаю запрос Scrapy, он работает нормально. например, на моем page1.com он всегда перенаправляется на https://. Мне нужно получить эту информацию в качестве возвращаемого значения, или есть лучший способ, как получить эту информацию с помощью скрапа?

class myspider(scrapy.Spider):
    name = 'superspider'

    start_urls = [
        "https://page1.com/"
    ]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        url = response.url
        # removing all possible prefixes from url
        for remove in ['https://', 'http://', 'www.']:
            url = str(url).replace(remove, '').rstrip('/')

        # Try with all possible prefixes
        for prefix in ['http://', 'http://www.', 'https://', 'https://www.']:
            yield scrapy.Request(url='{}{}'.format(prefix, url), callback=self.test, dont_filter=True)

    def test(self, response):
        print(response.url, response.status)

Вывод этого паука таков:

https://page1.com 200
https://page1.com/ 200
https://page1.com/ 200
https://page1.com/ 200

Это хорошо, но я хотел бы получить эту информацию в качестве возвращаемого значения, чтобы знать, например, на http указан код ответа 200, а затем сохраните его в словаре для последующей обработки или сохраните как файл json в файл (используя элементы в scrapy).

желаемый результат: Я хотел бы иметь словарь с именем a со всей информацией:

print(a)
{'https://': True, 'http://': True, 'https://www.': True, 'http://www.': True}

Позже я хотел бы собрать больше информации, поэтому мне нужно будет хранить всю информацию под одним объектом / json /...

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вместо использования мета-возможности, на которую указывает eLRuLL, вы можете проанализировать request.url:

scrapy shell http://stackoverflow.com
In [1]: request.url
Out[1]: 'http://stackoverflow.com'

In [2]: response.url
Out[2]: 'https://stackoverflow.com/'

Чтобы хранить значения для разных прогонов вместе в одном dict / json, вы можете использовать дополнительный конвейер, как упомянуто в https://doc.scrapy.org/en/latest/topics/item-pipeline.html#duplicates-filter Итак, у вас есть что-то вроде:

Class WriteAllRequests(object):
    def __init__(self):
        self.urldic={}

    def process_item(self, item, spider):
        urldic[item.url]={item.urlprefix=item.urlstatus}
        if len(urldic[item.url])==4:
            # think this can be passed to a standard pipeline with a higher number
            writedata (urldic[item.url])

            del urldic[item.url]

Необходимо дополнительно активировать конвейер

0 голосов
/ 31 августа 2018

вы делаете один дополнительный запрос в начале паука, и вы можете обработать все эти домены с помощью метода start_requests:

class myspider(scrapy.Spider):
    name = 'superspider'

    def start_requests(self):
        url = response.url
        # removing all possible prefixes from url
        for remove in ['https://', 'http://', 'www.']:
            url = str(url).replace(remove, '').rstrip('/')

        # Try with all possible prefixes
        for prefix in ['http://', 'http://www.', 'https://', 'https://www.']:
            yield scrapy.Request(
                url='{}{}'.format(prefix, url), 
                callback=self.parse, 
                dont_filter=True, 
                meta={'prefix': prefix},
            )

    def parse(self, response):
        yield {response.meta['prefix']: True}

убедитесь, что я использую параметр запроса meta для передачи информации следующему методу обратного вызова, для которого был использован префикс.

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