Где добавить request.meta в мой скрипт, чтобы один раз сканировать - PullRequest
0 голосов
/ 22 апреля 2020

Я скачал scrapy-crawl-Once и пытаюсь запустить его в своей программе. Я хочу вычеркнуть URL каждой книги с первой страницы http://books.toscrape.com/, а затем вычеркнуть название книги из этого URL. Я знаю, что могу вычеркнуть название каждой книги с первой страницы, но в качестве практики для scrapy-crawl-Once, я хотел сделать это таким образом. Я уже добавил промежуточное программное обеспечение и должен знать, куда добавить request.meta. Проведя некоторые исследования, не так уж много кодов для примера руководства, поэтому я надеялся, что кто-то может помочь здесь. Я выучил основы python двух недель go, так изо всех сил прямо сейчас. Я пробовал это, но результаты не изменились. Может кто-нибудь помочь мне, пожалуйста. Я добавил [: 2], чтобы, изменив его на [: 3], я мог показать, что он работает.

def parse(self, response):
    all_the_books = response.xpath("//article[@class='product_pod']")
    for div in all_the_books[:2]:
        book_link = 'http://books.toscrape.com/' + div.xpath(".//h3/a/@href").get()
        request = scrapy.Request(book_link, self.parse_book)
        request.meta['book_link'] = book_link
        yield request

def parse_book(self, response):
    name = response.xpath("//div[@class='col-sm-6 product_main']/h1/text()").get()
    yield {
        'name': name,
    }

1 Ответ

0 голосов
/ 23 апреля 2020

В его документах написано

Чтобы избежать многократного сканирования определенной страницы, установите request.meta ['crawl_once'] = True

, поэтому вам нужно сделать

def parse(self, response):
    all_the_books = response.xpath("//article[@class='product_pod']")
    for div in all_the_books[:2]:
        book_link = 'http://books.toscrape.com/' + div.xpath(".//h3/a/@href").get()
        request = scrapy.Request(book_link, self.parse_book)
        request.meta['crawl_once'] = True
        yield request

И эта ссылка не будет сканироваться снова

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