Функция отправки ключа не работает должным образом в Selenium Python - PullRequest
0 голосов
/ 27 апреля 2020

Взгляните на этот сайт: https://www.arabam.com/ilan/sahibinden-satilik-mercedes-benz-cla-180-d-style/sahibinden-boyasiz-hasarsiz-cam-tavan-temiz-arac/14229201

Я нажимаю клавишу завершения, чтобы перейти к концу страницы. И затем один за другим он нажимает клавишу «вверх», пока не находит это: введите описание изображения здесь

Это работало просто отлично, но, похоже, больше не работает.

  options.add_argument('window-size=1200x600')
        prefs = {}

        prefs = {"profile.default_content_setting_values.geolocation": 2, "profile.default_content_setting_values.notifications": 2}
        options.add_experimental_option("prefs", prefs)
        d = webdriver.Chrome(chrome_options=options,
                             executable_path='./chromedriver')
        d.get(features["ad_url"])
        # Use send_keys(Keys.HOME) to scroll up to the top of page
        d.find_element_by_tag_name('body').send_keys(
            Keys.END)
        while True:

                d.find_element_by_tag_name('body').send_keys(
                    Keys.UP)
                time.sleep(1)
                e = d.find_element_by_xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[3]/div/div[3]/div")
                if e.text:
                    break

Вот полностью функциональный код, который можно попробовать:

import json
import scrapy
from scrapy.spiders import SitemapSpider
from scrapy.crawler import CrawlerProcess
from selenium import webdriver
from datetime import datetime
from selenium.webdriver.common.keys import Keys
import pickle
import time


class Myspider(SitemapSpider):
    name = 'spidername'
    sitemap_urls = ['https://www.arabam.com/sitemap/otomobil_1.xml','https://www.arabam.com/sitemap/otomobil_2.xml',
                    'https://www.arabam.com/sitemap/otomobil_3.xml','https://www.arabam.com/sitemap/otomobil_4.xml',
                    'https://www.arabam.com/sitemap/otomobil_5.xml','https://www.arabam.com/sitemap/otomobil_6.xml',
                    'https://www.arabam.com/sitemap/otomobil_7.xml','https://www.arabam.com/sitemap/otomobil_8.xml',
                    'https://www.arabam.com/sitemap/otomobil_9.xml','https://www.arabam.com/sitemap/otomobil_10.xml',
                    'https://www.arabam.com/sitemap/otomobil_11.xml','https://www.arabam.com/sitemap/otomobil_12.xml',
                    'https://www.arabam.com/sitemap/otomobil_13.xml']


    sitemap_rules = [
        ('/otomobil/', 'parse'),

    ]
    custom_settings = {'FEED_FORMAT':'csv','FEED_URI': "arabam_"+str(datetime.today().strftime('%d%m%y'))+'.csv'
                       }

    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"):
            link = td.xpath("@href").extract()


            year = td.xpath("text()").extract()
            self.crawled.append(link[0])
            self.new_links += 1
            if int(year[0]) > 2010:
                url = "https://www.arabam.com/" + link[0]

                yield scrapy.Request(url, callback=self.parse_dir_contents)

    def parse_dir_contents(self,response):

        features = {}





        options = webdriver.ChromeOptions()

        # options.add_argument('headless')
        options.add_argument('window-size=1200x600')
        prefs = {}

        prefs = {"profile.default_content_setting_values.geolocation": 2, "profile.default_content_setting_values.notifications": 2}
        options.add_experimental_option("prefs", prefs)
        d = webdriver.Chrome(chrome_options=options,
                             executable_path='./chromedriver')
        d.get(features["ad_url"])
        # Use send_keys(Keys.HOME) to scroll up to the top of page
        d.find_element_by_tag_name('body').send_keys(
            Keys.END)
        while True:

                d.find_element_by_tag_name('body').send_keys(
                    Keys.UP)
                time.sleep(1)
                e = d.find_element_by_xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[3]/div/div[3]/div")
                if e.text:
                    break

        overview1 = e.text.split("\n")

        yield features



process = CrawlerProcess({
})


process.crawl(Myspider)
process.start() # the script wi

Редактировать: Я прокомментировал и выполнил код, и оказалось, что ключи отправляются. Проблема заключается в попытке найти конкретный c div. Я попытался поставить на него попытку, но это, похоже, не сработало.

в то время как True:

        d.find_element_by_tag_name('body').send_keys(
            Keys.UP)
        time.sleep(1)
        try:
            e = d.find_element_by_xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[3]/div/div[3]/div")
            if e.text:
                break
        except:
            pass

Редактировать:

Это то, что я сделал для прокрутки вверх. Но, к сожалению, в большинстве случаев это не работает

for i in range(0,37):

        d.find_element_by_tag_name('body').send_keys(
            Keys.UP)
        time.sleep(1)

e = d.find_element_by_xpath("/html/body/div[3]/div[6]/div[3]/div/div[1]/div[3]/div/div[3]/div[2]/div")

overview1 = e.text.split("\n")

Редактировать: пробовал это. Он прокручивается в поле зрения, но не получает элемент

         e = d.find_element_by_xpath("//div[@id = 'js-hook-appendable-technicalPropertiesWrapper' and @class = 'cf' ] ")


        actions = ActionChains(d)
        actions.move_to_element(e).perform()
        wait = WebDriverWait(d, 20)
        wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@id = 'js-hook-appendable-technicalPropertiesWrapper' and @class = 'cf' ]")))
        overview1 = e.text.split("\n")

Редактировать: снимок экрана HTML введите описание изображения здесь

1 Ответ

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

Добавление в качестве ответа, так как это довольно длинный комментарий.

Сначала нужно дождаться появления элемента. А затем найдите элемент и извлеките значения. По вашему коду поиск элемента выполняется до проверки видимости. И еще одна вещь, которую вы можете попробовать, это прокрутить до указанного элемента c перед извлечением значений. Эта специфицированная таблица c загружает значения только в том случае, если она находится в области просмотра.

actions = ActionChains(d)
actions.move_to_element(e).perform()
wait = WebDriverWait(d, 20)

wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@id = 'js-hook-appendable-technicalPropertiesWrapper' and @class = 'cf' ]")))

e = d.find_element_by_xpath("//div[@id = 'js-hook-appendable-technicalPropertiesWrapper' and @class = 'cf' ] ")
# Scroll to the element
d.executeScript("arguments[0].scrollIntoView(true);", element);
# Check what is the actual text value you get
print(e.text)
print (e.text.split("\n"))
...