数据工程:
数据采集 和 数据存储(爬虫系统)
数据计算、分析 和 数据可视化(数据分析)
数据建模 和 数据训练(数据挖掘、机器学习)
1. 什么是爬虫?
抓取网页数据的程序。
2. 爬虫是怎么抓取网页数据?
网页三大特征:
-1. 网页都有自己的URL(统一资源定位符)来进行互联网定位;
-2. 网页都使用 HTML(超文本标记语言)来描述页面信息;
-3. 网页都使用HTTP/HTTPS(超文本传输协议)来传输 HTML 数据。
爬虫的标准设计流程:
-1. 通过网页的URL地址,发送 HTTP 请求给网站服务器;
-2. 网站服务器接收请求,返回对应的HTTP响应;
-3. 接收响应,解析响应数据:
a. 如果是需要保存的目标数据,使用相关工具保存(txt、json、xml、csv、mongodb、mysql、redis)
b. 如果是需要继续抓取的 URL 地址,则从第二步继续执行。
-4 当所有需要抓取的URL地址全部爬取完毕,程序结束。
3. 爬虫抓下来的数据能干嘛?
-1. 数据采集数据数据工程的第一环,数据可以用于后续的数据分析、数据挖掘、机器学习
-2. 数据也可以出售;
-3. 抓取各个网站的数据,用于自己的网站,提供用户流量;
-4. 抓取友商数据,及时调整自己产品信息
-5. PPT创业,吹牛融资,需要数据支持。
4. 为什么Python做爬虫更多?
PHP、Java、C、Python
PHP 并发能力弱
Java 编写和重构成本高
C/C++ 学习成本高
Python 开发效率高、工具便捷、 HTTP请求处理库和HTTP响应处理库非常多,
强大的爬虫框架 Scrapy,以及高效成熟的分布式组件 scrapy-redis
Python 动态、强类型、解释型语言
动态:数据类型在执行时确定
静态:数据类型在执行前确定
强类型: 不同类型的不能做计算(Python)
弱类型: 不同类型可以做计算(JavaScript)
解释型语言: 每次执行代码,需要重新用解释器执行一遍。
编译型语言: 执行前可以通过编译器生成可执行程序,执行时运行可执行程序。
解释型语言的效率问题,可以被越来越强的机器性能所弥补。
5. 课程介绍:
1. Python、HTML、JavaScript
2. HTML页面的抓取:
urllib、urllib2、requests,通过模拟 浏览器 请求,获取服务器对应的响应(HTML、json、JavaScript、mp4、jpg)
3. HTML数据的提取:
re、lxml/xpath、bs4/BeautifulSoup、pyquery,通过特定的语法提取网页数据(匹配)
字符串、列表、字典,元组,集合
4. 对解析数据的存储 mongodb:
txt、json、xml、csv、mongodb、mysql、redis
5. 动态HTML处理、验证码的处理
Selenium + PhantomJS/Chrome:模拟真实浏览器加载网页数据(解决js加密、ajax等)
Tesseract OCR(光学字符识别系统):将图片上的“文字”读取处理,返回真正的字符串。
函数 - 类 - 模块 - 包/库 - 框架
6. scrapy框架
非常强大的爬虫框架,提供了请求发送、响应解析、数据存储、请求去重等组件,twisted异步网络框架处理并发。
7. scrapy-redis分布式策略
分布式爬虫:在不同的硬件环境和网络环境下,共享请求队列。
scrapy本身不支持分布式,scrapy-redis是一套基于redis数据库的组件(9个python文件),用来替换scrapy不支持分布式的组件,让scrapy可以支持分布式抓取。
在统一redis数据库里,保存公共的 请求、指纹(表示请求唯一性sha1字符串)
8. 手机端的app数据爬取, appium,模拟手机端的运作
python
8. 重点:爬虫 - 反爬虫 - 反反爬虫
网站为什么要反爬:
1. 降低服务器负载,减少无效流量
2. 保护有价值的数据,提供网站竞争力
机器成本 + 人力成本 == 数据价值
3. 面子问题,程序员之间技术对抗
9. 毛主席说过:战略上藐视,战术上重视。
在具备同等资源的前提下,爬虫一定能获胜。
Google PageRank
Baidu 超链分析(Robin Li)
竞价排名
print() 字符串格式化输出函数: 将字符串按终端的编码格式进行输入。
Linux终端:utf-8
简体中文Windows终端:gbk
python3 str unicode编码格式
byte 是非unicode(utf-8, gbk, )
python2
unicode unicode编码格式
str 非unicode(utf-8, gbk)
print(unicode_str) 会按终端数据, 按utf-8输出
print(utf-8)
Python2和Python3的编码:
一、字符编码
计算机中所有的数据,存储都是通过二进制表示。
01010101
通过编码表转换
二进制 0b01100001 -- 对应十进制 97 -- 对应的字符 'a'
ASCII 美国标准信息交换码 : 表示 英语世界 里所有字符的 转换,英文字母+数字+常用符号 0~127 之间
计算机普及全球,ASCII编码不能满足各国的语言需求,于是各个国家开始指定自己的编码。
中国:简体中文 gb2312 - gbk - gb18030 , code page 936 (cp936)
繁体中文 big5
日文:shift-jis
乱码:当前使用的编码表不能正常显示对应的文本字符
Unicode 编码:包含了世界上所有的字符编码,解决了编码统一。每个字符都占用 3~6 个字节,浪费空间。
utf-8 可变长的Unicode(一个汉字3个字节,一个字母1个字节),极大的减少了空间占用。
所有的Linux系统终端编码为utf-8,90%以上的网页使用utf-8编码。
重点:不管什么编码,前 0~127 都是一样的(因为任何编码都是通过ASCII进行扩展)
爬虫程序需要处理的编码场景:
1. 发送请求获取网页内容(不同的网页可能字符串编码不一样)
2. 程序处理后产生的结果(可能产生不同的编码)
3. 将结果保存在文件或数据库(保存数据要统一的编码)
字符串编码不一致,需要转码处理统一。
二、Python中字符串编码 和 字符串类型
Python3:
str1 = "你好" str 类型 对应 Unicode编码格式
str1.encode("utf-8") bytes 类型 对应 非Unicode字符串(gbk、utf-8)
Python2:
unicode 类型 对应 Unicode字符串
str 类型 对应 非Unicode字符串(gbk、utf-8、MP4、MP3、JPG)
任何语言、任何操作系统、任何编码,都可以和Unicode编码 互相转换。
gbk_str -> utf-8
# 任何编码都可以通过 decode 解码为 Unicode字符串
unicode_str = gbk_str.decode("gbk")
# Unicode字符串 可以通过 encode 编码为 任何编码字符串
utf8_str = unicode_str.encode("utf-8")
三、在终端创建字符串的编码:
Python2: Linux是 utf-8,简体中文Windows gbk
如果是用iPython创建,统一为utf-8
Python3: 全部是 Unicode
四、 将字符串写入到文件中
Python写入字符串到文件中, 不能直接写Unicode,需要转码处理
1. 通过手动转码处理
unicode_str.encode("utf-8")
unicode_str.encode("gbk")
Python3:
# 写入非Unicode字符串,用 wb 模式
with open("xxx.txt", "wb") as f:
f.write(unicode_str.encode("utf-8"))
f.write(utf8_str1)
f.write(utf8_str2)
Python2:
# 写入非Unicode字符串,用 w / wb 模式
with open("xxx.txt", "w") as f:
f.write(unicode_str.encode("utf-8"))
f.write(utf8_str1)
f.write(utf8_str2)
2. 通过encoding参数处理
open(encoding="utf-8")
open(encoding="gbk")
Python3:
# 写入Unicode字符串,用 w 模式
with open("xxx.txt", "w", encoding="utf-8") as f:
f.write(unicode_str)
Python2:
# 写入Unicode字符串,用 w 模式,但是默认没有encoding参数,但是通过codecs模块支持
import codecs
with codecs.open("xxx.txt", "w", encoding="utf-8") as f:
f.write(unicode_str)
3. 如果没有通过 1 和 2 处理,则 默认通过Python解释器编码处理
with codecs.open("xxx.txt", "w") as f:
f.write(unicode_str)
Python3的解释器编码 : utf-8
Python2的解释器编码: ascii
将Python2的解释器编码,改为 utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
处理 UnicodeDecodeError、UnicodeEncodeError 编码错误机制。
五、文件编码
当字符串第一次写入文件时,文件创建成功,文件编码和字符串编码保持一致。
如果后续写入其他编码的字符串,则文件编码会被修改,原来的数据会出现乱码。
六、代码文件头部编码声明
Python2默认代码文件编码是 ascii,只能处理 ascii字符,如果代码中有中文会报错,
所以需要在代码顶部添加下面一行声明,将代码文件编码声明修改为 utf-8
# -*- coding=utf-8 -*—
#coding=utf-8
Python3 默认代码文件编码是 utf-8,所以不需要额外处理。