zoukankan      html  css  js  c++  java
  • python爬虫总结

    由于某些原因最近终于可以从工作的琐事中抽出身来,有时间把之前的一些爬虫知识进行了一个简单的梳理,也从中体会到阶段性地对过往知识进行梳理是真的很有必要。

    常用第三方库

    对于爬虫初学者,建议在了解爬虫原理以后,在不使用任何爬虫框架的情况下,使用这些常用的第三方库自己实现一个简单的爬虫,这样会加深对爬虫的理解。

    urllib和requests都是python的HTTP库,包括urllib2模块以巨大的复杂性代价获取综合性的功能。相比于urllib2,Requests模块更能简约的支持完整的简单用例。关于urllib和requests的优缺点和区别,大家可以去网上查一下。

    BeautifulSoup和lxml都是python页面解析的库。BeautifulSoup 是基于 DOM 的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多。而lxml只会进行局部遍历,使用xpath能够很快定位标签。bs4 是用 python 写的,lxml 是 c 语言实现的,也决定了lxml比bs4要快。

    该博客有比较全面的关于python爬虫常用第三方库的汇总,可做参考。
    https://blog.csdn.net/woshisunchi/article/details/60877817

    爬虫框架

    python常用的爬虫框架就是scrapy和pyspider两个。
    关于框架的使用方法及详细介绍,可参考官方文档。

    动态页面渲染

    1. url请求分析

    (1)认真分析页面结构,查看js响应的动作;
    (2)借助浏览器分析js点击动作所发出的请求url;
    (3)将此异步请求的url作为scrapy的start_url或者yield reques再次进行抓取。

    2. selenium

    Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

    Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的页面,甚至页面截屏,或者判断网站上某些动作是否发生。

    Selenium自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。

    3. phantomjs

    使用selenium调用浏览器进行抓取页面时,由于要执行打开浏览器并渲染页面的操作,当进行大规模数据抓取时效率较低,无法满足需求。这时我们可以选择使用phantomjs。

    PhantomJS是一个基于Webkit的"无界面"(headless)浏览器,它会把网站加载到内存并执行页面上的JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器更高效。

    如果我们把Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理JavaScript、Cookie、headers,以及任何我们真实用户需要做的事情。

    4. splash

    Splash是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。

    python连接splash的库叫做scrapy-splash,scrapy-splash使用的是Splash HTTP API, 所以需要一个splash instance,一般采用docker运行splash,所以需要安装docker。

    5. spynner

    spynner是一个QtWebKit的客户端,它可以模拟浏览器,完成加载页面、引发事件、填写表单等操作。

    爬虫防屏蔽策略

    1. 修改User-Agent

    User-Agent是一种最常见的伪装浏览器的手段。

    User-Agent是指包含浏览器信息、操作系统信息等的一个字符串,也称之为一种特殊的网络协议。服务器通过它判断当前访问对象是浏览器、邮件客户端还是网络爬虫。在request.headers里可以查看user-agent,关于怎么分析数据包、查看其User-Agent等信息,这个在前面的文章里提到过。

    具体方法可以把User-Agent的值改为浏览器的方式,甚至可以设置一个User-Agent池(list,数组,字典都可以),存放多个“浏览器”,每次爬取的时候随机取一个来设置request的User-Agent,这样User-Agent会一直在变化,防止被墙。

    2. 禁止cookies

    cookie其实是储存在用户终端的一些被加密的数据,有些网站通过cookies来识别用户身份,如果某个访问总是高频率地发请求,很可能会被网站注意到,被嫌疑为爬虫,这时网站就可以通过cookie找到这个访问的用户而拒绝其访问。

    通过禁止cookie,这是客户端主动阻止服务器写入。禁止cookie可以防止可能使用cookies识别爬虫的网站来ban掉我们。

    在scrapy爬虫中可以设置COOKIES_ENABLES= FALSE,即不启用cookies middleware,不向web server发送cookies。

    3. 设置请求时间间隔

    大规模集中访问对服务器的影响较大,爬虫可以短时间增大服务器负载。这里需要注意的是:设定下载等待时间的范围控制,等待时间过长,不能满足短时间大规模抓取的要求,等待时间过短则很有可能被拒绝访问。

    设置合理的请求时间间隔,既保证爬虫的抓取效率,又不对对方服务器造成较大影响。

    4. 代理IP池

    其实微博识别的是IP,不是账号。也就是说,当需要连续抓取很多数据的时候,模拟登录没有意义。只要是同一个IP,不管怎么换账号也没有用,主要的是换IP。

    web server应对爬虫的策略之一就是直接将IP或者整个IP段都封掉禁止访问,当IP被禁封后,转换到其他IP继续访问即可。方法:代理IP、本地IP数据库(使用IP池)。

    5. 使用Selenium

    使用Selenium来模拟人工点击访问网站,是种很有效的防止被ban的方式。但是Selenium效率较低,不适合大规模数据抓取。

    6. 破解验证码

    验证码是现在最常见的防止爬虫的手段。有能力的小伙伴可以自己写算法破解验证码,不过一般我们可以花点钱使用第三方打码平台的接口,轻松实现验证码的破解。

    结语

    以上内容就是关于python爬虫的一点梳理,具体到某个技术点需要自己再查详细资料。希望对于学习爬虫的同学有一点点帮助。

  • 相关阅读:
    ZeptoLab Code Rush 2015
    UVa 10048 Audiophobia【Floyd】
    POJ 1847 Tram【Floyd】
    UVa 247 Calling Circles【传递闭包】
    UVa 1395 Slim Span【最小生成树】
    HDU 4006 The kth great number【优先队列】
    UVa 674 Coin Change【记忆化搜索】
    UVa 10285 Longest Run on a Snowboard【记忆化搜索】
    【NOIP2016提高A组模拟9.28】求导
    【NOIP2012模拟10.9】电费结算
  • 原文地址:https://www.cnblogs.com/jinhaolin/p/9018028.html
Copyright © 2011-2022 走看看