Scrapy с LinkExtractor не извлекает ссылки с сайта - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь сканировать веб-сайт для вывода всех ссылок из определенной ссылки, используя функцию LinkExtractor.

Scrapy не выводит ссылки на некоторые сайты. Например, если я попробую эту ссылку https://blog.nus.edu.sg,, похоже, она будет работать. Но не для http://nus.edu.sg

Все эти ссылки дают работающий сайт. Я попытался посмотреть на исходный код обоих сайтов, и оба выглядят одинаково с точки зрения того, как они ссылаются на другие сайты

Это мой гусеничный

class Crawler(scrapy.Spider):
    name = 'all'

    def __init__(self, startURL):
        self.links=[]
        self.start_urls = [startURL]

    custom_settings = {
        'LOG_LEVEL': logging.WARNING,
        'DEPTH_LEVEL': 1
    }

    def parse(self, response):
        le = LinkExtractor()
        print(le)
        for link in le.extract_links(response):
            print(link.url)

где он вызывается с использованием следующей функции

def _getLinksDriver(url):


    header = {'USER_AGENT': agent} #agent is some user agent previously defined
    process = CrawlerProcess(header)
    process.crawl(Crawler, url)

    process.start(stop_after_crawl=True)

Например, если я попробовал _getLinksDriver("http://nus.edu.sg")

Выход просто

2019-06-11 11:42:22 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: scrapybot)
2019-06-11 11:42:22 [scrapy.utils.log] INFO: Versions: lxml 4.3.3.0, libxml2 2.9.9, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 19.2.0, Python 3.6.7 (default, Oct 22 2018, 11:32:17) - [GCC 8.2.0], pyOpenSSL 19.0.0 (OpenSSL 1.1.1b  26 Feb 2019), cryptography 2.6.1, Platform Linux-4.18.0-21-generic-x86_64-with-Ubuntu-18.04-bionic
2019-06-11 11:42:22 [scrapy.crawler] INFO: Overridden settings: {'LOG_LEVEL': 30, 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'}
<scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor object at 0x7fc45fbbac18>

Тем не менее, если мы перейдем к реальному сайту, на него явно будут ссылки.

Попытка _getLinksDriver("https://blog.nus.edu.sg") дает

2019-06-11 11:38:20 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: scrapybot)
2019-06-11 11:38:20 [scrapy.utils.log] INFO: Versions: lxml 4.3.3.0, libxml2 2.9.9, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 19.2.0, Python 3.6.7 (default, Oct 22 2018, 11:32:17) - [GCC 8.2.0], pyOpenSSL 19.0.0 (OpenSSL 1.1.1b  26 Feb 2019), cryptography 2.6.1, Platform Linux-4.18.0-21-generic-x86_64-with-Ubuntu-18.04-bionic
2019-06-11 11:38:20 [scrapy.crawler] INFO: Overridden settings: {'LOG_LEVEL': 30, 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'}
<scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor object at 0x7fc4605bcb38>
https://blog.nus.edu.sg#main
https://blog.nus.edu.sg/
http://blog.nus.edu.sg/
https://wiki.nus.edu.sg/display/cit/Blog.nus+Common+Queries
http://help.edublogs.org/user-guide/
https://wiki.nus.edu.sg/display/cit/Blog.nus+Terms+of+Use
https://wiki.nus.edu.sg/display/cit/Blog.nus+Disclaimers
https://blog.nus.edu.sg/wp-signup.php
http://twitter.com/nuscit
http://facebook.com/nuscit
https://blog.nus.edu.sg#scroll-top
http://cyberchimps.com/responsive-theme/
http://wordpress.org/
http://cit.nus.edu.sg/
http://www.nus.edu.sg/
http://www.statcounter.com/wordpress.org/
https://blog.nus.edu.sg#wp-toolbar
https://blog.nus.edu.sg/wp-login.php?redirect_to=https%3A%2F%2Fblog.nus.edu.sg%2F

что я и надеюсь увидеть.

Как мне сделать эту работу для всех сайтов?

Спасибо

Если это поможет, моя версия Scrapy, Python и все его зависимости

2019-06-11 11:42:12 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: scrapybot)
2019-06-11 11:42:12 [scrapy.utils.log] INFO: Versions: lxml 4.3.3.0, libxml2 2.9.9, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 19.2.0, Python 3.6.7 (default, Oct 22 2018, 11:32:17) - [GCC 8.2.0], pyOpenSSL 19.0.0 (OpenSSL 1.1.1b  26 Feb 2019), cryptography 2.6.1, Platform Linux-4.18.0-21-generic-x86_64-with-Ubuntu-18.04-bionic

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Простая причина, по которой ваш код не работает для вышеуказанного веб-сайта (http://nus.edu.sg/), заключается в Incapsula .

Если вы отметите response.body, вы найдете что-то вроде этого:

Request unsuccessful. Incapsula incident ID: 432001820008199878-98367043303115621
0 голосов
/ 17 июня 2019

просто аддон к ответу на gangabass (поэтому просьба принять его ):

, как упоминал gangabass http://nus.edu.sg защищен от ботов инкапсулами.Scrap получает следующее (curl 'http://nus.edu.sg/'):

<html>
<head>
<META NAME="robots" CONTENT="noindex,nofollow">
<script src="/_Incapsula_Resource?SWJIYLWA=5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3">
</script>
<body>
</body></html>

Фактический контент загружается через JavaScript (который Scrapy не выполняет).Если вы хотите выполнить javascript, вы можете использовать scrapy-splash: https://github.com/scrapy-plugins/scrapy-splash

К сожалению, это сложнее (но это именно то, чего хочет владелец сайта).Если вы хотите быть дружелюбным, вы не сканируете эти страницы (https://blog.scrapinghub.com/2016/08/25/how-to-crawl-the-web-politely-with-scrapy)

...