这个系列的网络爬虫,会覆盖至少80%的网页爬虫深度。
学习爬虫前,最好对WEB开发有基本的了解,因为爬虫是WEB逆向分析,准确的说是JS逆向分析。
基础扫盲
URL
URL统一资源定位符1、URL的结构https://www.baidu.com:443/login/login.php?user=123&pass=456https 使用https协议www.baidu.com:443 域名:端口login/login.php 资源路径? 文件名与GET参数之间用?分隔user=123 GET方式向服务器发送一个参数名为user,值为123& 多个参数之间用&分隔2、相对URL与绝对URL3、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.1Host: passport.baidu.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflate, brOrigin: https://www.baidu.com/Referer: https://www.baidu.com/Cookie: BAIDUID=4A89DBBC382B25D9A43D12C4AB0151FD:FG=1Connection: keep-aliveUpgrade-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-CookieJavaScript生成2、cookie的作用识别身份(验证码)判断是否登录状态3、cookie的结构名1=值1; 名2=值2; 名3=值34、抓包流程论清除cookie的重要性 (博客园)5、合并更新步骤a) 新cookie 去除无效cookieb) 在新cookie里,寻找是否存在旧cookie里的名字。存在就用新的,丢掉旧的c) 两cookie组合到一个文本型变量中6、前端会用JS生成很多cookie,但是并非所有cookie都会检测。比如Hm_lvt开头的一般没啥用。
编码
编码不对是中文乱码的根源,也是导致提交数据出错的重要原因1、如何查看网页是何种编码<meta charset="UTF-8" />这只是告诉浏览器以何种方式解析文档 真正决定网页编码的是在文件保存的时候2、GBK GB2312 ANSI UTF83、URL编码与解码(UTF8)4、不要用 编码_URL解码 来转换response5、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
