关于浏览器
浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示想要访问的网络资源。这里资源一般是指 HTML 文档,图片等其他的类型。资源的位置由用户使用 URL(统一资源标示符)指定。
而浏览器的核心——渲染引擎便是负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。
工作流程:
1. 输入URL地址或者点击URL的一个链接
2. 浏览器根据URL地址,结合DNS,解析出URL对应的IP地址
1)浏览器通过发送一个TCP的包,要求服务器打开连接
2)服务器也通过发送一个包来应答客户端的浏览器,告诉浏览器可以发送数据给服务器
3)发送HTTP请求
4. 服务器接到请求后,返回相应的响应内容
5. 浏览器解析从服务器端返回的响应内容,并且把页面显现出来
当输入URL之后,浏览器就要知道这个URL对应的IP是什么,只有知道了IP地址,浏览器才能准备的把请求发送到指定的服务器的具体IP和端口号上面。然后服务器端把响应结果发送到客户端。这个响应结果就是html的文档,不包含什么图片,脚本,CSS等的,也就是页面的html结构。下一步就是浏览器解析页面的过程,也就是一步步从上到下的解析html的骨架了。如果此时在html文档中,遇到了img标签,那么浏览器就会发送HTTP请求到这个img响应的URL地址去获取图片,然后呈现出来。
关于http协议
在Web应用中,服务器把网页的HTML代码发送给浏览器,让浏览器显示出来。这个由请求和响应构成的便是一个标准的客户端服务器模型,其中的传输协议便是HTTP。
http协议特点:1)传输明文内容,安全性比较差
2 ) 无状态协议(同一个客户端的这次请求同上次请求没有对应关系)
常见的请求头如下:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection keep-alive
Cookie Hm_lvt_dd4738b5fb302cb062ef19107df5d2e4=1481881726,1482225141; Hm_lpvt_dd4738b5fb302cb062ef19107df5d2e4=1483061342
Host offlintab.firefoxchina.cn
Referer http://offlintab.firefoxchina.cn/?cachebust=20150714 #指明该请求是从哪个关联连接而来
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
常见的响应头如下:
Age 865
Cache-Control max-age=900
Content-Encoding gzip
Content-Length 2163
Content-Type application/json
Date Fri, 30 Dec 2016 01:23:46 GMT
Etag "584f7c52-1609" #服务端返回的响应数据的标识字段,客户端可根据此字段的值向服务器发送某URL是否更新的信息
Expires Fri, 30 Dec 2016 01:28:26 GMT
Last-Modified Tue, 13 Dec 2016 04:42:58 GMT
Server nginx
X-Cache HIT from SK-SQUIDWEB-18 #x-cache项指浏览器从何处、是在哪个代理缓存载入的网页文件
X-Cache-Lookup HIT from SK-SQUIDWEB-18:8080 #x-cache-lookup项指专门查看代理服务器中是否有某个网页缓存。有就返回HIT,没有返回MISS
X-Via 1.1 yangdxin66:10 (Cdn Cache Server V2.0)
Cookie和Session机制
Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。
Session可以用Cookie来实现,也可以用URL回写的机制来实现。用Cookie来实现的Session可以认为是对Cookie更高级的应用。
Cookie和Session有以下明显的不同点:
1)Cookie将状态保存在客户端,Session将状态保存在服务器端;
2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。
import urllib
import urllib2
import cookielib filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
postdata = urllib.urlencode({
'email': 'example@webscraping.com',
'password': 'example',
}) loginUrl = 'http://example.webscraping.com/user/login'
response = opener.open(loginUrl,postdata)
#保存cookie到cookie.txt中
cookie.save(ignore_discard=True, ignore_expires=True)
import re
import requests def login():
url = 'http://example.webscraping.com/user/login' # 登陆地址
s = requests.Session() # 创建一个session,带着 session 去获取 key(表单隐藏值)
#print s
8 try:
get_res = s.get(url).text
get_key = re.findall(r'<input name="_formkey" type="hidden" value="(.*?)" />',get_res,re.S) # 正则匹配 key 的值
#print get_key[0] # 打印key值
data = {
'email': 'example@webscraping.com',
'password': 'example',
'_next': '/view/Aland-Islands-2',
'_formkey': get_key[0],
'_formname': 'login'
}
# 构造表单需要提交的数据
res_login = s.post(url, data=data).text # 尝试登陆
info = re.findall(r'<a class="dropdown-toggle" data-toggle="dropdown" href="#" rel="nofollow">(.*?)</a>',
res_login, re.S) print u'登陆成功!','Hi', info[0]
## End ##
except:
print u'登陆失败'
exit(0) if __name__ == '__main__':
login()
运行结果:
登陆成功! Hi Welcome Test Account