• 爬虫总结


    爬虫很没意思,凌乱、无聊,只是当下有用的小工具,没有长久的意义
    网页是不停变化的,模拟登陆、爬网站这些垃圾代码过几天人家一更新网站就失效了
    固定网站的爬虫没有意义,但是爬虫框架却有意义

    爬虫第一招:F12
    必须要玩转自己的浏览器
    要知道每一次表单提交提交了哪些字段
    要知道每一次服务器返回附带了多少cookie
    要用editthiscookie等一些有用插件来修改cookie
    要通过鼠标悬停查看想要选择的标签,进而进行信息抽取

    爬虫就那么几招,就那么几个库。
    很多库设计的丑陋不堪毫无用处。
    有了requests库打死也不用urllib,虽然requests底层也是urllib
    解析HTML有三种方式:beautifulsoup,lxml,pyquery。
    有了pyquery打死也不用beautifulsoup,jquery式的接口是地球上最完美的接口之一
    什么?数据是通过AJAX加载的?那就用selenium控制浏览器,不仅可以半机械化(人可以手动输入验证码),也可以运行JS
    selenium是一个浏览器控制器,通过程序来控制浏览器。不同浏览器都有对应的驱动,selenium可以通过浏览器驱动来控制浏览器。
    PhatomJS是一个headless(无头)浏览器,跟HtmlUnit一样,它们都是无界面浏览器,运行速度比较快。
    浏览器是可以运行JS的,selenium是可以控制浏览器的,这样一来selenium+浏览器这个组合就解决了很多问题
    什么?访问太频繁,IP被封了?那就用ADSL拨号实现动态IP,需要自己买一个可以ADSL拨号的服务器作为代理服务器
    什么?ADSL服务器太贵?网上有很多公开的HTTP代理IP可用,写个爬虫爬下来一大批IP,进行一下筛选,测速选出能用的代理作为自己的IP池
    什么?用了代理还是被封了?有可能网站在你电脑上存放了cookie,每次IP虽然变了,cookie却在本地留着。
    什么?爬取速度慢?多线程多进程啊,再不行多台电脑分布式
    什么?需要验证码?需要根据验证码的类型来判断。破解简单验证码,OCR,百度一下“Python OCR”
    什么?需要登录?那就登录吧。方案一:了解登录的流程,弄清哪些token、cookie先请求后请求;方案二:selenium控制浏览器手动登录
    爬虫框架如Scrapy也可以用用
    一般情况下,大部分网站用上面这几招就全解决了。

    Python只需要会用requests库,Java只需要会用HttpClient

    常见Python爬虫框架

    • Pyspider
    • Scrapy

    常见Java爬虫框架

    • SpiderMan
    • Webmagic
    • Crawler4j

    分布式拒绝服务攻击

    从技术上说,IP 地址是可以通过发送数据包进行伪装的,就是分布式拒绝服务攻击技术(Distributed Denial of Service,DDoS),攻击者不需要关心接收的数据包(这样发送请求的时候就可以使用假 IP 地址)。但是网络数据采集是一种需要关心服务器响应的行为,所以我们认为 IP 地址是不能造假的。

    Tor 代理服务器

    洋葱路由(The Onion Router)网络,常用缩写为 Tor,是一种 IP 地址匿名手段。由网络志愿者服务器构建的洋葱路由器网络,通过不同服务器构成多个层(就像洋葱)把客户端包在最里面。数据进入网络之前会被加密,因此任何服务器都不能偷取通信数据。另外,虽然每一个服务器的入站和出站通信都可以被查到,但是要想查出通信的真正起点和终点,必须知道整个通信链路上所有服务器的入站和出站通信细节,而这基本是不可能实现的。

    在 Python 里使用 Tor,需要先安装运行 Tor。Tor 服务很容易安装和开启。只要去 Tor 下载页面下载并安装,打开后连接就可以。不过要注意,当你用 Tor 的时候网速会变慢。这是因为代理有可能要先在全世界网络上转几次才到目的地!

    爬虫与反爬虫过招

    链接:原作者:知乎 申玉宝

    在爬虫与反爬虫的对弈中,爬虫一定会胜利。换言之,只要人类能够正常访问的网页,爬虫在具备同等资源的情况下就一定可以抓取到。

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔...

    Day 1
    小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库。
    这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(1.1.1.1)这个用户,并且 useragent 还是 JavaClient1.6 ,基于这两点判断非人类后直接在Nginx 服务器上封杀。

    Day 2
    小莫电影只爬了一半,于是也针对性的变换了下策略:1. useragent 模仿百度("Baiduspider..."),2. IP每爬半个小时就换一个IP代理。
    小黎也发现了对应的变化,于是在 Nginx 上设置了一个频率限制,每分钟超过120次请求的再屏蔽IP。 同时考虑到百度家的爬虫有可能会被误伤,想想市场部门每月几十万的投放,于是写了个脚本,通过 hostname 检查下这个 ip 是不是真的百度家的,对这些 ip 设置一个白名单。

    Day 3
    小莫发现了新的限制后,想着我也不急着要这些数据,留给服务器慢慢爬吧,于是修改了代码,随机1-3秒爬一次,爬10次休息10秒,每天只在8-12,18-20点爬,隔几天还休息一下。
    小黎看着新的日志头都大了,再设定规则不小心会误伤真实用户,于是准备换了一个思路,当3个小时的总请求超过50次的时候弹出一个验证码弹框,没有准确正确输入的话就把 IP 记录进黑名单。

    Day 4
    小莫看到验证码有些傻脸了,不过也不是没有办法,先去学习了图像识别(关键词 PIL,tesseract),再对验证码进行了二值化,分词,模式训练之后,识别了小黎的验证码(关于验证码,验证码的识别,验证码的反识别也是一个恢弘壮丽的斗争史,这里先不展开....),之后爬虫又跑了起来。
    小黎是个不折不挠的好同学,看到验证码被攻破后,和开发同学商量了变化下开发模式,数据并不再直接渲染,而是由前端同学异步获取,并且通过 js 的加密库生成动态的 token,同时加密库再进行混淆(比较重要的步骤的确有网站这样做,参见微博的登陆流程)。

    Day5
    混淆过的加密库就没有办法了么?当然不是,可以慢慢调试,找到加密原理,不过小莫不准备用这么耗时耗力的方法,他放弃了基于 HttpClient的爬虫,选择了内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎中js 加密脚本算出了正确的结果,又一次拿到了对方的数据。
    小黎:.....

    爬虫与发爬虫的斗争还在继续。
    不过实际应用时候,一般大家做到根据 IP 限制频次就结束了,除非很核心的数据,不会再进行更多的验证,毕竟工程的问题一半是成本的问题。

  • 相关阅读:
    微信小程序基础学习笔记
    Redis基础知识
    JVM热加载class文件(findLoadedClass)
    FLUSH TABLE WITH READ LOCK详解(转载)
    PostgreSQL前世今生(转载)
    MySQL中CREATE DATABASE和CREATE SCHEMA区别(转载)
    如何学习iOS开发
    iOS 去掉高光显示
    Cloud computing open source industry conference
    Intelligent Manufacturing Industry Forum
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6569326.html
Copyright © 2020-2023  润新知