爬虫简介

mac2025-08-08  12

数据工程: 数据采集 和 数据存储(爬虫系统) 数据计算、分析 和 数据可视化(数据分析) 数据建模 和 数据训练(数据挖掘、机器学习) 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,所以不需要额外处理。
最新回复(0)