Scrapy с несколькими страницами - PullRequest
0 голосов
/ 11 сентября 2018

Я создал простой скрап-проект, в котором я получил общий номер страницы с исходного сайта example.com/full. Теперь мне нужно очистить всю страницу, начиная с example.com/page-2 до 100 (если общее количество страниц равно 100). Как я могу это сделать?

Любой совет будет полезен.

Код:

import scrapy


class AllSpider(scrapy.Spider):
    name = 'all'
    allowed_domains = ['example.com']
    start_urls = ['https://example.com/full/']
    total_pages = 0

def parse(self, response):
    total_pages = response.xpath("//body/section/div/section/div/div/ul/li[6]/a/text()").extract_first()
    #urls = ('https://example.com/page-{}'.format(i) for i in range(1,total_pages))
    print(total_pages)

Обновление № 1:

Я пытался использовать это urls = ('https://example.com/page-{}'.format(i) for i in range(1,total_pages)), но оно не работает, может быть, я делаю что-то не так.

Обновление № 2: Я изменил свой код, как этот

class AllSpider(scrapy.Spider):
name = 'all'
allowed_domains = ['sanet.st']
start_urls = ['https://sanet.st/full/']
total_pages = 0

def parse(self, response):
    total_pages = response.xpath("//body/section/div/section/div/div/ul/li[6]/a/text()").extract_first()
    for page in range(2, int(total_pages)):
        url = 'https://sanet.st/page-'+str(page)
        yield scrapy.Request(url)
        title =  response.xpath('//*[@class="list_item_title"]/h2/a/span/text()').extract()
        print(title)

Но, тем не менее, цикл постоянно показывает только заголовок первой страницы Мне нужно извлечь заголовок с разных страниц и распечатать его в командной строке. Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

альтернативный способ, показанный в руководстве , заключается в использовании yield response.follow(url, callback=self.parse_page), и он напрямую поддерживает относительные URL.

0 голосов
/ 12 сентября 2018

Вы должны найти объект 'next_page' и продолжить цикл, пока он находится на странице.

img with next_page element

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request


class SanetSpider(scrapy.Spider):
    name = 'sanet'
    allowed_domains = ['sanet.st']
    start_urls = ['https://sanet.st/full/']

    def parse(self, response):
        yield {
            # Do something.
            'result': response.xpath('//h3[@class="posts-results"]/text()').extract_first()
        }

        # next_page = /page-{}/ where {} number of page.
        next_page = response.xpath('//a[@data-tip="Next page"]/@href').extract_first()

        # next_page = https://sanet.st/page-{}/ where {} number of page.
        next_page = response.urljoin(next_page)

        # If next_page have value
        if next_page:
            # Recall parse with url https://sanet.st/page-{}/ where {} number of page.
            yield scrapy.Request(url=next_page, callback=self.parse)

Если вы запуститеэтот код с ключом "-o sanet.json" даст следующий результат.

scrapy runspider sanet.py -o sanet.json

[
{"result": "results 1 - 15 from 651"},
{"result": "results 16 - 30 from 651"},
{"result": "results 31 - 45 from 651"},
...
etc.
...
{"result": "results 631 - 645 from 651"},
{"result": "results 646 - 651 from 651"}
]
0 голосов
/ 11 сентября 2018
from scrapy.http import Request


def parse(self, response):
    total_pages = response.xpath("//body/section/div/section/div/div/ul/li[6]/a/text()").extract_first()
    urls = ('https://example.com/page-{}'.format(i) for i in range(1,total_pages))
    for url in urls:
        yield Request(url, callback=self.parse_page)

def parse_page(self, response):
    # do the stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...