Как скрести страницы с помощью Selenium? - PullRequest
0 голосов
/ 22 мая 2018

Хочу очистить один сайт от Selenium, всего 10 страниц.Мой код, как показано ниже, но почему я могу получить только результат первой страницы:

# -*- coding: utf-8 -*-
from selenium import webdriver
from scrapy.selector import Selector


MAX_PAGE_NUM = 10
MAX_PAGE_DIG = 3

driver = webdriver.Chrome('C:\Users\zhang\Downloads\chromedriver_win32\chromedriver.exe')
with open('results.csv', 'w') as f:
    f.write("Buyer, Price \n")

for i in range(1, MAX_PAGE_NUM + 1):
    page_num = (MAX_PAGE_DIG - len(str(i))) * "0" + str(i)
    url = "https://www.oilandgasnewsworldwide.com/Directory1/DREQ/Drilling_Equipment_Suppliers_?page=" + page_num

    driver.get(url)

    names = sel.xpath('//*[@class="fontsubsection nomarginpadding lmargin opensans"]/text()').extract()
    Countries = sel.xpath('//td[text()="Country:"]/following-sibling::td/text()').extract()
    websites = sel.xpath('//td[text()="Website:"]/following-sibling::td/a/@href').extract()

driver.close()
print(len(names), len(Countries), len(websites))

Ответы [ 2 ]

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

Здесь сначала я получаю имена, страны и веб-сайты каждой страницы с find_elements_by_xpath, и они сохраняются в списке.Текст извлекается из каждого элемента в списке, а значение добавляется в новый список.

from selenium import webdriver

MAX_PAGE_NUM = 10

driver = webdriver.Chrome('C:\\Users...\\chromedriver.exe')

names_list = list()
Countries_list = list()
websites_list = list()

# The for loop is to get each of the 10 pages
for i in range(1, MAX_PAGE_NUM):
    page_num = str(i)
    url = "https://www.oilandgasnewsworldwide.com/Directory1/DREQ/Drilling_Equipment_Suppliers_?page=" + page_num

    driver.get(url)

    # Use "driver.find_elements" instead of "driver.find_element" to get all of them. You get a list of WebElements of each page
    names = driver.find_elements_by_xpath("//*[@class='fontsubsection nomarginpadding lmargin opensans']")

    # To get the value of each WebElement in the list. You have to iterate on the list 
    for i in range(0, len(names)):
    # Now you add each value into a new list 
        names_list.append(names[i].text)


    Countries = driver.find_elements_by_xpath("//td[text()='Country:']/following-sibling::td")
    for i in range(0, len(Countries)):
        Countries_list.append(Countries[i].text)

    websites = driver.find_elements_by_xpath("//td[text()='Website:']/following-sibling::td")
    for i in range(0, len(websites)):
        websites_list.append(websites[i].text)

print(names_list)
print(Countries_list)               
print(websites_list)

driver.close()

Надеюсь, это сработает для вас

Опция: для получения всех данных в разделе, содержащемся в <div class = border fontcontentdet>.

из веб-драйвера импорта селена

MAX_PAGE_NUM = 10

driver = webdriver.Chrome('C:\\Users\\LVARGAS\\AppData\\Local\\Programs\\Python\\Python36-32\\Scripts\\chromedriver.exe')

data_list = list()

# The for loop is to get each of the 10 pages
for i in range(1, MAX_PAGE_NUM):
    page_num = str(i)
    url = "https://www.oilandgasnewsworldwide.com/Directory1/DREQ/Drilling_Equipment_Suppliers_?page=" + page_num
    driver.get(url)

    rows = driver.find_elements_by_xpath("//*[@class='border fontcontentdet']")

    for i in range(0, len(rows)):

        print(rows[i].text)

        data_list.append(rows[i].text)

        print('---')

driver.close()
print(data_list)
0 голосов
/ 22 мая 2018

Я предполагаю, что это как-то связано со странной вещью, которую вы делаете в назначении page_num.Для отладки попробуйте добавить эту строку после вызова driver.get (url):

print(driver.current_url)

Если он возвращает ожидаемые URL-адреса, то, скорее всего, проблема в вашем XPATH.

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