爬虫抓取技术

  互联网数据很多,发现好内容并能持续不断的抓取是一项不简单的工作。

反反爬虫

爬虫的固定套路也就那么多,各种网站爬取策略的不同就在于网站的反爬虫机制不同,因此多作试验,摸清网站的反爬机制,是大规模爬虫的先行工作。爬虫与反爬虫是无休止的斗争,也是一个见招拆招的过程,但总体来说,以下方法可以绕过常见的反爬虫。

  • 加上headers。这是最基础的手段。加上了请求头就可以伪装成浏览器,混过反爬的第一道关卡;反之,连请求头都不加,网站可以直接看出是程序在访问而直接拒绝。一般的网站加上User-Agent就可以,反爬严格的网站则要加上cookie甚至各种参数都要加上。
  • 随机延时。这是最简单有效的一种手段。稳定性是大规模爬虫的另一个核心问题,虽然与效率冲突。许多网站都会统计同一个IP一段时间内的访问频率,如果采集过快,会直接封禁IP。不要为了一时爽而不加延时导致几分钟后IP就被封24小时,还不如老老实实地加延时慢慢爬一夜爬完。至于延时加多少因各个网站而异,但一般情况下延时个3~5秒就足够了。
  • 如果页面量实在太大,每次访问设置的随时延时也会成为额外大量的时间成本。单个IP快速访问会有被封的风险,这是就要用代理池,有两点好处:一是降低某个IP单位时间内的访问频率,降低被封风险;二是即使IP被封,也有别的IP可以继续访问。代理池有免费和收费的,免费代理可以从许多网站上获取(这也是一个爬虫项目),但大部分都没用,有用的小部分也会很快挂掉;收费代理好一点,但也好不了多少。高质量的代理成本就高了不少,这个要结合项目实际需求来考虑成本。所以,如果网站不封IP就可以不用代理,以免减慢访问速度,增大被拒的概率。
  • 有的网站必须要登录才能访问,才能爬虫。以知乎为例,知乎的模拟登录必较简单,甚至现在都没有对帐号和密码加密,直接明文post就可以。请求头的cookie含有登录信息,而知乎的cookie寿命较长,所以可以直接在网站上人工登录然后把cookie复制到代码中;知乎目前的反爬机制是如果判断是机器人就封帐号但不封IP——封IP是同样的机器无法访问,但却可以用同样的帐号在其他机器上访问;封号是同样的帐号在各种终端上都无法访问,但同一台机器上却可以换号访问。基于这种机制,爬知乎就不需要IP代理池而需要的是帐号池。举另一个例子,腾讯有一个子网站,它也要求必须QQ登录,而且cookie只有6分钟的寿命,而且一个帐号一天只能访问130次超过就封号,无论爬得再慢——这种情况下只能搞大量的QQ号进行自动登录并不断切换。
  • 如果有的网站的反爬机制实在太过丧心病狂,各种JS代码逻辑十分复杂艰深,那只能模拟浏览器了。模拟浏览器其实就是一种自动的浏览器访问,与正常的用户访问很类似,所以可以跳过大部分的反爬机制,因为你装得实在太像正常用户;不过缺点也很明显,就是慢。所以可以用requests搞定的优先用requests,实在没有办法了再考虑模拟浏览器。
  • 验证码。验证码一出就蛋疼了……Python有自动识别图像的包,不过对于大部分网站的验证码都无能为力。写一个自动识别验证码的程序理论上不是不行,但是这种复杂的机器学习项目一点都不比爬虫系统本身难度低,从成本的角度考虑实在是得不偿失——何况对于有些网站如谷歌,验证码识别是非常困难的。所以对于验证码问题,首先是躲过去尽量不要触发验证码,实在触发了只能乖乖人工去填验证码。

好文章

http://www.cnblogs.com/lafengdatascientist/p/6740199.html

http://www.jianshu.com/p/f325430800e7

时间: 2024-08-27 23:47:04

爬虫抓取技术的相关文章

Python爬虫抓取技术的门道

web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单易学的html.css技术使得web成为了互联网领域里最为流行和成熟的信息传播媒介:但如今作为商业化软件,web这个平台上的内容信息的版权却毫无保证,因为相比软件客户端而言,你的网页中的内容可以被很低成本.很低的技术门槛实现出的一些抓取程序获取到,这也就是这一系列文章将要探讨的话题-- 网络爬虫 . 有很多人认为web应当始终遵循开放的精神,呈现在页面

基于Casperjs的网页抓取技术【抓取豆瓣信息网络爬虫实战示例】

CasperJS is a navigation scripting & testing utility for the PhantomJS (WebKit) and SlimerJS (Gecko) headless browsers, written in Javascript. PhantomJS是基于WebKit内核的headless browser SlimerJS则是基于Gecko内核的headless browser Headless browser: 无界面显示的浏览器,可以用于

爬虫技术(四)-- 简单爬虫抓取示例(附c#代码)

这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string> todo :进行抓取的网址的集合 List<string> visited :已经访问过的网址的集合 下面实现的是,给定一个初始地址,然后进行爬虫,输出正在访问的网址和已经访问的网页的个数. 需要注意的是,下面代码实现的链接匹配页面的内容如图一.图二所示: 图一: 图二: 简单代码示范如下:

python 爬虫抓取心得

quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quote('要编码的字符串') query = urllib.quote(singername) url = 'http://music.baidu.com/search?key='+query response = urllib.urlopen(url) text = response.read()

Python3简单爬虫抓取网页图片

现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2),所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到大家,并希望大家批评指正. 1 import urllib.request 2 import re 3 import os 4 import urllib 5 #根据给定的网址来获取网页详细信息,得到的html就是网页的源代码 6 def getHtml(url): 7 page = urllib.r

【Heritrix源代码分析4】开始一个爬虫抓取的全流程代码分析

在创建一个job后,就要开始job的运行,运行的全流程如下: 1.在界面上启动job 2.index.jsp 查看上述页面对应的源代码 <a href='"+request.getContextPath()+"/console/action.jsp?action=start'>Start</a> 3.action.jsp String sAction = request.getParameter("action"); if(sAction !

nodejs爬虫抓取数据 -- html 实体编码处理办法

cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下都会出现,这时,可能就需要转义一番了 类似这些 因为需要作数据存储,所有需要转换 Халк крушит. Новый способ исполнен 大多数都是&#(x)?\w+的格式 所以就用正则转换一番 var body = ....//这里就是请求后获得的返回数据,或者那些 .html()后获取的 //一般可以先转换为标准uni

C#网页爬虫抓取行政区划

借鉴C#网页爬虫抓取行政区划,从国家统计局获取了最新行政区域数据. 以下为代码贴片: 数据库类: public class City { public decimal ID { get; set; } public string Name { get; set; } public string Code { get; set; } public string Org_Level { get; set; } public string ParentCode { get; set; } public

Python爬虫抓取网页图片

本文通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地. 下面就看看如何使用python来实现这样一个功能. # -*- coding: utf-8 -*- import urllib import re import time import os #显示下载进度 def schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ''' per = 100.0 * a * b / c if per > 100 : per =