сайт рекурсивного скрапа - PullRequest
0 голосов
/ 23 мая 2018

Я хочу написать скребок, который посещает все подстраницы начальной страницы.

Пример веб-сайта: pydro.com Так, например, он также должен извлечь pydro.com / impressionum и сохраните его в виде html-файла на моем жестком диске.

Код, который я написал:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.exporters import CsvItemExporter
from scrapy.loader import ItemLoader
from finalproject.items import FinalprojectItem


class ExampleSpider(CrawlSpider):
    name = "projects"  # Spider name
    allowed_domains = ["pydro.com"]  # Which (sub-)domains shall be scraped?
    start_urls = ["https://pydro.com/"]  # Start with this one
    rules = [Rule(LinkExtractor(), callback='parse_item', follow=True)]  # Follow any link scrapy finds (that is allowed).

    def parse_item(self, response):
        print('Got a response from %s.' % response.url)
        self.logger.info('Hi this is an item page! %s', response.url)
        page = response.url.split('.com/')[-1]
        filename = 'pydro.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

Когда я запускаю своего паука, вывод только pydro.html.

Я думаю, мне нужно изменить имя файла, чтобы я получил подстраницу.Или мне нужен цикл for?

EDIT1: я отредактировал код, чтобы получить все HTML-страницы.Но когда я хочу запустить скрипт на другом сайте, я получаю сообщение об ошибке:

FileNotFoundError: [Errno 2] No such file or directory: 'otego-https://www.otego.de/de/jobs.php'

Вот сценарий, который я запускаю:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.exporters import CsvItemExporter
from scrapy.loader import ItemLoader

class ExampleSpider(CrawlSpider):
    name = "otego" #Spider name
    allowed_domains = ["otego.de"] # Which (sub-)domains shall be scraped?
    start_urls = ["https://www.otego.de/en/index.php"] # Start with this one
    rules = [Rule(LinkExtractor(), callback='parse_item', follow=True)] # Follow any link scrapy finds (that is allowed).

def parse_item(self, response):
    print('Got a response from %s.' % response.url)
    self.logger.info('Hi this is an item page! %s', response.url)
    page = response.url
    filename = 'otego-%s' % page
    with open(filename, 'wb') as f:
        f.write(response.body)
    self.log('Saved file %s' % filename)

1 Ответ

0 голосов
/ 23 мая 2018

Вам нужно создать рекурсивный соскоб.«Подстраница» - это просто другая страница, URL которой получен с «предыдущей» страницы.Вы должны сделать второй запрос к подстранице (ее URL должен быть в переменной sel) и использовать xpath в ответе (2nd).

Как рекурсивно сканировать подстраницы с помощью Scrapy

...