合法的爬虫
公开的数据,没有标识不可爬取
不影响别人服务器
不影响的业务
不合法的爬虫
用户数据
部分网站、APP数据超过指定数量
明文规定不让爬取
页面上标明
影响业务
影响服务器
类似DDOS攻击的问题
提示
在域名后加上/robots.txt查看是否让爬取
部分爬虫虽然违法,但公司、或企业不会直接报警。会采用反爬的手段,严重后才会报警
反爬
有时企业不想自己的数据被别人拿到。这时就会设置反爬的手段,来不让爬虫获取数据
反爬虫常用一些手段
合法检测:请求校验(useragent,referer,接口加签 ,等)
验证码:识别文字、做题、滑动等
小黑屋:IP/用户限制请求频率,或者直接拦截
投毒:反爬虫高境界可以不用拦截,拦截是一时的,投毒返回虚假数据,可以误导竞品决策
反反爬
破解掉反爬手段,再获取其数据。
基本流程
1目标数据:想要什么数据
2来源地址
3结构分析
具体数据在哪(网站、还是APP)
如何展示的数据
4实现构思
5操刀编码
基本手段
1破解请求限制
请求头设置,如:useragant为有效客户端
控制请求频率(根据实际情景)
IP代理
签名/加密参数从html/cookie/js分析
2破解登录授权
请求带上用户cookie信息
3破解验证码
简单的验证码可以使用识图读验证码第三方库
解析数据
1HTML Dom解析
正则匹配,通过的正则表达式来匹配想要爬取的数据,如:有些数据不是在html 标签里,而是在html的script 标签的js变量中
使用第三方库解析html dom,比较喜欢类jquery的库
2数据字符串
正则匹配(根据情景使用)
转 JSON/XML 对象进行解析
对于爬虫来说,最核心的就是发送请求,让网络服务器返回相应的数据。而最为核心之一就是找到URL,这时就需要一个可以帮助我们分析URL的工具,浏览器开发者工具
打开方式
打开浏览器,按快捷键F12即可打开
导入所需的类库
from urllib.request import Request, urlopen
发送请求
requset.urlopen(url,data,timeout)
url:即URL,(必须要)
data:是访问URL时要传送的数据(默认为空None)
timeout:是设置超时时间(默认为socket._GLOBAL_DEFAULT_TIMEOUT)
获取响应
response.getcode()
返回 HTTP的响应码,成功返回200,4服务器页面出错,5服务器问题
response.read()
read()方法就是读取文件里的全部内容,返回bytes类型
resp.read().decode()#decode() 默认UTF-8
resp.read().decode()[:1500]#decode()默认UTF-8 并且用切片操作截取前1500个字符
response.geturl()
返回 返回实际数据的实际URL,防止重定向问题
response.info()
返回 服务器响应的HTTP报头
使用urllib.request.urlopen发送请求时,可以将参数封装到一个Request对象中
url 发送的请求链接
headers 请求头信息
data 请求数据
发送请求/响应header头的含义
Accept告诉服务器,客户端支持的数据类型
Accept-Charset告诉服务器,客户端采用的编码
Accept-Encoding告诉服务器,客户机支持的数据压缩格式
Accept-Language告诉服务器,客户机的语言环境
Host客户机通过这个头告诉服务器,想访问的主机名
If-Modified-Since客户机通过这个头告诉服务器,资源的缓存时间
Referer客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的。(一般用于防盗链)
User-Agent客户机通过这个头告诉服务器,客户机的软件环境【用于伪装,访问后拿过来】
Cookie客户机通过这个头告诉服务器,可以向服务器带数据
Refresh服务器通过这个头,告诉浏览器隔多长时间刷新一次
Content-Type服务器通过这个头,回送数据的类型
Content-Language服务器通过这个头,告诉服务器的语言环境
Server服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding服务器通过这个头,告诉浏览器数据采用的压缩格式
Content-Length服务器通过这个头,告诉浏览器回送数据的长度
先写个最简单爬虫,爬取百度的首页里面的内容
from urllib.request import urlopen
response = urlopen("http://www.baidu.com/")
print(response.read().decode())