простая скрапировка на основе https://github.com/scrapy/quotesbot/blob/master/quotesbot/spiders/toscrape-xpath.py не передачи данных с использованием запроса на доход - PullRequest
0 голосов
/ 07 октября 2018

сильный текст Мой код, основанный на примерах, которые я искал, не работал должным образом, поэтому я решил использовать работающую модель, найденную на github: https://github.com/scrapy/quotesbot/blob/master/quotesbot/spiders/toscrape-xpath.py Затем я слегка изменил ее, чтобыпродемонстрировать то, с чем я сталкиваюсь.Приведенный ниже код отлично работает, как и предполагалось, но моя конечная цель - передать очищенные данные из первого «parse» во вторую функцию «parse2», чтобы я мог объединить данные с 2 разных страниц.Но сейчас я хотел начать очень просто, чтобы я мог следить за тем, что происходит, отсюда и сильно раздетый код, приведенный ниже.

# -*- coding: utf-8 -*-
import scrapy
from quotesbot.items import MyItems
from scrapy import Request


class ToScrapeSpiderXPath(scrapy.Spider):
    name = 'toscrape-xpath'
    start_urls = [
    'http://quotes.toscrape.com/',
    ]

def parse(self, response):
    item = MyItems()
    for quote in response.xpath('//div[@class="quote"]'):
            item['tinfo'] = 
quote.xpath('./span[@class="text"]/text()').extract_first()
            yield item 



but then when I modify the code as below:

# -*- coding: utf-8 -*-
import scrapy
from quotesbot.items import MyItems
from scrapy import Request


class ToScrapeSpiderXPath(scrapy.Spider):
    name = 'toscrape-xpath'
    start_urls = [
        'http://quotes.toscrape.com/',
    ]

def parse(self, response):
    item = MyItems()
    for quote in response.xpath('//div[@class="quote"]'):
            item['tinfo'] =  
            quote.xpath('./span[@class="text"]/text()').extract_first()
            yield Request("http://quotes.toscrape.com/", 
    callback=self.parse2, meta={'item':item})

def parse2(self, response):
    item = response.meta['item']
    yield item

У меня есть только один элемент, который помечен, а остальные - дубликаты.Похоже, что parse2 даже не читается.Я играл с отступом и скобками, думая, что мне не хватает чего-то простого, но без особого успеха.Я просмотрел множество примеров, чтобы понять, могу ли я понять, в чем может быть проблема, но я все еще не могу заставить ее работать.Я уверен, что это очень простая проблема для этих гуру, поэтому я кричу "Помогите!"кто-нибудь!

также мой файл items.py выглядит так, как показано ниже, и я думаю, что эти два файла items.py и toscrape-xpath.py - единственные в действии, насколько я могу судить, так как я совсем новичок ввсе это.

# -*- coding: utf-8 -*-`enter code here`

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class QuotesbotItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass

class MyItems(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    tinfo = scrapy.Field()
    pass

Большое спасибо всем, кто может вам помочь

# -*- coding: utf-8 -*-
import scrapy
from quotesbot.items import MyItems
from scrapy import Request


class ToScrapeSpiderXPath(scrapy.Spider):
    name = 'toscrape-xpath'
    start_urls = [
    'http://quotes.toscrape.com/',
    ]

def parse(self, response):
    item = MyItems()
    for quote in response.xpath('//div[@class="quote"]'):
            item = 
{'tinfo':quote.xpath('./span[@class="text"]/text()').extract_first()}
    **yield response.follow**('http://quotes.toscrape.com', self.parse_2, 
meta={'item':item})

def parse_2(self, response):
    print "almost there"
    item = response.meta['item']
    yield item

1 Ответ

0 голосов
/ 07 октября 2018

Ваша логика паука очень сбивает с толку:

def parse(self, response):
    for quote in response.xpath('//div[@class="quote"]'):
            yield Request("http://quotes.toscrape.com/", 
    callback=self.parse2, meta={'item':item})

Для каждой цитаты, найденной на quotes.toscrape.com, вы планируете еще один запрос к той же веб-странице?Что происходит, так это то, что эти новые запланированные запросы отфильтровываются фильтром повторяющихся запросов scrapys.

Может быть, вам просто нужно получить элемент прямо здесь:

def parse(self, response):
    for quote in response.xpath('//div[@class="quote"]'):
        item = MyItems()
        item['tinfo'] = quote.xpath('./span[@class="text"]/text()').extract_first()
        yield item

Чтобы показать, почему ваш текущий сканер ничего не делаетсм. этот чертеж: enter image description here

...