第一天:
爬虫概要:
为什么我们要学习爬虫?
首先请问:都说现在是‘大数据时代’,那数据从何而来?
- 企业产生的用户数据:百度指数,阿里指数,新浪微博指数。
- 数据平台购买数据:数据堂,国云数据市场,贵阳大数据交易所。
- 政府/机构购买数据:中华人民共和国国家统计局,纳斯达克。
- 爬取网络数据:自己动手丰衣足食。
什么是大数据:
多大的数据才算大数据?
B: bytes(字节)
K:1K = 1024B 1K=2**10
M:1M = 1024K 1M=2**20
G:1G = 1024M 1G=2**30
4G=2**32
T:1T = 1024G 1T = 2**40
P:1P = 1024T 1P=2**50
E:1E = 1024P 1E=2**60
所谓的大数据在100T-10P之间。
爬虫的定义:
网络爬虫(又称网页蜘蛛,网络机器人)就是模拟客户端发送网络请求,接收请求的响应,按照一定的规则,自动地抓取互联网信息的程序。
只要是浏览器能做的,原则上,爬虫都能做
网络爬虫的更多用途:
12306抢票
网站上的投票
短信轰炸—》找到很多注册网站添加对应的手机号,发送验证码,就能实现短信轰炸。(日后你惹出祸来,不把师傅说出来就行了)
举例12306—》携程
微信—》搜狗微信
两个阵营的斗争
爬虫——反爬虫——反反爬虫
爬虫与反爬虫的斗争
反爬虫:验证码、流量监控(封IP、封session、封userAgent)
反反爬虫:验证码图像识别、代理、随机userAgent、……
爬虫与反爬虫的斗争最后胜利的一方永远是爬虫
注意:搜索引擎也是爬虫。反爬虫总不可能去反搜索引擎吧
为什么用python做爬虫?
PHP:PHP是做后台的,小型网站。爬虫是在前端运行的。肯定是不合适。
Java:Java既可以做后台,也可以做爬虫。但是Java比较臃肿,修改Java代码比较耗人力
C/C++:C/C++是做嵌入式的。如果让搞嵌入式的人做爬虫有点大材小用了,资源浪费
Python:轻量级。快速更新迭代。代码易读。有很多已成型的库,直接import就可以了。支持多线程
爬虫的分类
1通用爬虫:通常指搜索引擎的爬虫
2.聚焦爬虫:针对特定网站的爬虫
通用搜索引擎工作原理
想一想:如果我们自己实现一个和百度一样的网站需要怎么做?
通用爬虫和聚焦爬虫工作流程
搜索引擎流程:抓取网页à数据存储à预处理à提供检索服务,网站排名
聚焦爬虫流程:
为什么要从响应内容提取url?(拿翻页举例)
通用搜索引擎的局限性
- 通用搜索引擎所返回的网页里90%的内容无用。
- 不同用户搜索的目的不完全相同,但是返回内容相同。
Robots协议
网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
例如:https://www.taobao.com/robots.txt
复习HTTP HTTPS
http协议(超文本传输协议):是一种发布和接收HTML页面的方法。
https:简单来讲是http的安全版,在http下加入SSL层。
SSL(安全套接字层)主要用于web的安全传输协议,在传输层对网络连接进行加密,保障在internet上数据传输的安全。
http默认的端口:80
HTTPS默认的端口:443
https比http更安全,但是性能更低(多了加解密的过程)
url的形式
形式 scheme://host[port]/path…/[?query-string][anchor]
scheme:协议(例如:http,https,ftp)
host:服务器的IP地址或者域名
port:服务器的端口号
path:访问资源的路径
query-string:参数
anchor:锚
http常见请求头
host(主机和端口号)
connection(连接类型)
Upgrade-Insecure-Requests (升级为HTTPS请求)
User-Agent (浏览器名称)
Accept (传输文件类型)
Referer (页面跳转处)
Accept-Encoding(文件编解码格式)
Cookie (保存用户的个人信息)
x-requested-with :XMLHttpRequest (是Ajax 异步请求)
常见的请求方法
GET
POST
两者有什么区别呢?
POST请求更安全,适用于表单,提交数据量很大的时候。
常见响应状态码(status code)
200:成功
302:临时转移至新的url
307:临时转移至新的url
404:not found
500:服务器内部错误
Requests使用入门
问题:为什么学习requests,而不是utllib?
- requests的底层实现就是urllib
- requests在Python2和python3中通用,方法完全一样
- 简单易用
- requests能够自动帮助我们解压(gzip压缩的等)网页内容
发送简单的请求
需求:通过requests向百度首页发送请求,获取百度首页的数据
response = requests.get(url)
response的常用方法:
- response.text(返回的是Unicode格式的数据)
- response.content(返回的是字节流数据)
- response.status_code(查看响应码)
- response.request.headers(请求头)
- response.headers(响应头)
import requests
# 发送请求
r = requests.get('https://www.baidu.com/img/bd_logo1.png')
# 保存
# wb以二进制的方式写入
with open("a.png", 'wb') as f:
f.write(r.content)
print(r.request.headers)
发送带header的请求
为什么请求需要带上header?
模拟浏览器、欺骗服务器、获取和浏览器一致的内容
header的形式:字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
用法:requests.get(url,headers=headers)
发送带参数的请求
什么叫做请求参数:
参数的形式:字典
kw = {‘wd’:’欧冠’}
用法:requests.get(url,params=kw)