原文网址:http://www.crifan.com/summary_about_flow_process_of_fetch_webpage_simulate_login_website_and_some_notice/
这里只是做为小结和吸收要点
去访问一个URL地址,获得对应的网页的过程,其对应的内部机制是
准备好对应的Http请求(Http Request)+ 提交对应的Http Request
–>
获得返回的响应(Http Response) + 获得Http Response中的网页源码
一: 准备此Http请求Request (访问URL之前的准备工作)
1:基本的url + 查询字符串
比如: 完整的url = http://www.crifan.com/?s=crifan&submit=Search
URL地址,其实涉及到编码和解码的问题:
具体可以看如下的
http://www.crifan.com/summary_url_encode_and_decode_during_http_get_post_request
2:GET还是POST
2.1. get是从服务器上获取数据,post是向服务器传送数据。
2.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
2.3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
2.4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
2.5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
建议:
2.1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2.2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
更多的get和post的区别其实可以看:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
3:必须或可选:Headers
即request header,头信息Headers,包含很多个Header
有些是必须的,有些是可选的(根据不同情况,可忽略的)
有的时候,甚至不设置任何header也是可以的。
4:[可选]Post Data
如果是POST方法,则还需要填写对应的数据:
此数据:
-
IE中称为request body
-
Chrome中称为Post Data
换句话说:
如果是GET,则是没有POST数据的。
提示:所以,你在IE9中通过F12抓取到的内容中,会看到,对于所有的GET请求,对应的“请求正文(request body)”都是空的。
5: 必须或可选:cookie
很多时候,访问对应url还需要提供对应的cookie。
一般来说,模拟登陆等情况下,往往都会涉及到cookie的
6:其他一些可能需要准备的东西
(1)代理proxy
(2)设置最大超时timeout时间
二:提交HttpRequest,即可获得此http请求的响应Response(访问URL之后的要做的工作)
1.获得对应的响应response
2.从响应中获得对应的网页源码等信息
(1)获得返回的网页HTML源码(或json等)
(2)[可选]如果有需要,还要获得对应的cookie
(3)[可选]判断返回的其他一些相关信息,比如response code等
【网页抓取过程中的注意事项】
1.网页跳转Redirect
(1)直接跳转
(2)间接跳转
A。javascript脚本中有对应的代码实现网页跳转
B。本身所返回的HTML源码中包含refresh动作,所实现的网页跳转
三:抓取网页后,如何分析获得所需要的内容
一般来说,去访问一个URL地址,所返回的内容,多数都是网页的HTML源码,也有其他一些形式的内容的,比如json等。
1. 对于HTML源码:
(1)如果是Python中的话,可以通过调用第三方的Beautifulsoup库
BlogsToWordPress v3.0 – 将百度空间,网易163等博客搬家到WordPress
(2)直接使用正则表达式自己去提取相关内容
A。Python:使用re模块,常用的函数是find,,findall,search等。
B:C#:使用Regex类,用对应的pattern和match函数来匹配。
关于C#中的Regex,更多内容请参考:
2.对于Json
可以先去看专门的关于JSON的介绍:
然后再看下面的如何处理Json。
(1)使用库(函数)来处理
A。Python
Python中,有对应的json库,常用的是json.load,即可将json格式的字符串,转换为对应的字典Dictionary类型变量,很是好用。
(2)还是使用正则表达式来处理
A。Python
Python中的re模块,同上。
B。C#
C#中貌似没有自带json的库,倒是有很多第三方的json库,但是我当时遇到解析json字符串的时候,觉得这些库,使用起来还是很麻烦,所以还是直接使用regex类来处理了。