文章向导
What is Python ?
- Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。
- Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。
- 像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。
- 官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。
- Python 2.7 被确定为最后一个 Python 2.x 版本。
各种语言编写Hello World 程序的对比
- C++版本:
#include<iostream>
using namespace std;
int main(){
cout << "Hello World!" << endl;
}
- Java 版本:
package test;
public class HelloWord{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
- Python 版本:
print("Hello World!")
可以看到Python 的代码量是最少的,Python 的宗旨就是简洁
如何使用 Python ‘偷懒’
-
目前市场上很多的办公软件,虽然功能都很多,但是或多或少都有一个“不灵活”的诟病
-
现再市面上很多 Python 都再谈自动化办公这一个概念,因为机器最擅长的就是重复,然而在生活中我们很多的工作都重复的,这何不交给机器去做呢?
-
之所以Python 能够完成日常大多数的工作,一方面得益于Python精简的语法,另一方面就是Python 里丰富的第三方库,这些库的功能很强大,甚至还能自动帮你完成简单的PS工作。
-
今天我主要介绍的就是Python中的爬虫和数据的ETL
什么是爬虫?
- 网络爬虫这门技术并不是最近才出现的,而是最近才火起来的
- 爬虫 ,别听这个名字很陌生,其实大家或多少都接触过,就是我们日常生活中接触到的百度,它其实本身就是一个巨大的爬虫。
- 爬虫,正如它名字的含义一样,我们可以把整个互联网想象成一张巨大的蛛网,在这张蛛网上面布满了很多的虫子(也就是我们需要的数据资源),爬虫就是一只在这张网上爬行的一只蜘蛛,它通过编程,我们就可以让它在这张网上找到我们想要的数据,然后把他们收集下来给我们。
在正式进入爬虫的世界当中我们还需要一点点前端的知识
当浏览器浏览一个网站时发生了什么?
- 发起请求
通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应,请求的种类有很多种(GET,POST,DELETE,UPDATE,PUT…)最常用的还是前两种 - 获取响应内容
如果服务器能够正常响应,就会得到一个Response,这个Response的内容便是所要获取的页面内容,类型可能有HTML,Json,二进制数据(如图片数据这种)。 - 解析并显示内容
前端收到服务器返回的Response后会通过js代码对这个返回体进行解析,然后将解析出来的数据根据设定的规则加载到页面中显示
Request 是什么?
1.请求方式
主要有GET、POST 两种类型,另外还有HEAD,PUT,DELETE 等。
2.请求URL
URL全程统一资源定位符,如一个网页文档,一张图片,一个视频等都可以用URL唯一来确定。
3.请求头
包含请求时的头部信息,如User-Agent、Host、Cookies等信息。
4.请求体
请求时额外携带的数据如表单提交时携带的数据,如表单提交时的表单数据。
Response 包含什么?
1.响应状态
有多种响应状态,如200代表成功、301跳转、404找不到页面、502服务器错误
2.响应头
如内容类型、内容长度、服务器信息、设置Cookie等等。
3.响应体
最主要的部分,包含了请求资源的内容,如网页HTML、图片二进制数据等。
开始一个最简单的爬虫
Step1 模拟HTTP请求
- 其实爬虫的工作机理实质就是通过代码人为模拟HTTP请求的过程
- 在Python 中可以很轻松的就完成这样的需求,Python3中有(requests,urllib3…)来实现,不过推荐使用前者,因为它进行了高度的封装,使用起来也更方便。
# 导入requests 库
import requests
# 调用requests的get方法,对 www.baidu.com 发起一个 GET 请求
response = requests.get("http://www.baidu.com")
# 输出响应体信息
print("响应码:",response.status_code)
print("响应体:",response.text)
Step2 添加请求头
- 因为现在很多的网站都做了反爬处理,因为过多的爬虫程序,会对别人的服务器造成额外的压力,所以我们就要把自己伪装成浏览器来进行访问,原理就是构造User-Agent
# 导入requests 库
import requests
# 设置headers
my_headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}
# 调用requests的get方法,对 www.baidu.com 发起一个 GET 请求
response = requests.get("http://www.baidu.com",headers=my_headers)
# 输出响应体信息
print("响应码:",response.status_code)
print("响应体:",response.text)
你运行完这段代码后会发现这一次返回的响应体内容明显比前一次多,你是应为上一次是百度的服务器已经识别出你是机器人访问,所以就屏蔽了很多内容给你返回的响应体
数据处理
- 对于服务器那边返回来的数据格式总是那么不尽人意的,我们需要通过自己来把数据标准化提取我们想要的数据
JSON 数据处理
- 经常我们在服务器端获取到的数据都是以JSON格式进行返回的,在Python对JSON的处理极为方便,不用如JAVA一样还需要特定的实体内才能解析,Python作为动态类型语言,解析JSON非常方便,它可以把JSON字符串解析成Python中的字典(dict)
# 导入处理JSON的库
import json
test_json_str = """
{
"people": [{
"school": "ttt",
"name": "zs",
"age": 15
}, {
"school": "du",
"name": "ls",
"age": 17
}, {
"school": "rw",
"name": "ww",
"age": 18
}],
"status": "OK"
}
"""
json_ = json.loads(test_json_str)
print("状态:",json_["status"])
print("人员: ",json_["people"])
print("第一个人的学校名:",json_["people"][0]["school"])
结构化数据处理
- 对于结构化数据python 也有很强大的一个库可以处理,名为pandas
import pandas as pd
data_json = {
"name":["张三","李四","王五"],
"age": [18,19,17],
"math":[120,112,99],
"english":[95,89,120],
"chinese":[110,102,113]
}
sc_df = pd.DataFrame(data_json)
# 选取英语没有及格的学生
print(sc_df[sc_df["english"] < 90])
Selenium 一个强大的Web自动化测试工具
什么是Selenium?
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。
利用 python 的Selenium库来操作浏览器
step1 打开一个网页
# 导入web驱动的库
from selenium import webdriver
# 创建一个Chrome浏览器的驱动对象
browser = webdriver.Chrome()
# 在浏览器中输入百度的地址,访问百度的网页
browser.get("http://www.baidu.com")
step2 实现自动搜索词条
# 导入web驱动的库
from selenium import webdriver
# 创建一个Chrome浏览器的驱动对象
browser = webdriver.Chrome()
# 在浏览器中输入百度的地址,访问百度的网页
browser.get("http://www.baidu.com")
# 定位到输入搜索关键字的标签,并填入想要搜索的词条
browser.find_element_by_xpath('//*[@id="kw"]').send_keys("爬虫")
# 点击搜索按钮
browser.find_element_by_xpath('//*[@id="su"]').click()
step3 显示网页源码
# 导入web驱动的库
from selenium import webdriver
# 创建一个Chrome浏览器的驱动对象
browser = webdriver.Chrome()
# 在浏览器中输入百度的地址,访问百度的网页
browser.get("http://www.baidu.com")
# 打印网页源码
print(browser.page_source)
```python
# 导入web驱动的库
from selenium import webdriver
# 创建一个Chrome浏览器的驱动对象
browser = webdriver.Chrome()
# 在浏览器中输入百度的地址,访问百度的网页
browser.get("http://www.baidu.com")
# 打印网页源码
print(browser.page_source)