from bs4 import BeautifulSoup
import requests
import pandas as pd

url = "https://coinmarketcap.com/all/views/all/"

# puting headers to make a crawler looks human like + using request lib

headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit 537.36 (KHTML, like Gecko) Chrome",
           "Accept": "text/html,application/xhtml+xml,application/xml; q=0.9,image/webp,*/*;q=0.8"}

response = requests.get(url, headers=headers)



soup = BeautifulSoup(response.text, "html.parser")
positions = soup.findAll("td", {"class":"cmc-table__cell cmc-table__cell--sticky cmc-table__cell--sortable cmc-table__cell--left cmc-table__cell--sort-by__rank"})
names = soup.findAll("div", {"class":"cmc-table__column-name sc-1kxikfi-0 eTVhdN"})
symbols = soup.findAll("td", {"class":"cmc-table__cell cmc-table__cell--sortable cmc-table__cell--left cmc-table__cell--sort-by__symbol"})
marketcaps = soup.findAll("td", {"class": "cmc-table__cell cmc-table__cell--sortable cmc-table__cell--right cmc-table__cell--sort-by__market-cap"})
prices = soup.findAll("td", {"class": "cmc-table__cell cmc-table__cell--sortable cmc-table__cell--right cmc-table__cell--sort-by__price"})
supplies = soup.findAll("td", {"class": "cmc-table__cell cmc-table__cell--sortable cmc-table__cell--right cmc-table__cell--sort-by__circulating-supply"})
volumes = soup.findAll("td", {"class": "cmc-table__cell cmc-table__cell--sortable cmc-table__cell--right cmc-table__cell--sort-by__volume-24-h"})
hours = soup.findAll("td", {"class": "cmc-table__cell cmc-table__cell--sortable cmc-table__cell--right cmc-table__cell--sort-by__percent-change-1-h"})
days = soup.findAll("td", {"class": "cmc-table__cell cmc-table__cell--sortable cmc-table__cell--right cmc-table__cell--sort-by__percent-change-24-h"})
weeks = soup.findAll("td", {"class": "cmc-table__cell cmc-table__cell--sortable cmc-table__cell--right cmc-table__cell--sort-by__percent-change-7-d"})

# collecting positions

mypositions = []
for position in positions:
    mypositions.append(position.text)
    
# collecting names in a list

mynames_list = []
for name in names:
    mynames_list.append(name.text)
  
# collecting symblos in a list

mysymbols_list = []
for symbol in symbols:
    mysymbols_list.append(symbol.text)    
    
# collecting a list of market caps

mymarketcap_list = []
for marketcap in marketcaps:
    mymarketcap_list.append(marketcap.text)

# collecting prices

myprices_list = []
for price in prices:
    myprices_list.append(price.text)
    
# collecting circulating prices

mysupplies_list = []
for supply in supplies:
    mysupplies_list.append(supply.text)

# collecting volumes

myvolumes_list = []
for volume in volumes:
    myvolumes_list.append(volume.text)

# collecting hours

myhours_list = []   
for hour in hours:
    myhours_list.append(hour.text)

# collecting days

mydays_list = []
for day in days:
    mydays_list.append(day.text)
 
# collecting weeks
myweeks_list = [] 
for week in weeks:
    myweeks_list.append(week.text)
    
    
# creating CSV file
data_frame = pd.DataFrame({
    "#": mypositions,
    "Name": mynames_list,
    "Symbol": mysymbols_list,
    "Market Cap": mymarketcap_list,
    "Price": myprices_list,
    "Circulating supply": mysupplies_list,
    "Volume(24H)": myvolumes_list,
    "%1H": myhours_list,
    "%24H": mydays_list,
    "%7": myweeks_list
    
})
print(data_frame) 
data_frame.to_csv("CoinmarketCap.csv", )
"""
you can also get html 
data_frame.to_csv("CoinmarketCap.csv",)
you can get pdf 
from weasyprint import HTML
HTML(string=html_out).write_pdf("report.pdf")
"""