Как закончить рекурсию при переходе по набору ссылок для просмотра веб-страниц с использованием Scrapy - PullRequest
0 голосов
/ 10 октября 2019

Моя цель - извлечь как можно больше статей на новостном сайте, перейдя по ссылкам. Однако, после запуска этого кода, кажется, что он никогда не закончится, если я не остановлю его принудительно. Есть ли хорошая стратегия, чтобы закончить эту рекурсию при переходе по ссылкам на сайте? Я также начинаю с определенной страницы статьи, а не с главной страницы сайта.

Во-вторых, что именно делает Scrapy response.urljoin? Любой пример будет оценен!

    class NewsSpider(scrapy.Spider):
        name = "spidy"
        allowed_domains = ["www.news.com"]
        def start_requests(self):
            urls = [
                'https://www.news.com/news/asia-243',
            ]
            for url in urls:
                yield scrapy.Request(url=url, callback=self.parse)

        def parse(self, response):
            for elem in response.css('a::attr(href)').getall():
                if re.search(r'\/news\/[a-zA-Z-]+\d{3}', elem):
                    new_url = response.urljoin(elem)
                    yield scrapy.Request(new_url, callback=self.parse)

            yield {
                'title': response.css('h1::text').get(),
                'full_date' :  response.xpath('//div/time').get(),
                'time_seconds' : response.xpath('//div/seconds').get(),
                'content': response.css('div.inner p::text').getall(),
                'labels': response.css('#topic-tag a::text').getall()
            }

Ответы [ 2 ]

1 голос
/ 11 октября 2019

urljoin (url)

Создает абсолютный URL , комбинируя URL-адрес Ответа с возможным относительным URL-адресом.

scrapy shell https://realpython.com/
In [2]: response.xpath('//a/@href').extract()
Out[2]:
['/',
 '/start-here/',
 '#',
 '/',
 '/courses/',
 '/quizzes/',
 '/learning-paths/',
 '/tutorials/all/',
 '/account/join/',
 '#',
 '/account/join/',
 '/products/python-basics-book/',
 '/products/python-tricks-book/',
 '/products/real-python-course/',
 '/products/managing-python-dependencies/',
 '/products/sublime-python/',
 '/products/pythonic-wallpapers/',

In [5]: asdf = response.xpath('//a/@href').extract()

In [6]: for aqqq in asdf:
    ...:     print(response.urljoin(str(aqqq)))
    ...:
    ...:
https://realpython.com/
https://realpython.com/start-here/
https://realpython.com/
https://realpython.com/
https://realpython.com/courses/
https://realpython.com/quizzes/
https://realpython.com/learning-paths/
https://realpython.com/tutorials/all/
https://realpython.com/account/join/
https://realpython.com/
https://realpython.com/account/join/
https://realpython.com/products/python-basics-book/
1 голос
/ 10 октября 2019

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

scrapy run spider newsspider.py -s CLOSESPIDER_PAGECOUNT=10

response.urljoin, просто оборачивая функцию urllib.parse.urljoin (для python 3!) В стандартной библиотекеПередав response.url в качестве первого аргумента, например,

response.urljoin('xyz')

эквивалентно

urllib.parse.urljoin(response.url, 'xyz')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...