9.5 KiB
9.5 KiB
In [1]:
import selenium
import time
import datetime
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from bs4 import BeautifulSoup
from IPython.display import display, Image, HTML
from jupyter_progressbar import ProgressBar
import jsonIn [3]:
def remove_kickstarter_url_prefix(url):
if url.startswith('https://www.kickstarter.com/'):
return url[len('https://www.kickstarter.com'):]
return urlIn [7]:
driver = webdriver.Chrome()
root = 'https://www.kickstarter.com/'
driver.get(root)
discover_links = {
link
for link in driver.find_elements_by_tag_name('a')
for link in [link.get_attribute('href')]
for link in [remove_kickstarter_url_prefix(link)]
if link.startswith("/discover/")
}
driver.close()
driver.quit()In [26]:
try:
driver.close()
driver.quit()
except Exception as e:
print(e)
driver = webdriver.Chrome()Request-sent
In [27]:
projects = dict()
class get_all_projects:
def __init__(self, driver):
self.driver = driver
self.total_comments = next(
int(element.text.replace(' projects', '').replace(',', ''))
for element in driver.find_elements_by_class_name('count')
if element.text.endswith(' projects')
)
def __iter__(self):
done = set()
driver.execute_script("$('.load_more > a').click()")
n_wait = 0
while driver.execute_script("return $('.load_more > a').length") > 0:
n_wait += 1
n_projects = driver.execute_script("return $('*[data-project]').length")
if n_projects > 0 or n_wait > 5:
driver.execute_script("$('.load_more > a').click()")
for item in driver.find_elements_by_css_selector('*[data-project]'):
project = json.loads(item.get_attribute('data-project'))
if project['id'] not in done:
done.add(project['id'])
driver.execute_script('$("*[data-project_pid=%d]").parent().remove()' % project['id'])
yield project
n_wait = 0
time.sleep(0.5)
def __len__(self):
return self.total_comments
for discover_link in discover_links:
driver.get(root + discover_link)
for project in ProgressBar(get_all_projects(driver)):
projects[project['id']] = project
breakFailed to display Jupyter Widget of type VBox.
If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean that the widgets JavaScript is still loading. If this message persists, it likely means that the widgets JavaScript library is either not installed or not enabled. See the Jupyter Widgets Documentation for setup instructions.
If you're reading this message in another frontend (for example, a static rendering on GitHub or NBViewer), it may mean that your frontend doesn't currently support widgets.
[0;31m---------------------------------------------------------------------------[0m [0;31mKeyboardInterrupt[0m Traceback (most recent call last) [0;32m<ipython-input-27-9f1242042551>[0m in [0;36m<module>[0;34m()[0m [1;32m 35[0m [0;32mfor[0m [0mdiscover_link[0m [0;32min[0m [0mdiscover_links[0m[0;34m:[0m[0;34m[0m[0m [1;32m 36[0m [0mdriver[0m[0;34m.[0m[0mget[0m[0;34m([0m[0mroot[0m [0;34m+[0m [0mdiscover_link[0m[0;34m)[0m[0;34m[0m[0m [0;32m---> 37[0;31m [0;32mfor[0m [0mproject[0m [0;32min[0m [0mProgressBar[0m[0;34m([0m[0mget_all_projects[0m[0;34m([0m[0mdriver[0m[0;34m)[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0m[1;32m 38[0m [0mprojects[0m[0;34m[[0m[0mproject[0m[0;34m[[0m[0;34m'id'[0m[0;34m][0m[0;34m][0m [0;34m=[0m [0mproject[0m[0;34m[0m[0m [1;32m 39[0m [0;32mbreak[0m[0;34m[0m[0m [0;32m~/.virtualenvs/kickstarter/lib/python3.5/site-packages/jupyter_progressbar/__init__.py[0m in [0;36mProgressBar[0;34m(iter, size)[0m [1;32m 30[0m [0mtsq[0m [0;34m=[0m [0;36m0[0m[0;34m[0m[0m [1;32m 31[0m [0mi[0m [0;34m=[0m [0;36m0[0m[0;34m[0m[0m [0;32m---> 32[0;31m [0;32mfor[0m [0mi[0m[0;34m,[0m [0mitem[0m [0;32min[0m [0menumerate[0m[0;34m([0m[0miter[0m[0;34m,[0m [0mstart[0m[0;34m=[0m[0;36m1[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0m[1;32m 33[0m [0;32mwhile[0m [0mi[0m [0;34m>[0m [0msize[0m[0;34m:[0m[0;34m[0m[0m [1;32m 34[0m [0msize[0m [0;34m=[0m [0msize[0m [0;34m*[0m [0;36m2[0m[0;34m[0m[0m [0;32m<ipython-input-27-9f1242042551>[0m in [0;36m__iter__[0;34m(self)[0m [1;32m 28[0m [0;32myield[0m [0mproject[0m[0;34m[0m[0m [1;32m 29[0m [0mn_wait[0m [0;34m=[0m [0;36m0[0m[0;34m[0m[0m [0;32m---> 30[0;31m [0mtime[0m[0;34m.[0m[0msleep[0m[0;34m([0m[0;36m0.5[0m[0;34m)[0m[0;34m[0m[0m [0m[1;32m 31[0m [0;34m[0m[0m [1;32m 32[0m [0;32mdef[0m [0m__len__[0m[0;34m([0m[0mself[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0m [0;31mKeyboardInterrupt[0m:
In [121]:
print(root + discover_link)
https://www.kickstarter.com//discover/newest?ref=discovery_overlay