Как нажать один за другим, чтобы получить данные с веб-сайта, используя селен python - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь получить данные с веб-сайта, но я хочу выбрать первую 1000 ссылок, открытых по одной, и получить данные оттуда.

Я пробовал:

list_links = driver.find_elements_by_tag_name('a')

for i in list_links:
        print (i.get_attribute('href')) 

через это получение дополнительных ссылок, которые не требуются.

например: https://www.magicbricks.com/property-for-sale/residential-real-estate?bedroom=1,2,3,4,5,%3E5&proptype=Multistorey-Apartment,Builder-Floor-Apartment,Penthouse,Studio-Apartment,Residential-House,Villa,Residential-Plot&cityName=Mumbai

мы получим ссылку более 50к. Как открыть только первые 1000 ссылок внизу со свойствами фотографии.

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

Я пробовал это также:

driver.find_elements_by_xpath("//div[@class='.l-srp__results.flex__item']")
driver.find_element_by_css_selector('a').get_attribute('href')

for matches in driver:
    print('Liking')
    print (matches)
    #matches.click()
    time.sleep(5)

Но получаю ошибку: TypeError: 'WebDriver' object is not iterable

Почему я не получаю ссылку, используя эту строку: driver.find_element_by_css_selector('a').get_attribute('href')

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

Я пытаюсь отсортировать ссылки, как показано ниже, но получаю ошибку

            result = re.findall(r'https://www.magicbricks.com/propertyDetails/', my_list)
            print (result)

Ошибка: TypeError: ожидаемая строка или байтовоподобный объект

или пробовал

            a = ['https://www.magicbricks.com/propertyDetails/']
            output_names = [name for name in a if (name[:45] in my_list)]
            print (output_names)

Ничего не получается.

Все ссылки находятся в списке. Пожалуйста, предложите

Заранее спасибо. Пожалуйста, предложите

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я считаю, что вы должны собрать все элементы в списке, которые имеют имя тега "a" со свойствами "href", которые не равны нулю.
Затем пройдите по списку и нажмите на элемент один за другим.
Создайте список типа WebElement и сохраните все действительные ссылки.
Здесь вы можете применить больше фильтров или условий, т.е. ссылка содержит некоторые символы или некоторые другие условия.

Чтобы сохранить WebElement в списке, вы можете использовать driver.findEelements () , этот метод возвращает список типа WebElement.

0 голосов
/ 28 августа 2018

Селен не очень хорошая идея для очистки веб-страниц. Я бы предложил вам использовать JMeter БЕСПЛАТНО и с открытым исходным кодом.

http://www.testautomationguru.com/jmeter-how-to-do-web-scraping/

Если вы хотите использовать селен, подход, который вы пытаетесь придерживаться, не является стабильным - щелчок и захват данных. Вместо этого я бы предложил вам следовать этому - нечто подобное здесь. Пример в Java. Но вы могли бы получить идею.

driver.get("https://www.yahoo.com");

Map<Integer, List<String>> map = driver.findElements(By.xpath("//*[@href]")) 
                .stream()                             // find all elements which has href attribute & process one by one
                .map(ele -> ele.getAttribute("href")) // get the value of href
                .map(String::trim)                    // trim the text
                .distinct()                           // there could be duplicate links , so find unique
                .collect(Collectors.groupingBy(LinkUtil::getResponseCode)); // group the links based on the response code

Больше информации здесь.

http://www.testautomationguru.com/selenium-webdriver-how-to-find-broken-links-on-a-page/

...