Сканирование веб-сайта Coursera дает разные результаты при каждом запуске. - PullRequest
0 голосов
/ 28 сентября 2019

Итак, я пытаюсь очистить некоторые сайты MOOC для моего проекта и начал с Coursera.Итак, первое, что я сделал, это почистил первую страницу «coursera.org/courses».Это сработало.Но когда я попытался выполнить итерацию с первой по десятую страницы, много раз вместо того, чтобы очищать соответствующую страницу, она очищала бы первую.

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

Какие-либо решения?

Вот фрагмент кода:

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
from selenium import webdriver

def get_site_file(url):
    try:
        driver = webdriver.Safari()
        driver.implicitly_wait(80)
        driver.get(url)
        bs=BeautifulSoup(driver.page_source,'html.parser')
        driver.close()
        return bs;
    except HTTPError as e:
        print("Site not found"+e)

def scrape_site(url):
    try:
        pgcn=get_site_file(url)
    except:
        print("Could not parse")
    try:
        discovered_courses=pgcn.find("ul",{'class':'ais-InfiniteHits-list'})
    except:
        print("Did not find something specific to the tag")
    if(pgcn==None):
        print("Page not found")
    else:
        courses=pgcn.find("ul",{'class':'ais-InfiniteHits-list'})
        for course in courses:
            try:
                course_title = course.h2.get_text()
                course_rating = course.find('span',{'class': 'ratings-text'}).\
                get_text()
                print(f"Course Title: \t {course_title}")
                print(f"Course Rating: \t {course_rating}")
                print('\n'+('|')+('<'*3)+('-'*7)+' New Course ' +('-'*7)+('>'*3)+('|')+'\n')
            except:
                print("Something went wronf when printing the courses")

for i in range(4):
    scrape_site("https://www.coursera.org/courses?query=&indices%5Bprod_all_products_term_optimization_test%5D%5Bpage%5D="+str(i+1)+"&indices%5Bprod_all_products_term_optimization_test%5D%5Bconfigure%5D%5BclickAnalytics%5D=true&indices%5Bprod_all_products_term_optimization_test%5D%5Bconfigure%5D%5BhitsPerPage%5D=10&configure%5BclickAnalytics%5D=true")
    print("\n\n")

1 Ответ

0 голосов
/ 29 сентября 2019

Одна из проблем заключается в том, что вы делаете запросы HTTP GET, когда веб-сайт ожидает запросы HTTP POST.

Вы можете смоделировать события нажатия с помощью ActionChains для выполнения запросов POST.

Другойпроблема была в том, чтобы пытаться перебрать элемент ul, вам нужно использовать find_all () для элементов li.

Вы можете использовать что-то вроде этого:

from selenium.webdriver.common.action_chains import ActionChains
from bs4 import BeautifulSoup
from selenium import webdriver


def find_courses(source):
    pgcn = BeautifulSoup(source, 'html.parser')
    if pgcn is None:
        print("Page not found")
    else:
        courses = pgcn.find_all("li", {'class': 'ais-InfiniteHits-item'})
        for course in courses:
            try:
                course_title = course.h2.get_text()
                course_rating = course.find('span', {'class': 'ratings-text'}). \
                    get_text()
                print(f"Course Title: \t {course_title}")
                print(f"Course Rating: \t {course_rating}")
                print('\n' + '|' + ('<' * 3) + ('-' * 7) + ' New Course ' + ('-' * 7) + ('>' * 3) + '|' + '\n')
            except:
                print("Something went wrong when printing the courses")

url = "https://www.coursera.org/courses?query=&indices%5Bprod_all_products_term_optimization_test%5D%5Bpage%5D=1&indices%5Bprod_all_products_term_optimization_test%5D%5Bconfigure%5D%5BclickAnalytics%5D=true&indices%5Bprod_all_products_term_optimization_test%5D%5Bconfigure%5D%5BhitsPerPage%5D=10&configure%5BclickAnalytics%5D=true"
driver = webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(80)
for i in range(3):
    element = driver.find_element_by_id('pagination_right_arrow_button')
    ActionChains(driver).move_to_element(element).perform()
    find_courses(driver.page_source)
    ActionChains(driver).click().perform()
    driver.implicitly_wait(80)
driver.quit()

Outputs:

Course Title:    Machine Learning
Course Rating:   4.9

|<<<------- New Course ------->>>|

...
Course Title:    Introduction to Data Science in Python
Course Rating:   4.5

|<<<------- New Course ------->>>|
...