初出茅庐----程序测试与爬虫
一、对程序进行测试
测试采用体育竞技模拟分析程序代码
测试一个函数:
代码实现如下
1 def gameover(a,b): 2 if a>=11 and (a-b)>=2: 3 print(a) 4 if b>=11 and (b-a)>=2: 5 print(b) 6 try: 7 gameover() 8 except: 9 print("error") 10
11 a,b=eval(input("请输入测试值:")) 12 gameover(a,b)
结果如图所示(只有输入的数据准确,才会输入数值)
测试多组数据:(暂时不懂)
二、爬虫-----request库
1.request库的安装
在命令行输入pip install request,即可自动下载安装
2.request的使用
(1)request库的网页请求函数
函数 | 描述 |
get(url[,timeot=n]) | 对应于HTTP的GET方式,获取网页最常用的方法,可以增加timeout=n参数,设定每次请求超时时间为n秒 |
post(url,data={'key':'value'}) | 对应于HTTP的POST方式,其中字典用于传递客户数据 |
delete(url) | 对应于HTTP的DELETE方式 |
head(url) | 对应于HTTP的HEAD方式 |
option(url) | 对应于HTTP的OPTIONS方式 |
put(url,data={'key':'value'}) | 对应于HTTP的PUT方式,其中字典用于传递客户数据 |
(2)respomse对象的属性
属性 | 描述 |
status_code | HTTP请求的返回状态,整数,200表示连接成功,404表示失败 |
text | HTTP响应内容的字符串形式,即url对应的网页内容 |
encoding | HTTP响应内容的编码方式 |
content | HTTP响应内容的二进制形式 |
(3)response对象的方法
方法 | 描述 |
json() | 如果HTTP响应内容包含json格式数据,则该方法解析json数据 |
raise_for_status() | 如果不是200,则产生异常 |
3.牛刀小试
1.用request库爬取百度网页内容,并且打印20次
代码实现如下
1 import requests 2 def gethtmltext(url): 3 try: 4 r=requests.get(url,timeout=30) 5 r.raise_for_status() 6 r.encoding='utf-8'
7 return r.text 8 except: 9 return ""
10
11 url="https://www.baidu.com"
12 for i in range(20): 13 print(gethtmltext(url))
结果如图所示(由于打印的内容比较多,这里就不一一展示了)
2.计算text属性和content属性所返回网页内容的长度
代码实现如下
1 import requests 2 def gethtmltext(url): 3 try: 4 r=requests.get(url,timeout=30) 5 r.raise_for_status() 6 r.encoding='utf-8'
7 return len(r.text),len(r.content) 8 except: 9 return ""
10
11 url="https://www.baidu.com"
12 print(gethtmltext(url))
结果如图所示
三、对网页进行查找(BeautifulSoup4库)
1.BeautifulSoup库的安装
命令行中输入
pip install beautifulsoup4
即可自动下载安装
2.BeautifulSoup的引用
>>>from bs4 import BeautifulSoup
3.BeautifulSoup的常用函数
(1)BeautifulSoup对象的常用属性
属性 | 描述 |
head | HTTP页面的<head>内容 |
title | HTTP页面标题,在<head>之中,由<title>标记 |
body | HTTP页面中的<body>内容 |
p | HTTP页面中第一个<p>内容 |
strings | HTTP页面所有呈现在web上的字符串,即标签内容 |
stripped_strings | HTTP页面所有呈现在web上的非空格字符串 |
(2)标签对象的常用属性
属性 | 描述 |
name | 字符串,标签的名字,比如div |
attrs | 字典,包含了原来页面Tag所有的属性,比如href |
contents | 列表,这个Tag下所有子Tag的内容 |
string | 字符串,Tag所包围的文本,网页中真实的文字 |
4.获取网页内容
代码实现如下
1 html = '''<!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>菜鸟教程(runoob.com)</title> 6 </head> 7 <body> 8 <h1>我的第一个标题</h1> 9 <p>我的第一个段落。</p> 10 </body> 11 </html>''' 12 13 import re 14 def getChinese(html): 15 html_unicode=html.strip() 16 string=re.compile('[^\u4e00-\u9fff]') 17 chinese="".join(string.split(html_unicode)) 18 return chinese 19 from bs4 import BeautifulSoup 20 soup=BeautifulSoup(html) 21 print("获取head标签内容:") 22 print(soup.head) 23 print("学号号数为11") 24 print() 25 print("获取body标签内容:") 26 print(soup.body) 27 print() 28 print(soup.title) 29 print()
30 print("获取html中的中文字符") 31 print(getChinese(html))
结果如图所示
四、爬取大学排名(2015年排名)
代码实现如下
1 ''' 2 爬取中国大学排名 3 author:xiayiLL 4 ''' 5 import requests 6 from bs4 import BeautifulSoup 7 allUniv=[] 8 def getHTMLText(url): 9 try: 10 r=requests.get(url,timeout=30) 11 r.raise_for_status() 12 r.encoding='utf-8' 13 return r.text 14 except: 15 return "" 16 17 def fillUnivList(soup): 18 data=soup.find_all('tr') 19 for tr in data: 20 ltd=tr.find_all('td') 21 if len(ltd)==0: 22 continue 23 singleUniv=[] 24 for td in ltd: 25 singleUniv.append(td.string) 26 allUniv.append(singleUniv) 27 28 def printUnivList(num): 29 print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}".format(chr(12288),"排名","学校名称","省市","总分")) 30 for i in range(num): 31 u=allUniv[i] 32 print("{1:^4}{2:{0}^10}{3:{0}^5}{4:{0}^8}".format(chr(12288),u[0],u[1],u[2],eval(u[3]))) 33 34 def main(num): 35 url='http://www.zuihaodaxue.com/zuihaodaxuepaiming2015_1.html' 36 html=getHTMLText(url) 37 soup=BeautifulSoup(html,"html.parser") 38 fillUnivList(soup) 39 printUnivList(num) 40 41 main(10)
结果如图所示