Scrapy: несколько "start_urls" дают дублированные результаты - PullRequest
0 голосов
/ 17 ноября 2018

Хотя мой простой код выглядит нормально в соответствии с официальным документом , он генерирует неожиданно дублированные результаты, такие как:

  • 9 строк / результатов при настройке 3 URL
  • 4 строки / результаты при настройке 2 URL

Когда я задаю только 1 URL, мой код работает нормально. Кроме того, я попытался решение для ответа в этом SO вопросе , но это не решило мою проблему.

[Команда Scrapy]

$ scrapy crawl test -o test.csv

[Паук Scrapy: test.py]

import scrapy
from ..items import TestItem

class TestSpider(scrapy.Spider):
    name = 'test'
    start_urls = [
        'file:///Users/Name/Desktop/tutorial/test1.html',
        'file:///Users/Name/Desktop/tutorial/test2.html',
        'file:///Users/Name/Desktop/tutorial/test3.html',
    ]

    def parse(self, response):
        for url in self.start_urls:
            table_rows = response.xpath('//table/tbody/tr')

            for table_row in table_rows:
                item = TestItem()
                item['test_01'] = table_row.xpath('td[1]/text()').extract_first()
                item['test_02'] = table_row.xpath('td[2]/text()').extract_first()

                yield item

[Целевой HTML: test1.html, test2.html, test3.html]

<html>
<head>
  <title>test2</title> <!-- Same as the file name  -->
</head>
  <body>
    <table>
        <tbody>
            <tr>
                <td>test2 A1</td> <!-- Same as the file name  -->
                <td>test2 B1</td> <!-- Same as the file name  -->
            </tr>
        </tbody>
    </table>
  </body>
</html>

[Сгенерированные результаты CSV для 3 URL-адресов]

test_01,test_02
test1 A1,test1 B1
test1 A1,test1 B1
test1 A1,test1 B1
test2 A1,test2 B1
test2 A1,test2 B1
test2 A1,test2 B1
test3 A1,test3 B1
test3 A1,test3 B1
test3 A1,test3 B1

[Ожидаемые результаты для 3 URL-адресов]

test_01,test_02
test1 A1,test1 B1
test2 A1,test2 B1
test3 A1,test3 B1

[Сгенерированные результаты CSV для 2 URL-адресов]

test_01,test_02
test1 A1,test1 B1
test1 A1,test1 B1
test2 A1,test2 B1
test2 A1,test2 B1

[Ожидаемые результаты для 2 URL-адресов]

test_01,test_02
test1 A1,test1 B1
test2 A1,test2 B1

1 Ответ

0 голосов
/ 17 ноября 2018

Вы снова итерируете start_urls, вам это не нужно, scrapy уже делает это за вас, так что теперь вы дважды зацикливаетесь на start_urls.

Попробуйте вместо этого:

import scrapy
from ..items import TestItem

class TestSpider(scrapy.Spider):
    name = 'test'
    start_urls = [
        'file:///Users/Name/Desktop/tutorial/test1.html',
        'file:///Users/Name/Desktop/tutorial/test2.html',
        'file:///Users/Name/Desktop/tutorial/test3.html',
    ]

    def parse(self, response):
        table_rows = response.xpath('//table/tbody/tr')

        for table_row in table_rows:
            item = TestItem()
            item['test_01'] = table_row.xpath('td[1]/text()').extract_first()
            item['test_02'] = table_row.xpath('td[2]/text()').extract_first()

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