Есть сайт: http://www.chegg.com/search/books/?trackid=2aed0035&strackid=1514181a&event=enter_submit#p=1 Список страниц подгружается с помощью js. Вопрос. Я могу их как то получить?
Данная задача очень часто встречается в обращениях в тех поддержку, поэтому на данном примере покажу как она решается. Здесь необходим комплексный подход. 1) По данной ссылке, как указано выше, контент действительно подгружается JS скриптом. Но в конце-концов он тоже откуда-то получает данные, а значит делает куда-то запрос. Нам нужно только этот запрос найти, и потом воспользоваться им. Для этого воспользуемся Инструментами разработчика (Ctrl+Shift+I, вкладка Network), которые доступны в браузере Chrome. Откроем вышеуказанную ссылку и проанализируем ее. Мы увидим много различных запросов и ответов. Просмотрев все ответы на предмет нужной нам информации (к примеру здесь можно искать по первому названию: "Cengage Advantage Books..."), находим нужный нам запрос. 2) Проверяем и анализируем найденный запрос. Для начала откроем его в новой вкладке браузера и посмотрим, действительно ли он выдает то, что нам нужно. Как видим - да, есть название книги и ссылка на нее (выделены зеленым), а также много другой информации. Если внимательно приглядеться - можно увидеть, что это данные в формате JSON. Убедиться в этом можно, подставив в полученные данные в Template tester в A-parser'е и нажав кнопку Pretiffy JSON (выделена зеленым квадратом). На рисунке, кстати, отображен пример вывода авторов через переменные из масива JSON. 3) Но вернемся к нашей начальной ссылке. Как видим это была только первая страница, на которой только 10 результатов. А как быть если нужны все остальные? Анализируем найденный ранее запрос: Если вместо выделенной жирным 1 поставить 2, и открыть эту ссылку в браузере - то увидим, что выдаваемые данные и есть то что нам нужно (2-я страница) в уже знакомом нам JSON. Отлично, теперь осталось все это загрузить в A-parser. 4) Для парсинга будем использовать Net::HTTP. Для получения необходимых нам данных из всего контента используем Parse custom result и регулярные выражения. Кстати, регулярное выражение в данном примере необходимо очень внимательно составлять, т.к. в этой выдаче есть еще "relatedItems" (что-то вроде похожих книг) и вместе с ними на первой странице можно получить 18 результатов вместо 10. Пояснения: На вход подается найденный ранее запрос, но вместо цифры подставляем макрос перебора цифр. В данном примере будут пройдены все страницы с 1-й по 1000-ю. В результате мы получим в файле следующую информацию: Автор - Название книги: Ссылка на страницу. По желанию формат результата можно менять как угодно, изменяя регулярное выражение и собираемые им данные, а также меняя сам Result format. Обратите внимание, здесь еще с помощью Конструктора результатов заменяется "\/" на "/", т.к. в JSON символ "/" экранируется. Результирующий файл будет иметь следующий вид: На этом все - задача решена))) Спойлер: Код для импорта Код: eyJwcmVzZXQiOiJodHRwOi8vYS1wYXJzZXIuY29tL3RocmVhZHMvMTY5OSIsInZh bHVlIjp7InByZXNldCI6Imh0dHA6Ly9hLXBhcnNlci5jb20vdGhyZWFkcy8xNjk5 IiwicGFyc2VycyI6W1siTmV0OjpIVFRQIiwiZGVmYXVsdCIseyJ0eXBlIjoib3Zl cnJpZGUiLCJpZCI6ImZvcm1hdHJlc3VsdCIsInZhbHVlIjoiJGJvb2tzLmZvcm1h dCgnJGF1dGhvciAtICR0aXRsZTogaHR0cDovL3d3dy5jaGVnZy5jb20vJGxpbmtc XG4nKSJ9LHsidHlwZSI6ImN1c3RvbVJlc3VsdCIsInJlc3VsdCI6ImRhdGEiLCJy ZWdleCI6IlssfFxcW117XCJ0eXBlXCI6Lis/XCJwcmltYXJ5QXV0aG9yXCI6XCIo Lio/KVwiLis/XCJ0aXRsZVwiOlwiKC4rPylcIi4rP1wicGRwXCI6XCIoLis/KVwi IiwicmVnZXhUeXBlIjoiZyIsInJlc3VsdFR5cGUiOiJhcnJheSIsImFycmF5TmFt ZSI6ImJvb2tzIiwicmVzdWx0cyI6WyJhdXRob3IiLCJ0aXRsZSIsImxpbmsiXX1d XSwicmVzdWx0c0Zvcm1hdCI6IiRwMS5wcmVzZXQiLCJyZXN1bHRzU2F2ZVRvIjoi ZmlsZSIsInJlc3VsdHNGaWxlTmFtZSI6IiRkYXRlZmlsZS5mb3JtYXQoKS50eHQi LCJhZGRpdGlvbmFsRm9ybWF0cyI6W10sInJlc3VsdHNVbmlxdWUiOiJubyIsInF1 ZXJ5Rm9ybWF0IjpbIiRxdWVyeSJdLCJ1bmlxdWVRdWVyaWVzIjpmYWxzZSwic2F2 ZUZhaWxlZFF1ZXJpZXMiOmZhbHNlLCJpdGVyYXRvck9wdGlvbnMiOnsib25BbGxM ZXZlbHMiOmZhbHNlLCJxdWVyeUJ1aWxkZXJzQWZ0ZXJJdGVyYXRvciI6ZmFsc2V9 LCJyZXN1bHRzT3B0aW9ucyI6eyJvdmVyd3JpdGUiOmZhbHNlfSwiZG9Mb2ciOiJu byIsImtlZXBVbmlxdWUiOiJObyIsIm1vcmVPcHRpb25zIjpmYWxzZSwicmVzdWx0 c1ByZXBlbmQiOiIiLCJyZXN1bHRzQXBwZW5kIjoiIiwicXVlcnlCdWlsZGVycyI6 W10sInJlc3VsdHNCdWlsZGVycyI6W3sic291cmNlIjpbMCxbImJvb2tzIiwibGlu ayJdXSwidHlwZSI6InN0cmluZ1JlcGxhY2UiLCJhcnJheSI6ImJvb2tzIiwic2Vh cmNoIjoiXFwvIiwicmVwbGFjZSI6Ii8iLCJ0byI6ImxpbmsifV0sImNvbmZpZ092 ZXJyaWRlcyI6W119fQ==