多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
       爬虫实际上就是通过代码实现“自动”登陆,并且能够自动完成一些数据的下载,一般网站都会对一些允许抓取的数据进行规定,具体的规定内容写在了每个网站的robots文件中。         爬虫是数据挖掘和分析的第一部,及:获取数据,因而对于从事数据分析的人来说,首先应该“了解”。也就是说,对于想要从事数据挖掘的人来说,并不要求你爬虫的技术非常高超,只要能够知道里面的基本技术层面即可。个人认为,数据挖掘的要旨并非在于数据(尽管很多数据界的名人都似乎推崇“大数据”),而是在于对于数据后面事件的理解......         言归正传:         爬虫的基本框架是:模拟登陆——获取数据——存储数据,当然,每一个步骤中都涉及很多需要注意的地方,如在模拟登陆中,要考虑request的方式和数据内容(这里要了解一些http的基础知识[w3school](http://www.w3school.com.cn/) 可以经常去看看,如用到xpath的时候),还要验证码以及密码加密(如新浪和拉钩网)。         模拟登陆之前,还要掌握一些httpclient/firebug这些软件的基本操作,以及具备看懂request/post数据的“技能”,这些“拦截”软件能够在client(浏览器)和server互动时“截获”双方信息。ps:所以登陆公共场所的wifi极其危险。 #### 1 静态网站+密码可见         这种情况下,server要求不高,既没有动态码,也没有验证码,更没有加密,因而这类网站的模拟登陆一般非常好实现,只要python中的一些基本操作即可: * * * import urllib import urllib2 url=r"http://www.xxxx.com" # 加入“r“的目的是为了避免一些转义字符额识别问题,个人编习惯 request=urllib2.Request(url) rep=urllib2.urlopen(request) #此时的rep为instance,可以理解为类似于“文件”的东西 * * *         到这里已经将server返回的html文档记录在了rep中,后面就可以对rep进行读写操作         这里一定要注意网站的编码是什么,一般在“查看网站源码”中,可以看得到有一个为character=“utf-8”的内容,就表示网站html编码为utf-8,那么用python时,就必须对html进行decode(以utf-8编码方式转化为unicode),然后再进行其他处理,如正则表达式查找等。 content=rep.read().decode("utf-8") with open(r"yourfile.txt","w") as f: #将rep中的html文档以uft-8的形式进行编码后存储         f.write(content.encode("utf-8"))             好了,这就是一般网页的模拟登陆      * * * #### 2 网站拒绝“机器”登陆         一般来说,除了像学校网站以及学校bbs这类的网站,其他网站都会对“机器”登陆比较反感,毕竟,那么此时,就需要在以上的基础上模拟浏览器登陆。         浏览器登陆的时候会发送一些我们看不到的内容,想要模拟浏览器登陆,就必须将浏览器发送的内容以post的形式发送给server端。浏览器一般post的内容见下: * * * ![](https://box.kancloud.cn/2016-05-29_574a961ced0e7.jpg) 具体参数的意思,如果忘了可以再google一下(查问题一定要用google)       这里要注意的一个定方是accept-encoding那里是:gzip和defualt,也就是说server会以压缩包的形式法给你html文档(有的时候也不是,这个还是具体实验),那么如果是以gzip的形式返回html,那么就一定要“解压”,否则会宝HTTPError 500,这个异常出来,一般很难发现。具体解压方法后面介绍。       在模拟浏览器登陆的过程中,也没有必要全部按照post的形式发送,可以只发送一些User-Agent或者referer的东西。发送user-agent是因为有些server要通过这个参数来判断是否是浏览器,发送referer是由于“反盗链”的原因,大概意思就是防止本网站的链接内容被其他“二道贩子”用来“倒卖”。 那么,在上面代码的基础上,这里可以加入: headers={"User-Agent":"xxx","Referer":"xxx"} request改为: request=urllib2.Request(url,headers=headers)#在发送请求的时候加入header 这里附上urllib2的中文教程:[urllib2 tutorial](http://uliweb.clkg.org/tutorial/view_chapter/172)   PS:如果可以用Request库的还是用它吧  [request tutorial ](http://docs.python-requests.org/en/latest/user/quickstart/)