Как заставить Scrapy показывать все элементы, а не только последний? - PullRequest
0 голосов
/ 13 мая 2018

Имея следующего паука:

import scrapy

class ScrapeNames(scrapy.Spider):
    name='final2'

    start_urls = [
        'https://www.trekearth.com/members/'
    ]

    def parse(self, response):

        for entry in response.xpath('//table[@class="member-table"]'):

            for name in entry.xpath('.//tr[@class="row"]/td/p/a/text()|.//tr/td/p/a/text()').extract():
                item['name'] = name
            for photo in entry.xpath('.//tr[@class="row"]/td[6]/a/text()|.//tr[@class="row"]/td[6]/text()|.//tr/td[6]/text()|.//tr/td[6]/a/text()').extract():
                item['photo'] = photo
        yield item

Я хочу извлечь количество фотографий, сделанных пользователем, а затем экспортировать их в CSV.Однако в моем .csv у меня есть только последний элемент в таблице на этой странице (см. Скриншот ниже).

enter image description here

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

РЕДАКТИРОВАТЬ: Возможно, это также важно, но мой файл items.py выглядит следующим образом:

import scrapy


class FinalItem(scrapy.Item):
    name = scrapy.Field()
    photo = scrapy.Field()
    pass

СЛЕДОВАТЬ ЗА ВОПРОСОМ:

Я ввел некоторые улучшения в мой код, который теперь:

class ScrapeMovies(scrapy.Spider):
    name='final2'

    start_urls = [
        'https://www.trekearth.com/members/'
    ]

    def parse(self, response):
        item = FinalItem()
        for entry in response.xpath('//table[@class="member-table"]'):
            for name in entry.xpath('.//tr[@class="row"]/td/p/a/text()|.//tr/td/p/a/text()').extract():
                names = entry.xpath('.//tr[@class="row"]/td/p/a/text()|.//tr/td/p/a/text()').extract()
                item['name'] = ";".join(names)
            for photos in entry.xpath('.//tr[@class="row"]/td[6]/a/text()|.//tr[@class="row"]/td[6]/text()|.//tr/td[6]/text()|.//tr/td[6]/a/text()').extract():
                photos = entry.xpath('.//tr[@class="row"]/td[6]/a/text()|.//tr[@class="row"]/td[6]/text()|.//tr/td[6]/text()|.//tr/td[6]/a/text()').extract()
                item['photo'] = ";".join(photos)
        yield item

Однако в конечном итоге это создало беспорядок в .csv, который теперь выглядит следующим образом:

enter image description here

Есть ли простой способ исправить это?

Пример желаемого результата в .csv ниже:

enter image description here

РЕДАКТИРОВАТЬ2:

Мой паук сейчас:

import scrapy
from final.items import FinalItem



class ScrapeMovies(scrapy.Spider):
    name='final2'

    start_urls = [
        'https://www.trekearth.com/members/'
    ]

    def parse(self, response):
        for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):
            item = FinalItem()
            item['name'] = row.xpath('./td[2]//a/text()').extract_first()
            item['photos'] = row.xpath('string(./td[6])').extract_first()
            yield item

Все еще не дает должного результата.У меня есть только пустой .csv.Обновлены settings.py

1 Ответ

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

UPDATE

Эта строка должна быть в вашем settings.py (сайт блокирует пользовательский агент Scrapy по умолчанию):

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'

и далее это будет работать:

def parse(self, response):

    for row in response.xpath('//table[@class="member-table"]//tr[position() > 1]'):
        item = FinalItem()
        item['name'] = row.xpath('./td[2]//a/text()').extract_first()
        item['photos'] = row.xpath('string(./td[6])').extract_first()
        yield item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...