создать скрап, чтобы загрузить больше и выскрести URL-адреса продукта на странице - PullRequest
0 голосов
/ 03 декабря 2018

Привет всем, у меня есть встроенный скрипт на python, использующий селен для бесконечной прокрутки и нажатия кнопки «загрузить больше», по-видимому, это дает мне только половину продуктов, а также отнимает много времени, и теперь я хочу написать скрипт в scrapy для того же самогополучить все ссылки на продукты в CSV-файле. Получить все ссылки на сценарии, которые я написал:

from selenium import webdriver
import time
from selenium.common.exceptions import WebDriverException
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoSuchWindowException

path_to_chromedriver = 'C:/Users/Admin/AppData/Local/Programs/Python/Python37-32/chromedriver.exe'
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.default_content_setting_values.notifications": 2}
chrome_options.add_experimental_option("prefs", prefs)
chrome_options.add_argument("start-maximized")
browser = webdriver.Chrome(options=chrome_options, executable_path=path_to_chromedriver)
with open('E:/grainger2.txt','r', encoding='utf-8-sig') as f:
    content = f.readlines()
    content = [x.strip() for x in content]
    with open('E:/grainger11.csv', 'a', encoding="utf-8") as f:
        headers = ("link,sublink")
        f.write(headers)
        f.write("\n")
        for dotnum in content:
            browser.get(dotnum)
            SCROLL_PAUSE_TIME = 1
            # Get scroll height
            last_height = browser.execute_script("return document.body.scrollHeight")
            while True:
                # Scroll down to bottom
                browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
                # Wait to load page
                time.sleep(SCROLL_PAUSE_TIME)
                # Calculate new scroll height and compare with last scroll height
                new_height = browser.execute_script("return document.body.scrollHeight")
                if new_height == last_height:
                    break
                last_height = new_height
            while True:
                try:
                    try:
                        loadMoreButton = browser.find_element_by_css_selector(".btn.list-view__load-more.list-view__load-more--js")
                        loadMoreButton.click()
                        time.sleep(2)
                    except NoSuchWindowException:
                        pass
                except Exception as e:
                    break

            try:
                try:
                    for links in browser.find_elements_by_css_selector(".list-view__product.list-view__product--js"):
                        aa = links.get_attribute("data-url-ie8")
                        print(aa)
                        ana = "loadlink"
                        f.write(ana+","+dotnum+","+aa+"\n")
                except NoSuchWindowException:
                    pass
            except NoSuchElementException:
                pass

Пример ссылки: https://www.grainger.com/category/drill-bushings/machine-tool-accessories/machining/ecatalog/N-hg1?searchRedirect=products

с использованиемСценарий выше, я получаю только 200 ссылок на продукты, но, тем не менее, ссылка содержит 9748 продуктов, и я хочу извлечь всю ссылку, если кто-то может мне помочь, это было бы очень полезно

1 Ответ

0 голосов
/ 04 декабря 2018

Я думаю, вы усложняете это больше, чем нужно.

Я предлагаю вам использовать Scrapy Standal (вам не нужен селен), а затем использовать скрытые ссылки на странице, чтобы перебирать все страницы.Глядя на источник ...

<section class="searchControls paginator-control">
        <a
            href="/category/drill-bushings/machine-tool-accessories/machining/ecatalog/N-hg1?searchRedirect=products&requestedPage=2"
            class="btn list-view__load-more list-view__load-more--js"
            data-current-page="1"
            data-product-offset="32"
            data-total-products="9749"
            data-page-url="/category/drill-bushings/machine-tool-accessories/machining/ecatalog/N-hg1?searchRedirect=products"
            id="list-view__load-more--js">
            View More
        </a>
    </section>

Вы сможете написать нумерацию страниц в Scrapy, как это ...

# go through the pagination links to access infinite scroll           
        next_page = response.css('div.paginator-control a::attr(href)').extract_first()
        if next_page is not None:
          next_page = response.urljoin(next_page)
          yield scrapy.Request(next_page, callback=self.parse_item)

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

Чтобы увидеть базовый пример, см. Scrapy информацию по следующим ссылкам

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