链接B站,嵩天老师零基础学习视频:https://www.bilibili.com/video/av19391909?p=2
程序设计语言:编译型,一次性执行结束(c语言)和解释型,逐条执行,便于维护(JavaScript,python等脚本语言)
拿到一个问题时:
- 分析问题的计算部分
- 确定功能,使用IPO方法进一步分析:输入;处理;输出。I(输入input)P(处理process)O(output输出)分析"
- 设计算法:计算公式
- 编写程序
- 运行调试程序
程序设计的步骤:
- 确定程序的IPO
- 编写程序
- 调试程序
问题小练习:如何利用温度摄氏度和huashi华氏度进行转换?
I(输入input)P(处理process)O(output输出)分析;
设计算法:
C = (F - 32)/ 1.8
F = C * 1.8 + 32
源码如下:
1 while (True): 2 content = str(input('请输入当前温度:')) 3 if content[-1] in ["c","C"]: 4 huashi = int(content[:-1]) * 1.8 + 32 5 print("当前温度为摄氏度{a},转化为华氏度{b}".format(a = content,b = str(huashi) + 'F')) 6 elif content[-1] in ['f','F']: 7 sheshi = (int(content[:-1])- 32) / 1.8 8 print('当前温度为华氏度{0},转化为摄氏度{1}'.format(content,str(sheshi) + 'C')) 9 else: 10 print('输入有误')
为了提高学习兴趣,跟着嵩天老师学习了一下turtle库,这个库可以在图形化页面生成图形。
下面一段是一段生成蟒蛇源码,大家可以自己敲一下,或者直接点击源码顶部按钮,然后复制即可。
不懂得地方自行百度,搜索能力是必备的。
下面的源码,利用是函数调用。先调用main(),然后从main()函数里面调用drawSnake()函数,def 是定义函数。里面的参数,嵩天老师都已经讲解,我也注释出来了。至于源码怎么编写的,暂时不需要了解,只要先明白大概源码的作用就OK了。
1 import turtle 2 def drawSnake(rad,angle,len,neckrad): 3 for i in range(len): 4 turtle.circle(rad,angle) # rad表示爬行圆形轨迹的半径位置,正值为左,负值为右,angle表示小乌龟爬行的弧度值 5 turtle.circle(-rad,angle) 6 turtle.circle(rad,angle/2) 7 turtle.fd(rad) # forward简写,代表爬行的直线距离 8 turtle.circle(neckrad+1,180) 9 turtle.fd(rad*2/3) 10 11 def main(): 12 turtle.setup(1300,800,0,0) # 长度,高度,左上角坐标起始点 13 pythonsize = 60 14 turtle.pensize(pythonsize) # 宽度,小乌龟宽度 15 turtle.pencolor("green") # 小乌龟走过的轨迹颜色 16 turtle.seth(-40) # 小乌龟开始爬行的角度方向,参照数学象限 17 drawSnake(40,80,5,pythonsize/2) 18 main()
生成结果如下:
数据类型
数据类型就不详细介绍了,整型,浮点型,复数型,字符型,文件型,元组,列表,集合,字典等。
接下来学习数字类型(输一下下面的例子看看结果就知道区别,同时可以用下面的函数方法对其类型转换):
- 整型 int(4) 转为整数
- 浮点型 float(4) 转为浮点数
- 复数型 complex(4) 转换成复数
转换方法就是:int(),float(),complex()
运算方法:
字符串切片索引
下面一个小练习,最好对应嵩天老师的视频观看,简单的内容就不详述了,看视频了解。
输入1到7,然后打印出分别对应的星期一到星期日
下面是本人作出的源码,稍微多加了一点以后要写到的内容,其中包括循环,函数,__main__,__name__方法。不必纠结个别不懂得地方,船到桥下自然直,等你学到这,自然就会了,笔者也是这样过来的。
1 def cal(): 2 ''' 3 输入1到7,然后打印出分别对应的星期一到星期日 4 ''' 5 for i in range(20): 6 content = "星期一星期二星期三星期四星期五星期六星期日" 7 a = int(input('请输入星期几,输入用1到7数字代表:')) 8 if a in list(range(1,8)): 9 index = a * 3 10 output = content[index-3:index] 11 print(output) 12 else: 13 print("请重新输入") 14 continue 15 if __name__ == '__main__': 16 cal()
列表的操作
小游戏,利用turtle库绘制五角星并填充。可以复制这段代码运行一下,同样试着更改一下参数,看看有什么变化。
1 from turtle import Turtle 2 p = Turtle() 3 p.speed(1) 4 p.pensize(5) 5 p.color('black','yellow') 6 p.begin_fill() 7 for i in range(5): 8 p.fd(200) 9 p.right(144) 10 p.end_fill()
输出结果:
词云:如下图所示
源码如下,尝试手动输出:
输入前请安装jieba库、wordcloud库、以及scipy库,安装方式pip install 库名
下面划线的部位根据自己文档和图片,字体的实际路径填写。
源码:
1 import jieba 2 from wordcloud import WordCloud,STOPWORDS 3 from scipy.misc import imread 4 import matplotlib.pyplot as plt 5 # 读取文件 6 obj_content = open("C:/Users/Desktop/ciyun.txt",'r') 7 text= obj_content.read() 8 # 对文本进行分词 9 cut_text = ''.join(jieba.cut(text)) 10 # 读取图片 11 picture = imread("C:/Users/Desktop/timg.jpg") 12 # 导入字体 13 cloud = WordCloud(font_path = "C:/Users/Desktop/simsun.ttc", 14 background_color = 'white', 15 mask = picture, 16 max_words = 3000, 17 max_font_size = 40) 18 word_cloud = cloud.generate(cut_text) 19 # 输出图片 20 plt.axis('off') 21 plt.imshow(word_cloud) 22 plt.show()
网络爬虫---robots协议
robots协议就是不被允许的爬虫
例子:看一下百度的robots协议
网址:http://www.baidu.com/robots.txt
User-agent:后面指的被百度禁止的恶意爬虫,
disallow:后面的是被禁止的通配符类型,最后一个不允许爬虫访问的资源目录
京东的robots协议,被京东禁止的爬虫。在网址后面加/robots.txt就可以了。https://www.jd.com/robots.txt
QQ的robots协议https://www.qq.com/robots.txt
爬取网页源码通用框架:(为防止异常外加try :语句 except:语句)
1 # 通用爬取网页的代码框架 2 import requests 3 def getHtmlText(url): 4 try: 5 r = requests.get(url,timeout = 5) 6 r.raise_for_status() # 如果状态不是200,引发HttpError异常 7 r.encoding = r.apparent_encoding 8 return r.text 9 except : # except Exception as e 10 return "产生异常" 11 if __name__ == '__main__': 12 url = "www.baidu.com" 13 print(getHtmlText(url))
实例一:
爬取京东商城手机信息:https://item.jd.com/5853575.html
过程如下:
源码:
1 # 通用爬取网页的代码框架 2 import requests 3 def getHtmlText(url): 4 try: 5 r = requests.get(url,timeout = 5) 6 r.raise_for_status() # 如果状态不是200,引发HttpError异常 7 r.encoding = r.apparent_encoding 8 return r.text[:1000] 9 except : # except Exception as e 10 return "产生异常" 11 if __name__ == '__main__': 12 url = "https://item.jd.com/5853575.html" 13 print(getHtmlText(url)) 14
运行结果和上面截图一样。
实例二:
爬取亚马逊商城商品信息:
1 import requests 2 url = 'https://www.amazon.cn/dp/B07G5Z9H8R/ref=lp_106200071_1_1?s=pc&ie=UTF8&qid=1546562300&sr=1-1' 3 try: 4 kv = {"user_agent":"Mozilla/5.0"} 5 r = requests.get(url,headers = kv) 6 r.raise_for_status() 7 r.encoding = r.apparent_encoding 8 print(r.text[1000:2000]) # 返回字符串一万多行,截取了一部分字符串 9 except: 10 print("异常返回")
实例三:
爬取苏宁易购ipad商品信息
1 import requests 2 url = 'https://product.suning.com/0000000000/10400501623.html?safp=d488778a.13701.productWrap.1' 3 # 请求头 模拟浏览器登陆 4 kv = {"user-agent":"Mozilla/5.0"} 5 try: 6 r = requests.get(url,headers = kv) 7 r.raise_for_status() 8 r.encoding = r.apparent_encoding 9 print(r.text[:1000]) 10 except: 11 print("爬取失败")
百度搜索关键词借口:https://www.baidu.com/s?wd=keyword
1 import requests 2 url = 'http://www.baidu.com/s' 3 kv = {'wd':"python"} 4 try: 5 r = requests.get(url,params = kv) 6 r.raise_for_status() 7 r.encoding = r.apparent_encoding 8 print(r.request.url) 9 print(len(r.text)) 10 except: 11 print("爬取失败") 12 13 import requests 14 url = 'http://www.baidu.com/s' 15 kv = {'wd':"赵蕴卓"} 16 try: 17 r = requests.get(url,params = kv) 18 r.raise_for_status() 19 r.encoding = r.apparent_encoding 20 print(r.request.url) 21 print(len(r.text)) 22 except: 23 print("爬取失败")
搜狗搜索关键字接口:https://www.sogou.com/web?query=keyword
1 import requests 2 url = 'http://www.sougou.com/web' 3 kv = {'query':"python"} 4 try: 5 r = requests.get(url,params = kv) 6 r.raise_for_status() 7 print(r.request.url) 8 print(len(r.text)) 9 except: 10 print('搜索失败')
360搜索关键词接口:https://www.so.com/s?q=keyword
1 import requests 2 url = 'https://www.so.com/s' 3 kv = {"q":"python"} 4 try: 5 r = requests.get(url,params = kv ) 6 r.raise_for_status() 7 r.encoding = r.apparent_encoding 8 print(r.request.url) 9 print(len(r.text)) 10 except: 11 print('爬取错误')
爬取网页图片并存储:
1 import requests 2 import os 3 import time 4 url = 'http://wx1.sinaimg.cn/bmiddle/b4d7da4cly1fdk29b03dwj22c03407wi.jpg' 5 root = 'D://pics//' 6 path = root + url.split('/')[-1] 7 try: 8 if not os.path.exists(root): 9 os.mkdir(root) 10 if not os.path.exists(path): 11 r = requests.get(url) 12 with open(path,'wb') as f: 13 f.write(r.content) 14 f.close() 15 time.sleep(3) 16 print('下载完成') 17 else: 18 print("该文件已存在") 19 20 except: 21 print("爬取失败")
利用ip138查询接口查询输入ip地址的归属地http://www.ip138.com/
查看网页的ip地址可以在dos页面输入 ping + 网址(不加http协议) ,例如:ping www.baidu.com
ip以我校ip地址为例
1 # 查询ip地址 2 import requests 3 url = 'http://www.ip138.com/ips138.asp?ip=' 4 5 try: 6 r = requests.get(url + "60.175.65.100") 7 r.raise_for_status() 8 r.encoding = r.apparent_encoding 9 print(r.text[7100:7400]) 10 except: 11 print('查询失败')
BeautifulSoup库---美味汤
语法两行搞定:
from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>data</p>','html.parser'),第二个参数是解析方法
1 url = 'https://python123.io/ws/demo.html' 2 import requests 3 from bs4 import BeautifulSoup 4 r = requests.get(url) 5 demo = r.text 6 soup = BeautifulSoup(demo,'html.parser') 7 print(soup.prettify())
案例:最好大学排名 http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
爬取大学排名信息:
源码如下
1 import requests 2 from bs4 import BeautifulSoup 3 import bs4 4 def getHtmlText(url): 5 '''提取html''' 6 try: 7 r = requests.get(url,timeout = 30) 8 r.raise_for_status() 9 r.encoding = r.apparent_encoding 10 return r.text 11 except: 12 return "" 13 14 def fillUnivList(ulist,html): 15 '''提取关键信息,填到列表中,这是一个二维列表 16 列表里面的每一个元素是一个学校信息,每一个元素 17 仍是一个含有三个元素的列表''' 18 soup = BeautifulSoup(html,'html.parser') 19 for tr in soup.find('tbody').children: 20 if isinstance(tr,bs4.element.Tag): 21 tds = tr('td') 22 ulist.append([tds[0].string,tds[1].string,tds[2].string]) 23 24 25 def printUnivList(ulist,num): 26 ''''输入表头,和输出排名信息''' 27 plt = "{0:{3}<10} {1:{3}^10} {2:{3}>10}" # ^居中对齐;<左对齐;>右对齐; 28 print(plt.format('排名','学校','总分',chr(12288))) # chr(12288)中文空格填充,放在对齐符号前面记住就行。 29 for i in range(num): 30 u = ulist[i] 31 print(plt.format(u[0],u[1],u[2],chr(12288))) 32 print('Suc' + str(num)) 33 def main(): 34 unifo = [] 35 url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html' 36 html = getHtmlText(url) 37 fillUnivList(unifo,html) 38 printUnivList(unifo,20) 39 main() 40
输入结果:
正则表达式