Веб-сайт, который имеет кнопку, чтобы нажать - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь создать веб-сайт с несколькими страницами, отображаемыми на JavaScript (https://openlibrary.ecampusontario.ca/catalogue/). Я могу получить контент с первой страницы, но я не уверен, как заставить мой скрипт нажимать на кнопки на следующих страницах, чтобы получить этот контент. Вот мой сценарий.

import time
from bs4 import BeautifulSoup as soup
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json

# The path to where you have your chrome webdriver stored:
webdriver_path = '/Users/rawlins/Downloads/chromedriver'

# Add arguments telling Selenium to not actually open a window
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--window-size=1920x1080')

# Fire up the headless browser
browser = webdriver.Chrome(executable_path = webdriver_path,
chrome_options = chrome_options)

# Load webpage
url = "https://openlibrary.ecampusontario.ca/catalogue/"
browser.get(url)

# to ensure that the page has loaded completely.
time.sleep(3)

data = [] 

# Parse HTML, close browser
page_soup = soup(browser.page_source, 'lxml')
containers = page_soup.findAll("div", {"class":"result-item tooltip"})

for container in containers:
    item = {}
    item['type'] = "Textbook"
    item['title'] = container.find('h4', {'class' : 'textbook-title'}).text.strip()
    item['author'] = container.find('p', {'class' : 'textbook-authors'}).text.strip()
    item['link'] = "https://openlibrary.ecampusontario.ca/catalogue/" + container.find('h4', {'class' : 'textbook-title'}).a["href"]
    item['source'] = "eCampus Ontario"
    item['base_url'] = "https://openlibrary.ecampusontario.ca/catalogue/"
    data.append(item) # add the item to the list

with open("js-webscrape-2.json", "w") as writeJSON:
    json.dump(data, writeJSON, ensure_ascii=False)

browser.quit()

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Вы не должны фактически нажимать на любую кнопку.Например, чтобы искать элементы с ключевым словом «электричество», вы переходите по URL-адресу

https://openlibrary-repo.ecampusontario.ca/rest/filtered-items?query_field%5B%5D=*&query_op%5B%5D=matches&query_val%5B%5D=(%3Fi)electricity&filters=is_not_withdrawn&offset=0&limit=10000

. Это вернет строку элементов json с первым элементом:

{"items":[{"uuid":"6af61402-b0ec-40b1-ace2-1aa674c2de9f","name":"Introduction to Electricity, Magnetism, and Circuits","handle":"123456789/579","type":"item","expand":["metadata","parentCollection","parentCollectionList","parentCommunityList","bitstreams","all"],"lastModified":"2019-05-09 15:51:06.91","parentCollection":null,"parentCollectionList":null,"parentCommunityList":null,"bitstreams":null,"withdrawn":"false","archived":"true","link":"/rest/items/6af61402-b0ec-40b1-ace2-1aa674c2de9f","metadata":null}, ...

Теперь, чтобы получить этот элемент, вы используете его uuid и переходите к:

https://openlibrary.ecampusontario.ca/catalogue/item/?id=6af61402-b0ec-40b1-ace2-1aa674c2de9f

Вы можете действовать таким образом для любого взаимодействия с этим сайтом (это не всегда работает для всех сайтов, но этоработает на вашем веб-сайте).

Чтобы узнать, по каким URL-адресам переходят, когда вы нажимаете такую-то кнопку или вводите текст (то, что я делал для приведенных выше URL-адресов), вы можете использовать fiddler.

0 голосов
/ 16 мая 2019

Я сделал небольшой сценарий, который может вам помочь (селен).

то, что делает этот скрипт, это «пока последняя страница каталога не выбрана (в данном случае содержит« selected »в своем классе), я удалю ее, затем нажимаю next»

while "selected" not in driver.find_elements_by_css_selector("[id='results-pagecounter-pages'] a")[-1].get_attribute("class"):
    #your scrapping here
    driver.find_element_by_css_selector("[id='next-btn']").click()

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

Надеюсь, это поможет

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