第一天:前端
爬虫概要:python
为何咱们要学习爬虫?web
首先请问:都说如今是‘大数据时代’,那数据从何而来?浏览器
什么是大数据:安全
多大的数据才算大数据?服务器
B: bytes(字节)微信
K:1K = 1024B 1K=2**10网络
M:1M = 1024K 1M=2**20session
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?(拿翻页举例)
通用搜索引擎的局限性
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向百度首页发送请求,获取百度首页的数据
response = requests.get(url)
response的经常使用方法:
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)