1.爬虫概念 :
1
2
3
4
5
6
爬虫是什么?
生活角度理解, 蜘蛛(spider)

互联网: 节点就是a链接(url)统一资源定位符 - 通过a链接一步一步跳转 - 就可以访问所有资源

互联网爬虫 : 写一个程序, 根据url去抓取指定的内容
都有哪些语言可以实现爬虫 :
1
2
3
4
(1) php : 号称世界上最好的语言, (后端语言 : php, java, python), 可以实现爬虫, 缺点 : 天生对多进程和多线程支持的不好
(2) java : 可以实现爬虫功能, 而且做的非常好, 是Python爬虫最主要的竞争对手 , 缺点 : 语言不简洁, 代码臃肿, 重构成本高
(3) C, C++ : 也可以实现爬虫, 非常强大, 编程语言排行榜, 如果实现爬虫功能, 只能说你牛, 但不是一个好的选择
(4) Python : 可以实现, 号称世界上最优雅的语言, 代码简洁, 学习成本低, 执行效率也好, 而且还有一个非常强大的爬虫框架 (scrapy)
通用爬虫 :
1
2
3
4
5
例子 : 百度, 谷歌, 360, 搜狗, 必应等等, 搜索引擎就是一种爬虫
搜索引擎做的工作 :
(1) 爬取互联网所有的数据
(2) 对数据存储并且处理
(3) 给用户提供检索服务
如何让百度抓取你的网站?
1
2
3
(1) 静静地等待, 百度会和DSN服务商合作
(2) 主动提交自己的url
(3) 在其他网站设置友情链接 - bootstrap的图标使用
我的网站不想让百度抓取?
1
2
(1) 与百度商量好的, 君子协议, 口头协议, robots协议(爬虫协议, 机器协议)
(2) 存放到网站的根目录下, 限制搜索引擎可以爬取哪些, 不可以爬取哪些, 所以自己写得程序就不遵从了robots协议
网站排名 (SEO): 通过SEO优化网站
1
2
(1) pagerank值排名, 根据点击量, 浏览量等, 相当靠谱 - 口碑
(2) 竞价排名, 魏泽西事件
通用爬虫缺点 :
1
2
(1) 抓取很多数据都是无效的
(2) 不能根据自己的需求抓取数据
聚焦爬虫 :
1
2
3
4
5
6
根据自己特定的需求, 来抓取指定的数据
如何实现聚焦爬虫 ?
网页的特点 :
(1) 网页都有自己唯一的url
(2) 网页都是由html组成
(3) 网页传输都是使用http, https组成
思路 :
1
2
3
(1) 提供一个url
(2) 模拟浏览器发送http请求
(3) 从http结构中提取指定的数据, 从字符串中根据规则提取指定数据
开发环境 :
1
(1) Windows系统 , Python 3.x(64位) , sublime编辑器, pycharm编辑器, vscode
整体内容 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(1) 涉及到的Python的库 :
urllib , requests, selenium, jsonxpath, lxml等一些库
(2) 解析内容
正则表达式解析, bs4解析, xpath解析, jsonpath解析
(3) 采集动态html
DOM操作, 动态的添加或者删除节点, selenium+phantomjs
(4) scrapy框架
异步高性能网络爬虫框架的学习
(5) scrapy-redis分布式部署
在scrapy的基础上, 多了一套分布式部署的组件
(6) 涉及到的爬虫-反爬虫-反反爬虫之间的斗争
反爬会伤害真实的用户, 一般情况下, 反爬也就这么两点 : 第一个UA, 第二个封IP, 第三个验证码, 光学识别(软件), 打码平台

换思路解决问题 : 其他网站, 手机端等
2.http协议 :

书 : <<图解http协议>>

1
2
3
4
5
6
7
8
9
10
协议是什么? : 
协议就是规定好的传输方式

上网原理 :
看图行
锚点 : 跳转可以实现本页面的跳转

http与https的区别 :
http://www.cnblogs.com/wqhwe/p/5407468.html
http://www.cnblog.com/10158wsj/p/6762848.html
HTTPS和HTTP的区别主要如下 :
1
2
3
4
5
6
7
8
9
10
11
12
1. https协议需要到ca申请证书, 一般免费证书较少, 因而需要一定费用

2. http是超文本传输协议, 信息是明文传输, https则是具有安全性的ssl加密传输协议

3.http和https使用的是完全不同的连接方式, 用的端口也不一样, 前者是80, 后者是443

4.http的连接很简单, 是无状态的, HTTPS协议是由SLS+HTTP协议构建的可进行加密传输, 身份认证的网络协议, 比http协议安全
加密 : 公钥私钥
客户端 : 123456用秘钥加密======>>服务端 : 用秘钥解密得到123456
秘钥相同称之为对称加解密
秘钥不相同称之为非对称加解密
客户端 : 123456用公钥加密======>>服务端 : 用私钥解密得到123456
http协议学习 :
1
2
3
4
图解http协议
http://www.cnblog.com/10158wsj/p/6762848.html
http协议是基于tcp的, 交互之前建立连接, 三次握手
udp传输协议, 只需要知道ip和端口即可发送消息
请求 :
1
2
3
4
5
6
7
8
9
10
11
12
13
包含请求行, 请求头, 请求内容
请求行 : 请求方式, 请求资源, 协议版本号
请求头 :
accept : 浏览器通过这个头告诉服务器, 它所支持的数据类型
Accept-Charset : 浏览器通过这个头告诉服务器, 它支持哪种字符集
Accept-Encoding : 浏览器通过这个头告诉服务器, 支持的压缩格式
Accept-Language : 浏览器通过这个头告诉服务器, 它的语言环境
Host : 浏览器通过这个头告诉服务器, 想访问哪台主机
If-Modified-Since : 浏览器通过这个头告诉服务器, 缓存数据的时间
Referer : 浏览器通过这个头告诉服务器, 客户机是哪个页面来的, 防盗链
Connection : 浏览器通过这个头告诉服务器, 请求完后是断开链接还是继续链接
X-Requested-With : XMLHttpRequest
代表ajax的请求
响应 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
响应行, 响应头, 响应内容
响应行里面, 常见的状态码
响应头 : 对我们来说不重要
Location : 服务器通过这个头, 来告诉浏览器跳到哪里
Server : 服务器通过这个头, 告诉浏览器服务器的型号
Content-Encoding : 服务器通过这个请求头, 告诉浏览器, 数据的压缩格式
Content-Length : 服务器通过这个头, 告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type :服务器通过这个头,告诉浏览器回送数据的类型
Refresh :服务器通过这个头,告诉浏览器定时刷新
Content-Disposition : 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding :服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1 控制浏览器不要缓存
Cache-Control: no-cache
Pragma: no-cache
响应内容:html、css、js、图片
3.抓包工具 :
(1) 谷歌浏览器自带抓包工具
1
2
3
4
右键开发者工具 ==> network
XHR : XMLHttpRequest 前端要想发送ajax请求, 通过它创建对象,发送请求
query_string_parameters : 请求字符串, get参数
formdata : 如果是post参数
(2) 专业工具 fiddler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
专业抓包工具, 比谷歌强在了跳转的时候很多请求都能抓取到
见文档
1.配置抓取
2.清楚所有请求
3.暂停和启动抓包
4.fiddler介绍
左边栏 :
显示所有的请求
<> : 代表的是html请求
右边栏 :
点击某个请求, 查看这个请求的详细信息
选中Inspectors
右上 : 请求信息
raw : 有关所有请求的纯文本内容
WebForms : 请求的参数
上面 : query_string get参数
下面 : body post参数
右下 : 响应信息
raw : 以纯文本的形式响应所有的内容
json : 如果响应为json格式数据, 在这里查看
左下角黑色窗口输入指令 :
cls : 清除掉所有请求
select html : 选择html请求
select js :
?baidu :
4.urllib库 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
urllib 库是什么 ? 自带的Python库, 模拟浏览器发送http请求
Python 2系列 : urllib urllib2
Python 3系列 : urllib
三个模块 :
1. urllib.request 模拟发送请求
函数 :
urlopen()
urlretrieve()
2. urllib.parse 处理参数或者url
3. urllib.error 如何处理异常
urllib.request 模拟发送请求
urlopen(url) : 向url发送请求,得到响应对象
urlretrieve(url, filepath) : 向url发送请求,直接将响应写入到filepath中
response属性和方法
字符串格式==》字节格式
encode('utf8')
字节格式==》字符串格式
decode('gbk')
response.read() : 读取字节格式内容
response.url : 获取请求url
response.headers: 响应头部
response.status: 状态码
https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1533639915215&di=1bbd3901c9991b363ac0211dc861a909&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F225a5f3f75d1d4c59532704782eebd25d323fd801e57a-VlY5c4_fw658

下载图片:得到图片的src属性,就可以将图片下载到本地
urllib.parse 处理参数或者url
urllib.error 如何处理异常
sublime使用方法 :
插件安装 : 首先安装插件管理器(package control)见文档
安装插件 : Ctrl+shift+p
imesupport 解决光标跟随问题
anaconda python只能提示工具
emmet html快速插件
[注] sublime 安装完毕之后, 默认会自动关联Python的可执行程序, 如果没有自动关联, 点击tools里面的build system,手动选择python,如果还不行,自己按照固定的格式新建一个build system即可,如果还不行,算了,别用了
fiddler的使用方法 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1、配置抓取https包
tools==》teletick options==》https
选中capture https connects\decrypt https traffic\ingnore xxxx
点击actions==》trust root certificate
配置完毕,重启fiddler让其生效

如果有问题,参考这个博客
https://blog.csdn.net/d1240673769/article/details/74298429
2、清楚所有请求
叉号==》remove all
3、暂停和启动抓包
file==>capture traffic
4、fiddler介绍
左边栏
显示所有的请求
<> : 代表的是html请求
右边栏
点击某个请求,查看这个请求的详细信息
选中inspectors
右上:请求信息
raw:有关所有请求的纯文本内容
webforms:请求参数
上面:query_string get参数
下面:body post参数
右下:响应信息
raw:所有响应的纯文本内容
json:如果响应为json格式数据,在这里查看
左下角黑色窗口输入指令
cls:清除掉所有请求
select html: 选择html请求
select js: 选择js请求
?baidu: 选择带baidu的请求
常见的http状态码 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。

101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。

102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。

200:请求成功 处理方式:获得响应的内容,进行处理(重要)

201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到

202:请求被接受,但处理尚未完成 处理方式:阻塞等待

204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃

300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL(永久重定向,重要)

302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL(临时重定向,重要)

304:请求的资源未更新 处理方式:丢弃,使用本地缓存文件(没有发送请求,用的是本地缓存文件,重要)

400:非法请求 处理方式:丢弃

401:未授权 处理方式:丢弃

403:禁止 处理方式:丢弃(重要)

404:没有找到 处理方式:丢弃(重要)

405:请求方式不对(了解)

500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。(服务器问题,代码有问题,重要)

501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。

502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
sublime安装流程 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
安装 package control , 按view下面的 show console, 输入如下指令敲enter即可
import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

解决输入pci,找不到包库的问题
在view-show console里面输入如下指令,敲enter
import urllib.request,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-、package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

解决鼠标跟随问题
安装IMESupport插件
代码提示插件
Anaconda
终止程序运行
Tools==>Cancel Build
设置快捷键
{
"keys": ["ctrl+shift+p"],
"command": "cancel_build"
}

最后更新: 2018年08月09日 17:44

原始链接: http://yoursite.com/2018/08/09/认识爬虫/

× 请我吃糖~
打赏二维码