zoukankan      html  css  js  c++  java
  • 爬虫相关

    一、反爬机制和应对措施

    1、通过Headers

    措施:添加User-Agent和Referer

    2、基于用户行为

    措施:代理IP、延迟爬取

    3、动态页面

    措施:requests模拟ajax请求,如果请求加密了使用selenium+phantomJS

    验证码解决:Tesseract

    二、Scrapy运行机制及优缺点

    从start_urls里获取第一批URL并发送给Scrapy引擎,引擎交给调度器进入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去下载资源,并将响应交给Spider编写的解析方法做提取处理

    1、如果提取出需要的数据,交给管道进行处理

    2、如果提取出URL,则继续入请求队列,执行前面的操作

    优点:

    1、异步的

    2、采取可读性更强的Xpth代替正则

    3、可以同时在不同的URL上爬取

    4、支持Shell方式,方便独立调试

    5、写中间件,方便写一些同一的过滤器

    6、通过管道方式存入数据库

    缺点:

    1、基于python的爬虫框架,扩展性比较差

    2、基于twisted异步框架,出错后不会停掉其他任务。数据出错很难察觉

    三、代理IP及维护

    透明代理:客户端根本不需要知道有代理服务器的存在,但是它传送的任然是真是的IP

    普通匿名代理:能隐藏掉客户机的真是IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理

    高匿名代理:不改变客户机的请求,客户的真实IP是隐藏的,服务器端不会认为我们使用了代理

    维护:

    一般代理的存活时间往往十几分钟。定时任务,加上代理IP去访问网页,验证是否可用,如果返回状态200,表示代理可用。

    四、增量爬取

    五、判断网站更新

    使用MD5数字签名。每次下载网页时,把服务器返回的数据流先放在缓冲区,然后对其生成MD5数字签名S1,下次下载同样生成签名S2,比较S1和S2,如果相同,则页面没有更新,否则网页有更新。

    六、爬取数据去重

    1、使用scrapy自带的set集合去重,当程序结束的时候会被清空。缺点:再次运行会导致数据重复。

    2、对url地址进行md5,base64加密,加密之后会得到一串字符,判断字符串是否在mysql表中,如果在表示已经爬取过了,如果不在,表示没有爬取。缺点: 但是这个方法对mysql压力过大,导致崩溃,不推荐

    3、使用scrapy_redis的去重。会将已经爬取的url地址经过编码后存入redis,并且会做数据持久化,当爬虫再次启动时,会重新加载本地的数据,对爬虫的url做去重。缺点:如果数据量较大的时候,会占用较多的内存空间

    4、使用布隆去重。采用多重哈希,将url地址映射到位阵列中的某个点上,空间和时间利用率更高(推荐)

    七、分布式爬虫策略

    1、Slaver端从Master端拿任务进行数据抓取,同时也生成新的任务,并将任务抛给Master。Master端只有一个Redis数据库,负责对Salver提交的任务去重,加入带爬队列。

    2、Master端负责生产任务,并把任务去重,加入待爬队列。Slaver只管从Master端拿任务去爬。

    3、Slaver在遇到新任务时询问Master此任务是否已爬,如果未爬则加入Slaver自己的待爬队列中,Master把此任务记为已爬。

  • 相关阅读:
    ios添加第三方字体
    IOS 适应各种iphone屏幕尺寸
    sqlite第三方类库FMDB的使用
    IOS--沙盒机制
    用plist建立UITabController
    Xcode7 使用NSURLSession发送HTTP请求报错[转]
    网络开发--NSURLConnection类的简单介绍
    TF-IDF
    《汇编语言》——王爽 第12章 内中断
    操作系统 L4操作系统接口+L5系统调用的实现(网易公开课)
  • 原文地址:https://www.cnblogs.com/kingshine007/p/11483387.html
Copyright © 2011-2022 走看看