Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Data Mining
  • » Как узнать url, переход по которому происходит с помощью JS [RSS Feed]

#1 Авг. 31, 2015 10:56:51

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

Здравствуйте! Пытаюсь разобраться с парсингом сайтов, использую связку requests + lxml. Но на сайте http://www.neopoliscasa.ru/catalog.html наткнулся на то, что переход по категориям товаров (сайдбар слева) происходит по клику на элементе li, т.е., как я понял, с помощью javascript. Попробовал дотянуться до url с помощью selenium, кликая по ним:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.neopoliscasa.ru/catalog.html")
categories = driver.find_elements_by_xpath(
    '//div[contains(@class, "listFilter")]/ul/li')[1:]
for category in categories:
    category.click()
    url = driver.current_url
    print(url)
, но, чтобы узнать current_url, надо передать этот url в driver.get(url)
Подскажите, пожалуйста, как вытащить ссылки на страницы категорий товаров, может, можно как то узнать текущий url из адресной строки браузера, после перехода, или это делается как то проще?

Офлайн

#2 Авг. 31, 2015 14:01:57

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

Заработало как надо после того, как я добавил time.sleep() для приостановки скрипта после каждого клика.

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.neopoliscasa.ru/catalog.html")
categories = driver.find_elements_by_xpath(
    '//div[contains(@class, "listFilter")]/ul/li')[1:]
category_links = []
for category in categories:
    category.click()
    time.sleep(3)
    category_links.append(driver.current_url)
print(category_links)
Был бы благодарен за советы, как правильно извлекать подобного рода url, selenium - правильный выбор или есть более подходящие для этого инструменты?

Офлайн

#3 Авг. 31, 2015 15:47:19

i.slepov
Зарегистрирован: 2015-05-28
Сообщения: 53
Репутация: +  5  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

Офлайн

#4 Авг. 31, 2015 17:08:03

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

Спасибо, невнимательно читал доки )

Офлайн

#5 Авг. 31, 2015 20:19:08

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

Господи, да там 8 позиций в списке, соберите их вручную и уже работайте с готовыми ссылками. Селениум там зачем нужен ?

Офлайн

#6 Авг. 31, 2015 20:50:55

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

ayb
Господи, да там 8 позиций в списке, соберите их вручную и уже работайте с готовыми ссылками. Селениум там зачем нужен ?
Там дальше в типах товаров (диван 2х местный, 3х местный и в т.д.) такая же история, из-за 8 ссылок бы я и не заморачивался

Офлайн

#7 Сен. 3, 2015 00:30:23

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

Stright
Там дальше в типах товаров (диван 2х местный, 3х местный и в т.д.) такая же история, из-за 8 ссылок бы я и не заморачивался

Прошу прощения за мой английский и BS если что :

import requests
import bs4
CATALOG_URLS = [
    "http://www.neopoliscasa.ru/catalog/mebel-gostinaya.html",
    "http://www.neopoliscasa.ru/catalog/mebel-spalna.html",
    "http://www.neopoliscasa.ru/catalog/mebel-stolovaya.html",
]
BASE_URL = "http://www.neopoliscasa.ru"
categories = set()
def page_url(base, page):
    """Prepare page URL.
        Example : (/krovat.html, 7) to /krovat_7.html
    """
    return "{}_{}.html".format(base.rsplit('.', 1)[0], page)
def parse_single_category_page(url):
    """Parses single page and returns list of product links"""
    page = requests.get(url).content
    soup = bs4.BeautifulSoup(page)
    catalog_items = soup.find_all("div", class_="catalogItem")
    return [item.find("a")["href"] for item in catalog_items]
def parse_furniture_dir(url):
    """Parse base catalog URL and add it to global
        categories set
    """
    page = requests.get(url).content
    soup = bs4.BeautifulSoup(page)
    for category in soup.find_all("div", class_="itemTypeIcoon"):
        categories.add(category.find("a")["href"])
def parse_category_dir(category):
    """Parse items in category and returns its
        URLs list
    """
    category_base_url = "{}{}".format(BASE_URL,
                                      category)
    page = requests.get(category_base_url).\
        content
    soup = bs4.BeautifulSoup(page)
    pages_count_ = soup.find('ul', class_="pagesContainer")
    pages_count = int(pages_count_.find_all('li')[-2].getText())
    products_list = parse_single_category_page(category_base_url)
    for page in range(2, pages_count):
        products_list += parse_single_category_page(page_url(category_base_url,
                                                             page))
    return products_list
for base_category_url in CATALOG_URLS:
    parse_furniture_dir(base_category_url)
for category in categories:
    for page in parse_category_dir(category):
        print(page)

Офлайн

#8 Сен. 3, 2015 00:41:09

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Как узнать url, переход по которому происходит с помощью JS

ayb
Господи, да там 8 позиций в списке, соберите их вручную и уже работайте с готовыми ссылками. Селениум там зачем нужен ?
Так и сделал )
Stright
Там дальше в типах товаров (диван 2х местный, 3х местный и в т.д.)
невнимательно сначала посмотрел, url типов товаров, как оказалось, можно получить url_page + ‘?tag=’ + id элемента списка, и селениум там и вправду не нужен

Офлайн

  • Начало
  • » Data Mining
  • » Как узнать url, переход по которому происходит с помощью JS[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version