第一天:

爬虫概要:

为什么我们要学习爬虫?

首先请问:都说现在是‘大数据时代’,那数据从何而来?

  1. 企业产生的用户数据:百度指数,阿里指数,新浪微博指数。
  2. 数据平台购买数据:数据堂,国云数据市场,贵阳大数据交易所。
  3. 政府/机构购买数据:中华人民共和国国家统计局,纳斯达克。
  4. 爬取网络数据:自己动手丰衣足食。

 

 

 

 

 

 

什么是大数据:

多大的数据才算大数据?

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?(拿翻页举例)

通用搜索引擎的局限性

  1. 通用搜索引擎所返回的网页里90%的内容无用。
  2. 不同用户搜索的目的不完全相同,但是返回内容相同。

 

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?

  1. requests的底层实现就是urllib
  2. requests在Python2和python3中通用,方法完全一样
  3. 简单易用
  4. requests能够自动帮助我们解压(gzip压缩的等)网页内容

发送简单的请求

需求:通过requests向百度首页发送请求,获取百度首页的数据

response = requests.get(url)

response的常用方法:

  1. response.text(返回的是Unicode格式的数据)
  2. response.content(返回的是字节流数据)
  3. response.status_code(查看响应码)
  4. response.request.headers(请求头)
  5. 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)