网络爬虫:爬虫就是模拟客户端发送网络请求,接收请求响应,一种按照一定得规则,自动的爬取互联网信息的程序
原则上来说,只要是浏览器做的事情,原则上,爬虫都能做。
主要用途:数据采集,其他用途,12306抢票,网站上投票,短信轰炸,网络攻击
爬虫分类:
通用爬虫 : 通常指搜索引擎和大型 Web 服务提供商的爬虫
聚焦爬虫 :针对特定网站的爬虫,定向的获取某方面数据的爬虫
累积式爬虫:从某一时间点开始,通过遍历的方式抓取系统所能允许存储和处理的所有网页
增量式爬虫:已下载的网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫(一般出现在累积式爬虫之后)
Deep web爬虫:不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的Web 页面
注:深网爬虫就是爬取一些需要用户登录的网页信息,有的网页需要登录才能显示。
爬虫原理图:
搜索引擎的局限:1.信息定位不明确,返回的信息内容90%无用,各种广告
2.图片,数据库,音频,多媒体等内容搜索引擎无能为力
3.不同用户搜索的目的不完全相同,但返回的页面都一致
Robots协议:网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。也叫绅士协议,可以不遵守
Http和Https区别:1.Https超文本传输协议,不安全,随时有被监听的风险,默认端口号80
2.在HTTP下加入了SSL(安全套接层),不让应用层之间跟传输层交互,而是加密之后再交互,保证数据的在网络上安全传输,但是性能降低。
描述一个百度浏览器访问页面的过程:www.baidu.com
当输入www.baidu.com url地址回车后,首先你的电脑会组织数据(你的域名地址)发送给本地的默认网关,通过路由器,根据路由表将数据发送到目的网关,然后目的网关根据mac地址,将域名发送到dns域名服务器,dns根据这个域名查询到目的ip,然后将这个ip地址沿原路返回给你的浏览器,然后你的浏览器根据这个ip地址,通过tcp三次握手跟远程服务器建立连接,完成之后浏览器发送Http请求,将要发送的数据封装到request报文中(请求行,请求头,请求体)发送给远程的web服务器,web服务器接收请求,进行逻辑处理后,会返回一个html文件给你的浏览器,浏览器接收到这个html文件会根据其引用的css,js,图片等信息,再次发送request请求下载这些文件,最终将html文件渲染成网页显示。
URL: 统一资源定位符:主要包括三大部分:1协议2ip地址(域名地址)和端口3path路径 还有参数和锚点(#定位在页面的哪个地方)。
scheme://host[:port#]/path/…/[?query-string][#anchor]
Http报文:分为两种:请求报文request和响应报文response
请求报文包括:1.请求行2请求头3请求体 GET /index.html HTTP/1.1 起始行 (请求方式,请求资源,请求版本,\r\n)
响应报文:1响应行2响应头3响应体 HTTP/1.1 200 OK # 起始行 版本信息,状态码, 描述信息
HTTP 1.0 指的是短连接 Http指的是长连接
长连接就是tcp连接之后,保持那个连接状态,保持通信管道,多次使用
比如视频,lol
短连接是每通信一次都要经历三次握手(打开)和四次挥手(关闭),比如简单打开一个网页
常见的请求头包括:1.Host主机2Connnection链接类型3Upgrade-Insecure-Requests (升级为HTTPS请求)4. User-Agent (用户代理)
6. Referer (页面跳转处)7. Accept-Encoding(文件编解码格式)8.Accept-Language(语言种类)9. Accept-Charset(字符编码)10. Cookie (Cookie)
GET和POST请求区别:
1.get请求和post请求都能发送和接收数据,但从语义上将GET一般是获取数据,POST是发送数据
2.get请求会将数据暴露在url中,不安全,post请求相对而言安全一些,它把数据放在请求体中
3.get请求的URl长度有限制,大概 是1024字节,而POST没有限制
4.Http协议中规定POST传输是安全的,所以当前端页面进行ajax和form表单post提交时,还需要进行csrf验证,解决跨站请求伪造的问题。
csrf攻击:就是攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全
个人总结:当启用中间件并加入标签csrf_token后,渲染模板文件时会生成一个名叫csrfmiddlewaretoken的隐藏域(对应生成一个value值,value值由系统生成),服务器会向客户端浏览器中写入一条key名叫csrftoken的Cookie信息,这条信息的值与隐藏域控制的value属性是一致的,当访问服务器时,会将这两个value值提交到服务器,然后由csrf中间件进行验证,如果value值一样,则csrf验证通过。如果对比失败则返回403页面,csrf验证失败。
http在设计时觉得POST涉及到安全问题,就为post设计了csrf验证,而GET不需要验证
byte和str: 二进制和字符串,互联网上数据都是以二进制的方式进行传输的。
bytes是Python3中特有的,Python 2 里不区分bytes和str。
字符集:ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等
.encode()编码,将字符串转为二进制bytes
.decode()解码,将bytes转为str
编码方式解码方式必须一样,否则就会出现乱码
requests 模块
中文文档 API: http://docs.python-requests.org/zh_CN/latest/index.html
requests主要是用于发送网络请求,返回响应数据
requests 的底层实现其实就是urllib,但是比urllib和urllib2好用
response = requests.get(url)
response的常用方法:
- response.text 获取str类型的响应
- respones.content 获取bytes类型的响应
- response.status_code 获取状态码
- response.request.headers 获取请求头
- response.headers 获取响应头
.text和.content的区别:
前者获取的是字符串类型,但是要指定编码的格式为response.encoding=”utf-8”,因为默认解码是utf-8格式,但是编码不一定是,需要指定,才能编码解码一致
后者是bytes类型,需要解码成utf格式:response.content.deocde(“utf8”),推荐使用这种方式获取数据。
为什么请求需要带上header?
模拟浏览器,欺骗服务器,获取和浏览器一致的内容
header是字典格式:
headers={"User-Agent": "Mozilla/5.0 (Windows NT 6.1;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110Safari/537.36"}
requests.get(url,headers=headers)
发送带参数的请求:
url="http://www.baidu.com/s?"
kw = {'wd':'长城'}
用法:requests.get(url,params=kw)
伪装请求头的test:获取的数据量大小不一致。伪装之后明显给的多。
带参数的请求,并写到本地html文件
抓取贴吧前10页的数据:
sys模块下的 argv,交互模式输入:
上下文管理器: with open('文件名',"打开方式") as f:
f.write()
f.read()
字符串格式化:
a = 'dasdasf%s' % ('hjl')
b ='asdasfa{}'.format('hjl')