我的第一个爬虫和测试

今天的文章主要是对于上一次“球赛结果预测”的假设情况中的“比赛结束条件”做出合理的判断,来判定假设是否有效,判定是否合理~

以及今天的重头戏:做一个爬虫程序,在合理合法 的范围内爬取网站有用信息~

利用以下代码测试:

def gameOver(a,b):
    if a==11 or b==11 or abs(a-b)==2:
        return True
    else:
        return False
try:
    c=gameOver(7,11)
    print(c)
except:
    print("Error")

当前的尝试数据为7,11,符合条件,所以结果为"True":,

另一个数据为13,14:

说明比赛还没结束,还要继续比赛,

而如果此时为13,15,则比赛结束:

故代码通过检验!

关于爬虫部分!!我们先来简单学习理解一下爬虫原理及方法~

随着科技的发展,数据的获取变得尤为重要,提取数据的效率更是被看做十分重要的一环!,这时我们可以利用网络爬虫来帮助我们提高提取有用信息的效率~

利用python语言,我们可以用很多既有的函数库来实现网络爬虫:包括urllib、urllib2、urllib3、wget、requesets等,我们这里用到的是requests和beaytifulsoup4这两个函数

它们可以帮助我们完成这次的目的!

在安装完上述两个我们将要用到的函数库之后,我们就可以开始实践了。

对于requests库我们的解析:

简单的爬取网络,代码如下:

import requests
r=requests.get("https://www.baidu.com")
print(r.status_code)
print(type(r))

其中,我们利用到了一个非常常见的函数“requests.get()”,这是利用get爬取百度网站的html代码,

“r.status_code”是显示网站连接状态的函数,如果打印出来是“200”则证明是成功打开,如果是“404”则证明是网页丢失了……

最后是“type(r)”这是显示它的类型,于是将上述内容都打印则会有下面的结果(用spyter打开):

(“200”即成功,“class”就是类型)

 接下来我们做更复杂的实验:

import requests
r=requests.get("http://cn.bing.com/")
print(r.status_code)
print(r.text)
print(r.encoding)
r.encoding = 'utf-8'
print(r.text)

这是使用了更多的爬取函数的语句,我们看到结果非常吓人:

 

解释一下就是:

“text”是HTTP响应内容的字符串形式,即url对应的页面内容

“encoding“是HTTP响应内容的编码方式

接下来根据任务,我们要20次访问“必应”官网,并打印出相关信息,我写了如下代码:

import requests
for i in range(20):
    r=requests.get("http://cn.bing.com/")
    print(r.status_code)
    print(r.text)
    print(r.encoding)
    r.encoding = 'utf-8'
    print(r.text)
    print(type(r.text))
    print(type(r.content))

 结果当然是更吓人(主要是因为看上去数据很多哈哈哈):

 

这就是20次返回爬取结果,我们还是看到了它成功爬取后返回的各项信息诸如text、content的类型

接下来是比较完善的代码:

import requests
def getHTMLText(url):
    for i in range(20):
        try:
            r = requests.get(url,timeout=30)
            print(r.status_code)
            print(r.text)
            print(r.encoding)
            r.encoding = "utf-8"
            print(r.text)
        except:
            print("error!")
url = "https://www.baidu.com"
print(getHTMLText(url))

 

下面有一段html代码;

<!DOCTYPE html>

<html>

<head>

<meta charset='utf-8'>

<title>菜鸟教程(runoob.com)</title>

</head>\n<body>

<h1>我的第一标题</h1>

<p  id='frist'>我的第一段落。</p>

</body>

</table>

</html>

我们需要做以下要求:

我们有以下代码解决:

from bs4 import BeautifulSoup
import re
html = BeautifulSoup("<!DOCTYPE html>\n<html>\n<head>\n<meta charset='utf-8'>\n<title>菜鸟教程(runoob.com)</title>\n</head>\n<body>\n<h1>我的第一标题</h1>\n<p  id='frist'>我的第一段落。</p>\n</body>\n</table>\n</html>","html.parser")
print(html.head,"20") 
print(html.body)
print(html.find_all(id="first")) 
r=html.text
pattern = re.findall(u'[\u1100-\uFFFDh]+?',r)
print(pattern)

运用正则表达式,我们可以做到提取中文字符,下面是最终效果:

这样就ok拉~

我们还可以尝试来爬取更多数据并把它们整理出来,

我们选择在最好大学的网站里面爬取全国各大院校排名信息并通过一定格式将它们输出:

代码如下(使用了面向对象的设计思想):

import requests
from bs4 import BeautifulSoup
allUniv=[]
def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        return ""
def fillUnivList(soup):
    data = soup.find_all('tr')
    for tr in data:
        ltd = tr.find_all('td')
        if len(ltd)==0:
            continue
        singleUniv = []
        for td in ltd:
            singleUniv.append(td.string)
        allUniv.append(singleUniv)
def printUnivList(num):
    print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".format((chr(12288)),"排名","学校名称","省市","总分","培训规模"))
    for i in range(num):
        u=allUniv[i]
        print("{1:^4}{2:{0}^10}{3:{0}^5}{4:{0}^8.1f}{5:{0}^10}".format((chr(12288)),u[0],u[1],u[2],eval(u[3]),u[6]))
def main(num):
    url='http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    soup = BeautifulSoup(html,"html.parser")
    fillUnivList(soup)
    printUnivList(num)
main(10)

这里爬取了十行信息,最终结果如下:

根据2018年的数据,全国前十的大学就是这么几所啦~

posted @ 2019-05-22 00:42  黑棱镜  阅读(410)  评论(0编辑  收藏  举报