这个系列的网络爬虫,会覆盖至少80%的网页爬虫深度。
学习爬虫前,最好对WEB开发有基本的了解,因为爬虫是WEB逆向分析,准确的说是JS逆向分析。
基础扫盲
URL
URL统一资源定位符
1、URL的结构
https://www.baidu.com:443/login/login.php?user=123&pass=456
https 使用https协议
www.baidu.com:443 域名:端口
login/login.php 资源路径
? 文件名与GET参数之间用?分隔
user=123 GET方式向服务器发送一个参数名为user,值为123
& 多个参数之间用&分隔
2、相对URL与绝对URL
3、URL编码与解码
协议头
GET请求头
//起始行 访问方式 资源路径和GET参数 协议/版本号
//附加协议头的时候删掉 winhttp自动生成
GET /v2/getpublickey?x=100&y=200 HTTP/1.1
//主机名 域名 winhttp对象会自动生成 可以不附加
Host: passport.baidu.com
//用户代理 服务器可以根据这个来识别是哪个浏览器
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
//浏览器接受数据类型 winhttp对象会自动生成*/*类型 可以不附加
Accept: */*
//浏览器接受的语言
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
//浏览器支持的编码
//附加协议头的时候必须删掉 不然返回的数据是压缩过的 需要自己再解压
Accept-Encoding: gzip, deflate, br
//来路 GET和POST中都会出现,表示这个请求是从哪个页面发出的
//可能会有会变化的值 要特别注意
Referer: https://www.baidu.com/?user=123456&pwd=1212121
//非常重要 单独讲解
Cookie: BAIDUID=4A89DBBC382B25D9A43D12C4AB0151FD:FG=1
//表示长连接 1.1版本才支持 winhttp对象自动生成 可以不附加
Connection: keep-alive
POST请求头
//起始行 访问方式 资源路径和GET参数 协议/版本号
//附加协议头的时候删掉 winhttp自动生成
POST /v2/api/?login HTTP/1.1
Host: passport.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Origin: https://www.baidu.com/
Referer: https://www.baidu.com/
Cookie: BAIDUID=4A89DBBC382B25D9A43D12C4AB0151FD:FG=1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
//提交的数据包的长度 不能多也不能少一个字节 winhttp自动生成 可以不附加
Content-Length: 22
//提交数据的类型 单独讲解
Content-Type: application/x-www-form-urlencoded
//POST提交的数据和协议头之间有一个空行
user=123456&pwd=654321
响应头
通常要注意的首部字段Set-Cookie和Location
还要注意状态码
状态码
状态码为301或302等有重定向时,如果你想获取当前链接的响应头或者响应数据。访问的时候要禁止重定向
协议头可以自定义
有些网站会在协议头里传递重要数据,并且一般是会变化的。如果网站检测,你就要找到来源,附加协议头提交
cookie
1、cookie的分类
服务器返回 Set-Cookie
JavaScript生成
2、cookie的作用
识别身份(验证码)
判断是否登录状态
3、cookie的结构
名1=值1; 名2=值2; 名3=值3
4、抓包流程
论清除cookie的重要性 (博客园)
5、合并更新步骤
a) 新cookie 去除无效cookie
b) 在新cookie里,寻找是否存在旧cookie里的名字。存在就用新的,丢掉旧的
c) 两cookie组合到一个文本型变量中
6、前端会用JS生成很多cookie,但是并非所有cookie都会检测。
比如Hm_lvt开头的一般没啥用。
编码
编码不对是中文乱码的根源,也是导致提交数据出错的重要原因
1、如何查看网页是何种编码
<meta charset="UTF-8" />
这只是告诉浏览器以何种方式解析文档 真正决定网页编码的是在文件保存的时候
2、GBK GB2312 ANSI UTF8
3、URL编码与解码(UTF8)
4、不要用 编码_URL解码 来转换response
5、U码 \u6ce8\u518c\u6210\u529f (JS混淆)
6、十六进制文本 65797579616e \x65\x79\x75\x79\x61\x6e (JS混淆)
7、Base64
• 所有的数据都能被编码为只用65个字符就能表示的文本。
• 65字符:A~Z a~z 0~9 + / =
• Base64的应用
密钥 密文 图片 普通数据(新浪账号)
• Base64编码解码与btoa、atob
跨域
ajax 不能跨域
submit 表单提交
script 可以跨域
参数值一般在ajax或者submit