Scrapy пропускает ссылки - PullRequest
0 голосов
/ 27 апреля 2020

Это URL https://www.arabam.com/ikinci-el/otomobil?page=14

Я перебираю URL. Он обрабатывает объявление, если год больше 2010 года. Это мой код

class Myspider(SitemapSpider):
    name = 'spidername'

    custom_settings = {'FEED_FORMAT':'csv','FEED_URI': "arabam_"+str(datetime.today().strftime('%d%m%y'))+'.csv'}
    def start_requests(self):
        urls = ['https://www.arabam.com/ikinci-el/otomobil?page=14']
        # urls = ['https://www.arabam.com/ikinci-el/otomobil?page=' + str(i) for i in range(1, 50)]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)
    def parse(self,response):


            for td in response.xpath("/html/body/div[3]/div[6]/div[4]/div/div[2]/table/tbody/tr/td[4]/div/a/@href").extract():
                checks = str(td.split("/")[3]).split("-")

                for items in checks:
                    if items.isdigit():

                        if int(items) > 2010:

                            url = "https://www.arabam.com/"+ td
                            yield scrapy.Request(url, callback=self.parse_dir_contents)

На этой странице больше 10 объявлений, которые больше 2010 года. Однако Scrapy сохранила только около 3 страниц.

1 Ответ

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

Ваш xpath выбран неверно.

В настоящее время ваш td является элементом списка, который содержит все ссылки и выглядит примерно так:
['/ ilan / sahibinden-satilik-peugeot-407-1-6-hdi-millesim / 111-bin-km-de-efsane-d-сегмента / 14278421 ',
' / ilan / galeriden-satilik-seat-le-on-1-6-tdi-style / simsek-ten-2016-leon- cam-tavan-dsg-led-katlanir-ayna / 13804838 ',
' / ilan / galeriden-satilik-skoda-favitit-135-lx / aci ll-satilik-firsat-araci / 13027823 ',
. ..]

Затем вы разбиваете его на sla sh, получаете элемент №. 3 и снова разделить его на da sh, который возвращает что-то подобное для каждого td:
['111', 'bin', 'km', 'de', 'efsane', 'd', ' сегмент ']
[' simsek ',' ten ',' 2016 ',' leon ',' cam ',' tavan ',' dsg ',' led ',' katlanir ',' ayna ']
['acill', 'satilik', 'firsat', 'araci']

Как вы видите в этом примере, ваш код будет работать только для второй ссылки, так как содержит год, который вы ищете ( 2016> 2010). Другие ссылки просто не содержат год, поэтому ваш код не работает для них. Вместо этого вы должны получить информацию о году из таблицы, а не по ссылке.

Я рекомендую использовать оболочку scrapy для поиска правильного селектора, потому что вы можете в интерактивном режиме проверить свой выбор xpath или css и посмотреть, что именно ваш результат будет выглядеть так ( см. этот официальный пример ).

Следующее определение синтаксического анализа должно работать для вас:

    def parse(self, response):
        rows = response.css('.listing-list-item') # extract all rows
        for row in rows:
            year = row.css('td:nth-child(4) a::text').extract_first() # extract year from every row
            if int(year) > 2010:
                suburl = row.css('td:nth-child(4) a::attr(href)').extract_first()
                url = "https://www.arabam.com" + suburl # create new url
                yield scrapy.Request(url, callback=self.parse_dir_contents) # request new url

Код сначала получает каждую строку таблица, затем получает год для строки, и если этот год> 2010, он создает новый URL и запрашивает его.
Этот код будет работать при условии, что вы где-то определили свой метод parse_dir_contents-method.

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