GYH's Blog - Python
type: channel
link: https://www.imgyh.com/category/python/
description: Python学习笔记
items: requests详解
items: BeautifulSoup详解
items: Python数据可视化
items: Python网络爬虫

requests详解
type: item
date: 2021-01-29T10:53:00+08:00
description: 发送请求HTTP请求类型有这么几种：GET，POST，PUT，DELETE，HEAD 以及 OPTIONS，下面分别进行介绍requestrequest是requests中的一个重要方法，所有的HTTP请求都是基于这个方法request(method, url, **kwargs)method：请求方式OPTIONS, HEAD, POST, PUT, PATCH, or DELETEurl：请求的网址**kwargs：其他可选参数params：字典或字节序列，作为参数增加到url中data：字典、字节序列或文件对象，作为Request的内容json：JSON格式的数据，作为Request的内容。headers：字典，HTTP定制请求头cookies：字典或CookieJar，Request中的cookiefiles：字典，用于传输文件auth：元组，支持HTTP的认证功能timeout：设定超时时间，单位为秒allow_redirects：布尔，重定向开关。默认Trueproxies：字典，设定代理服务器，可以增加登录认证verify：布尔，认证SSL证书的开关。默认Truestream：布尔，获取内容立即下载开关。默认Truecert：本地SSL证书路径stream：布尔，获取内容立即下载开关。默认TrueGET请求get(url, params=None, **kwargs)参数与上面的request一致，例如：r = requests.get('https://api.github.com/events')POST请求post(url, data=None, json=None, **kwargs)参数与上面的request一致，例如：r = requests.post('http://httpbin.org/post', data = {'key':'value'})PUT请求put(url, data=None, **kwargs)参数与上面的request一致，例如：r = requests.put('http://httpbin.org/put', data = {'key':'value'})DELETE请求delete(url, **kwargs)参数与上面的request一致，例如：r = requests.delete('http://httpbin.org/delete')HEAD请求head(url, **kwargs)参数与上面的request一致，例如：r = requests.head('http://httpbin.org/get')OPTIONS请求options(url, **kwargs)参数与上面的request一致，例如：r = requests.options('http://httpbin.org/get')向url传递参数url_params = {'key':'value'} # 字典传递参数，如果值为None的键不会被添加到url中 r = requests.get('your url',params = url_params) print(r.url) # 打印内容your url?key=value响应内容r.encoding #获取当前的编码 r.encoding = 'utf-8' #设置编码 r.text #以encoding解析返回内容。字符串方式的响应体，会自动根据响应头部的字符编码进行解码。 r.content #以字节形式（二进制）返回。字节方式的响应体，会自动为你解码 gzip 和 deflate 压缩。 r.request.headers #获取请求头 r.headers #以字典对象存储服务器响应头，但是这个字典比较特殊，字典键不区分大小写，若键不存在则返回None r.headers['Content-Type'] #访问headers的Content-Type内容 r.headers.get('Content-Type') #访问响应头部分内容的两种方式 r.request._cookies #获取请求的cookie r.cookies #获取响应的cookie r.cookies['example_cookie_name'] #读取cookies r.history #返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向 r.status_code #响应状态码 r.raw #返回原始响应体，也就是 urllib 的 response 对象，使用 r.raw.read() r.ok # 查看r.ok的布尔值便可以知道是否登陆成功 #*特殊方法*# r.json() #Requests中内置的JSON解…

BeautifulSoup详解
type: item
date: 2021-01-28T22:03:00+08:00
description: BeautifulSoup4简介参考： http://www.jsphp.net/python/show-24-214-1.htmlBeautifulSoup4是爬虫必学的技能。BeautifulSoup最主要的功能是从网页抓取数据，Beautiful Soup自动将输入文档转换为Unicode编码，输出文档转换为utf-8编码。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器，如果我们不安装它，则 Python 会使用 Python默认的解析器，lxml 解析器更加强大，速度更快，推荐使用lxml 解析器。BeautifulSoup4和 lxml 一样，Beautiful Soup 也是一个HTML/XML的解析器，主要的功能也是如何解析和提取 HTML/XML 数据。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器，如果我们不安装它，则 Python 会使用 Python默认的解析器，lxml 解析器更加强大，速度更快，推荐使用lxml 解析器。Beautiful Soup自动将输入文档转换为Unicode编码，输出文档转换为utf-8编码。你不需要考虑编码方式，除非文档没有指定一个编码方式，这时，Beautiful Soup就不能自动识别编码方式了。然后，你仅仅需要说明一下原始编码方式就可以了。BeautifulSoup4主要解析器，以及优缺点BeautifulSoup4简单使用假设有这样一个Html，具体内容如下： 百度一下，你就知道 新闻 hao123 地图 视频 贴吧 更多产品 from bs4 import BeautifulSoup file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html,"html.parser") # 缩进格式 print(bs.prettify()) # 格式化html结构 print(bs.title) # 获取title标签的名称 print(bs.title.name) # 获取title的name print(bs.title.string) # 获取head标签的所有内容 print(bs.head) print(bs.div) # 获取第一个div标签中的所有内容 print(bs.div["id"]) # 获取第一个div标签的id的值 print(bs.a) print(bs.find_all("a")) # 获取所有的a标签 print(bs.find(id="u1")) # 获取id="u1" for item in bs.find_all("a"): print(item.get("href")) # 获取所有的a标签，并遍历打印a标签中的href的值 for item in bs.find_all("a"): print(item.get_text()) # 获取所有的a标签，并遍历打印a标签中的内容BeautifulSoup4四大对象种类BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:TagNavigableStringBeautifulSoupCommentTagTag通俗点讲就是HTML中的一个个标签，例如：from bs4 import BeautifulSoup file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html,"html.parser") # 获取title标签的所有内容 print(bs.title) # 获取head标签的所有内容 print(bs.head) # 获取第一个a标签的所有内容 print(bs.a) # 类型 print(type(bs.a))我们可以利用 soup 加标签名轻松地获取这些标签的内容，这些对象的类型是bs4.element.Tag。但是注意，它查找的是在所有内容中的第一个符合要求的标签。对于 Tag，它有两个重要的属性，是 name 和 attrs:from bs4 import BeautifulSoup file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html,"html.parser") # [document] #bs 对象本身比较特殊，它的 name 即为 [document] print(bs.name) # head #对于其他内部标签，输出的值便为标签本身的名称 p…

Python数据可视化
type: item
date: 2021-01-28T09:27:00+08:00
description: FlaskFlask简介Flask作为Web框架，它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的，是为了利用互联网交流工作文档。一切从客户端发起请求开始。所有Flask程序都必须创建一个程序实例。当客户端想要获取资源时，一般会通过浏览器发起HTTP请求。此时，Web服务器使用一种名为WEB服务器网关接口的WSGI（Web Server Gateway Interface）协议，把来自客户端的请求都交给Flask程序实例。Flask使用Werkzeug来做路由分发（URL请求和视图函数之间的对应关系）。根据每个URL请求，找到具体的视图函数。在Flask程序中，路由一般是通过程序实例的装饰器实现。通过调用视图函数，获取到数据后，把数据传入HTML模板文件中，模板引擎负责渲染HTTP响应数据，然后由Flask返回响应数据给浏览器，最后浏览器显示返回的结果。Flask诞生于2010年，是Armin ronacher（人名）用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。Flask本身相当于一个内核，其他几乎所有的功能都要用到扩展（邮件扩展Flask-Mail，用户认证FlaskLogin），都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具，文件上传、身份验证等。Flask没有默认使用的数据库，你可以选择MySQL，也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug（路由模块） ，模板引擎则使用 Jinja2 。可以说Flask框架的核心就是Werkzeug和Jinja2。Python最出名的框架要数Django，此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架，但是Flask应该算是最灵活的框架之一，这也是Flask受到广大开发者喜爱的原因。Flask扩展包：Flask-SQLalchemy：操作数据库；Flask-migrate：管理迁移数据库；Flask-Mail:邮件；Flask-WTF：表单；Flask-script：插入脚本；Flask-Login：认证用户状态；Flask-RESTful：开发REST API的工具；Flask-Bootstrap：集成前端Twitter Bootstrap框架；Flask-Moment：本地化日期和时间；Flask基本使用Hello World 程序from flask import Flask # Flask类接收一个参数__name__ app = Flask(__name__) # 路由解析通过用户访问的路径，匹配相应的函数 # 装饰器的作用是将路由映射到视图函数index @app.route("/") def index(): return "hello,world" # Flask应用程序实例的run方法启动WEB服务器 if __name__ == "__main__": app.run(debug=True, host="0.0.0.0",port=3000) # debug 开启调试，更改代码内容，界面相应改变； # host改成0.0.0.0让其他机器可以访问 # port=3000端口号路由传参有时我们需要将同一类URL映射到同一个视图函数处理，比如：使用同一个视图函数 来显示不同用户的个人信息。通过向规则参数添加变量部分，可以动态构建URL。此变量部分标记为。它作为关键字参数传递给与规则相关联的函数。from flask import Flask app = Flask(__name__) @app.route("/index") def index(): return "hello,world" # 通过访问路径获取用户的字符串参数 @app.route("/user/<name>") # <name>表示name参数，需要将路径中的name参数传入下面的函数中 def Wellcome(name): return "你好%s"%name # 通过访问路径获取用户的整形参数 # 路由传递的参数默认当做string处理，这里指定int，尖括号中冒号后面的内容是动态的 # 除此之外还有 float 型 @app.route("/user/<int:id>") def Wellcome1(id): return "你好%d号会员"%id # 路由的路径不能重复，用户通过唯一路径访问特定函数 if __name__ == "__main__": app.run(debug=True, host="0.0.0.0",port=3000)使用 render…

Python网络爬虫
type: item
date: 2021-01-26T10:14:00+08:00
description: 准备工作该笔记围绕豆瓣TOP250页面进行学习，爬取豆瓣TOP250影片信息。网址为 https://movie.douban.com/top250?start=25 其中 ?start=25 表示显示第25个以后的25个影片信息，如果不加该参数，则从第一个开始显示。我们需要安装相应的第三方模块，如下from bs4 import BeautifulSoup #网页解析获取数据 import re #正则表达式进行文字匹配 import urllib.request , urllib.error , requests #网页请求 import xlwt #进行Excel操作 import sqlite3 #进行sqlite数据库操作项目流程# 主函数 def main(): baseurl = "https://movie.douban.com/top250?start=" # 1.爬取网页 GetData(baseurl) # 3.保存数据 savepath = "./top250.xls" SaveData(savepath) def GetData(baseurl): datalist=[] # 2.边爬取边解析数据 return datalist def SaveData(savepath): pass if __name__ == "__main__": main()urllib库介绍基本的请求 是python内置的一个http请求库，不需要额外的安装。只需要关注请求的链接，参数，提供了强大的 解析。urllb.request 请求模块urllib.error 异常处理模块urllib.parse 解析模块参考： https://www.cnblogs.com/qikeyishu/p/10748497.html# get请求 import urllib.request , urllib.error response=urllib.request.urlopen("http://www.baidu.com") print(response.read().decode("utf-8")) #对读到的响应转码成utf-8 print(response.status) # 获取状态码 print(response.getheaders()) #获取所有响应头信息 print(response.getheader("Bdqid")) #获取某个响应头信息 # post请求 import urllib.request , urllib.error import urllib.parse data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8") #生成测试数据 res = urllib.request.urlopen("http://httpbin.org/post",data=data) print(res.read().decode("utf-8")) # 超时处理 import urllib.request , urllib.error try: response=urllib.request.urlopen("http://www.baidu.com",timeout=0.01) # 设置超时时间，超过0.01s没返回就报错 print(response.read().decode("utf-8")) except urllib.error.URLError as result: print("Time Out!") # 封装请求头访问 import urllib.request , urllib.error import urllib.parse url="http://httpbin.org/post" data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8") #生成测试数据 headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" } req = urllib.request.Request(url=url,data=data,headers=headers,method="POST") #封装请求对象,由于urlopen无法传参数，声明一个Request对象 res = urllib.request.urlopen(req…