Python有关爬虫的一些总结

1.爬虫:

网络爬虫(又被称为网页蜘蛛,网络机器人,在 FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取 万维网信息的程序或者 脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者 蠕虫。

2.简单爬虫的制作流程:

       在Python中实现爬虫程序还是很容易的,先上代码:
import urllib2,urllib
import re


url = "http://www.hao123.com/"
reg=r'src="(.+?.jpg)"'          #匹配jpg格式的图片
partten=re.compile(reg)        #制定匹配pattern
page=urllib2.urlopen(url).read()  #read到page中
png=re.findall(parttern,page)     
i=1
for x in png:
urllib.urlretrieve(x,'%s.jpg'%i)   #下载到本地并命名保存
i += 1
if i==5:                                          #一次不要下太多
break

可见,一般流程就是先用urlopen().read()方法获得制定URL页面的所有内容,接下来我们就要对下载到的内容进行筛选了-----正则表达式是这一步的关键。
首先,你的知道你的爬虫想要爬什么东西,然后审查该元素的HTML标记(这里推荐用火狐的firebug插件,非常方便),最后制定准确的正则表达式来匹配你想要的内容。
关于正则表达式的内容,请看其他文档,w3cschool上面的用来入门很好。

3.通用的网络爬虫框架

Python有关爬虫的一些总结_第1张图片



这种爬虫框架是用来有计划爬取很多网页的,一般搜索引擎会用到这些,来定期的抓取未知的网页和更新了的网页。

4.抓取策略

1、宽度(广度)优先,兼顾深度的遍历策略;
 
① 采用广度优先的原因:
  • 重要的网页往往离种子站点距离较近;万维网的深度没有我们想象的那么深,但却出乎意料地宽(中文万维网直径长度只有17,即任意两个网页之间点击17次后便可以访问到);
  • 宽度优先有利于多爬虫合作抓取;
② 广度优先的存在不利结果:
  • 容易导致爬虫陷入死循环,不该抓取的反复抓取;
  • 应该抓取的没有机会抓取;
③ 解决以上两个缺点的方法是深度抓取策略(Depth-First Trsversal)和不重复抓取策略
 
④ 为了防止爬虫无限制地宽度优先抓取,必须在某个深度上进行限制,达到这个深度后停止抓取,这个深度就是万维网的直径长度。当最大深度上停止抓取时,那些深度过大的未抓取网页,总是期望可以从其他种子站点更加经济地到达。限制抓取深度会破坏死循环的条件,即使出现循环也会在有限次后停止。
 
⑤评价:
   宽度(广度)优先,兼顾深度的遍历策略,可以有效保证抓取过程中的封闭性,即在抓取过程(遍历路径)中总是抓取相同域名下的网页,而很少出现其他域名下的网页。
 
2、不重复抓取策略
 
    保证一个变化不大的网页只抓取一次即可,防止重复抓取占用大量CPU和带宽资源,从而集中有限的资源区抓取更重要、质量更高的网页。
 
3、大站优先策略(Larser Site First)
 
     通常大型网站都是优质的内容,网页质量一般较高,以网站为单位来衡量网页重要性,是有一定依据的。对于待抓取URL队列中的网页,根据等待下载的页面多少来判断下载优先级。
 
4、非完全PageRank策略(Partial PageRank)
 
   对于已经下载的网页(不完整的互联网页面的子集)内,加上待抓取的URL队列中的URL一起,形成网页集合,在此集合内部进行PageRank计算;计算完成以后,将待抓取URL队列里的网页按照PageRank得分由高到低排序,形成序列就是爬虫接下来应该依次抓取的URL列表。
 
   由于PageRank是一个全局算法,就是当所有网页都被下载完成以后,其计算结果才是可靠的,但是爬虫在抓取过程中只能接触到一部分网页,所以在抓取阶段的网页时无法进行可靠的PageRank计算的,所以叫做非完全PageRank策略。
 
5、OCIP策略(Online Page Importance Computation)
 
   OCIP字面含义为“在线页面重要性计算”,算是一种改进的PageRank算法。算法开始前,每个互联网页面被赋予相同的数值,每当下载了某个页面P后,P将自己拥有的数值平均分配给页面中包含的链接,同时清空自己的数值。对于待抓取URL队列中的网页,根据其手头数值大小排序,优先下载数值较大的网页。
 
6、合作抓取策略(抓取提速策略)
 
  增加爬虫数量可以提高总体抓取速度,但需要将工作量分解给不同的网页爬虫,以保证分工明确,防止出现多个爬虫抓取相同的页面,浪费资源。
 
 ① 通过web主机的IP地址来分解,让某个爬虫仅抓取某个地址段的网页
 
    对于中小型网站,出于经济的考虑,通常会在一台服务器中提供不同的web服务,这样就出现多个域名对应一个IP段的情况;但新浪、搜狐等大型网站通常采用负载均衡的IP组技术,同样的域名对应多个IP地址。所以这种方式并不方便
 
 ② 通过网页域名来分解,使某个爬虫仅抓取某个域名段的网页
      
    将不同域名分配给不同爬虫抓取,某一个爬虫只抓取固定域名集合下的网页;这样保证不重复抓取大型网站的网页,中小型网站即便重复抓取也可以接受的策略分配任务。所以,为了抓取大网站,按照域名分解的策略更加合理。
 



5.一些小知识点

①有的网站会反感爬虫程序
解决办法:设置header 伪装成浏览器访问

某些网站反感爬虫的到访,于是对爬虫一律拒绝请求
这时候我们需要伪装成浏览器,这可以通过修改http包中的header来实现

[python]  view plain copy
  1. #…  
  2.   
  3. headers = {  
  4.     'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'  
  5. }  
  6. req = urllib2.Request(  
  7.     url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',  
  8.     data = postdata,  
  9.     headers = headers  
  10. )  
  11. #...  

 ②对付反盗链

某些站点有所谓的反盗链设置,其实说穿了很简单,

就是检查你发送请求的header里面,referer站点是不是他自己,

所以我们只需要像把headers的referer改成该网站即可,以baidu为例:

#...
headers = {
    'Referer':'http://www.baidu.com'
}
#...

headers是一个dict数据结构,你可以放入任何想要的header,来做一些伪装。

例如,有些网站喜欢读取header中的X-Forwarded-For来看看人家的真实IP,可以直接把X-Forwarde-For改了。


③有时候的注意编码与解码

你可能感兴趣的:(爬虫)