from bs4 import BeautifulSoup
import urllib.request
import urllib.parse
import requests
# urllib.request
import re
import json
import json2html
import pandas as pd

# 
url_list ="https://www.charitywatch.org/top-rated-charities"
url_c1 = "https://www.charitywatch.org/ratings-and-metrics/naacp-legal-defense-and-educational-fund/18"

#我们先看 基金会列表页面的HTML代码下载，然后在看具体基金会介绍页面的HTML获取
page_list = urllib.request.urlopen(url_list)
soup = BeautifulSoup(page_list, 'lxml')

"""
Explanation: Entry Class For Scraping
Using TopCharities list as an example
Warning: 我可能有很多废话，但是废话里面可能也有要点...怎么办～～～
－陈晓理
0 Prelude~~~ (俗称，前戏)
网页爬虫(Scraping)是现代数据采集的重要渠道，爬虫技术应该说也一直伴随互联网的的快速发展而不断演进着。大部分网站也不甘心自己的宝贵数据就这么被爬虫给一个个爬了下来，于是网页技术中的反爬虫技巧也在不断的提高，爬虫与反爬虫这两个对手就在这‘你来我往’中不断提升各自的修行。
我们这一次开一个头，先解决9.9公益日面对的问题，由此稍微展开一小点，让彭小天天朋友以小见大，以后见到其他的类型的时候，不会慌，知道应该往哪个方向寻找解决方案
在讲网页爬虫之前，我们要先讲一下网页web page，我们爬数据都是从网页上爬下来，那网页是怎样的一种格式？我们到底爬的是什么东西？
我们看到的网页都是有浏览器解析后的呈现，浏览器解析的是网页的代码文件。网页代码常见文件很多，最基本的是 html, css, javascript, 其中

html是大结构
css是用来格式化这个大结构，让它变得更漂亮更有展现力
javascript就是更灵活更强大的工具，来执行更丰富的功能

用我的话来说，html 搭建的是骨架，肌肉和皮肤

css来做丰胸，垫下巴，割双眼皮，美发染发

Javascript就是用一个大的鼓风机把你的人吹得更飘逸，更动感，更迷人～～～

可以了可以了，看个十七八遍就行了。梦想是美好的，现实是骨感的。我们讲网络爬虫呢，主要还是针对html，诶，诶，不要走啊，不要走啊～～～～
你要这样想，我们都是真诚的人，我们都喜欢透过现象看本质，要抓重点，有了重点，才有李云龙，才有新垣结衣，来来来，我们来看看html长成什么样子
1 HTML长什么样

这是一般的结构，看起来如果不习惯的话，没关系，我想一个例子



比如在这里，我们需要网络爬虫沿着html的层级结构，定位到乔帮主的姓名和生卒年信息在哪个标签里面，然后copy下来。
但首先，我们需要查看html代码，确定这样的信息能不能爬下来，应该用什么样的方法来爬，然后用人工的方式定位这些信息的位置，然后再用其他工具，将人工定位转为用工具来识别位置的特征，实现定位。
所以，最基本的网络爬虫中，有两个方面是最主要的：
通过查看html网页结构，我们必须了解
1. 数据来源类型
2. 定位数据位置
2 来看看 美国 charity watch 结果页面的网页结构
地址：https://www.charitywatch.org/top-rated-charities
这里有若干知识点
2.0 首先，如何查看给定网页的html代码？
来来来，这样，以chrome为例，将网址（https://www.charitywatch.org/top-rated-charities） copy到地址栏，回车，然后在页面上用鼠标右键点击，选择 inspect  ，chrome就将你带入查看网页代码的界面了

2.1 查看html结构，确定数据位置和来源
点击页面右上方的Elements一栏，进入HTML代码查看页面，

我们可以清楚的看到HTML的层次结构，点击小三角还能够展开这一项的内容，同时，左边页面将显示该段代码对应的网页位置。
我们也可以直接用鼠标右键移到左边网页中的位置，右键点击，然后在出现菜单中点击inspect，就可以在右侧的代码页面中看到对应的代码，非常方便

这里有几个关键信息：

基金会具体详情的页面url
基金会名称

有了具体基金会的详情页面，我们点开进去看看


我们来设置以下任务，我们对这些基金会的 Calfulated Total Expenses 感兴趣，要搜集这样的信息，那么怎么做？
同样我们可以在 页面中 “Calculated Total Expenses (rounded): $15,000,000“ 的位置用右键激活inspect 模式

在HTML中，我们看到了相应的信息以及他们的位置，那我们试着把这页html拿下来，仔细看看怎么爬。
2.2 动手下载并读取网页HTML
我们要用到的是python 的几个经典包，包括 BeautifulSoup, urllib, 或者requests
End of explanation
"""


print(soup.prettify())#可以用 ctrl+F 来搜索关键词  id="results"  然后就可以看到相应的HTML代码

"""
Explanation: 该网页的 HTML信息就存到了soup这个变量里面，然后我们看一看这些HTML信息是什么
End of explanation
"""


#用beautiful soup 的一个强大功能 ‘find_all’
# find_all既可以直接定位标签，find_all('div') 这样就把所有的div都抓出来

# 也可以搜索满足参数条件的内容来定位我们关注的结构，
# 比如说这里我们看到 id="results"，这是 id 这个参数内容是 results
charities = soup.find_all(id="results") 

charities[0]

# 再把这个树形结构里面所有的 a 标签 爬下来

charities_a = charities[0].find_all('a')

charities_a

"""
Explanation: 2.3 从基金会列表页面搜集详细信息页资料
因为我们看到，HTML对应的基金会列表代码，是在一个 < div class="small-12 medium-8 column" id="results" > 的结构中，div 是这个结构的标签，class, id 是它的参数。那么我们把这个大的结构抓出来，再到这里面去找信息，逻辑上是讲得通的。
那么怎样定位？
我们可以沿着层次树桩结构，一层一层的走到这一步，比如说 沿着标签 head->body->div->等等
也可以根据标签的一些特性，直接定位，比如说我们这个标签 div 的 参数id 内容是 results，搜了一下，这一页就只有这样的一个id="results"的标签，那么用参数id就可以直接定位了
End of explanation
"""


charities_ratings_and_metrics = charities[0].find_all(href=re.compile("/ratings-and-metrics"))

charities_ratings_and_metrics

"""
Explanation: 这里我可以用find_all的一些其他的用法，比如说我要用正则表达式去抓href中带有 'ratings-and-metrics' 关键字的结构及其信息，实现同样的效果
End of explanation
"""


sample = charities_ratings_and_metrics[0]

sample['href']

sample.text

print(sample)

sample_url = 'https://www.charitywatch.org' + sample['href']

sample_url

charity_page = requests.get(sample_url).text

bs_charity_page = BeautifulSoup(charity_page,'lxml')

print(bs_charity_page.prettify)

bs_charity_page.find_all('span',class_="larger",style="font-weight:normal;")

"""
Explanation: 那么根据这个列表，我随便找一家基金会，找出它的相信信息网页，并抓出资金信息
End of explanation
"""


charity = charities_ratings_and_metrics[0]
charity['href']

results = dict()


for charity in charities_ratings_and_metrics:
    url = 'https://www.charitywatch.org' + charity['href']
    print(url)
    charity_page = requests.get(url).text
    bs_charity_page = BeautifulSoup(charity_page,'lxml')
    fundings = bs_charity_page.find_all('span',class_="larger",style="font-weight:normal;")
    funding = fundings[0]
    name = charity.text
    results[name] = funding.get_text()
    

results

results.

pd.DataFrame(results)

"""
Explanation: 在第一个span标签中的内容是我们需要的
以下我们来把整个流程都串起来
End of explanation
"""


