主题.jpg

1.爬取的背景

为甚我们会提到“搜狗引擎爬虫呢”,一切根源来自于最近需要爬取领英的会员资料,我们可以通过人名 | 领英的方式具体的搜索以查询结果,这只是爬取领英的其中一个方法,具体的方法我们之后会讲,大家可以期待一下哦!,好了,讲回正题,我们该如何爬取“搜狗引擎”呢,我们先去首页看看

搜狗首页.png

我们可以看到每个链接的右下角都会有对应的时间和快照,这个是什么意思呢,因为我们爬取领英时需要登录,如果我们不登陆的去访问领英,可以看到的只是一部分信息,但是这些信息也是足够了,问题在于我们不是每次访问领英都可以看得到具体的会员页,它会根据IP访问次数来限制你查看的会员页,比如:你查看10个左右的会员页之后会自动跳转到登录页,而我们并不想登录,原因之后再说。所以,在我们没有足够的IP去访问领英页面的时候怎么办???

答案就是:去爬“搜狗引擎”已经爬取好的缓存页-也就是快照页,这样我们等于变相去“假装”拥有大量IP去爬取领英了。

2.搜狗的反爬措施

搜狗虽然名气没有百度的大,但是也算是搜索引擎中比较知名的,毕竟可以背靠“腾讯”大佬,靠着微信搜索上一波流量,可以说,搜索在反爬这一方面也是挺下功夫的,大家可以看看“搜狗”关于爬虫的招聘

搜狗招聘.png

具体可以参考这里

不过他们貌似对于搜索方面的反爬限制的不是很严格,毕竟对于搜索来说,过于严苛的反爬反而对于用户的交互不是很理想, 我们来看看搜索之后的请求Cookie。

cookie.png

经过我测试,发现其中有几个参数异常重要,也是影响搜索反爬虫措施的关键参数,SUID、SNUID以及SUV。

SUID

SUID具体的含义可以自行百度,这里只讲述它生成的过程。当我们访问sogou搜索首页的时候,set-cookies中便会生成一个SUID参数的内容,除非重启浏览器,不然短时间内SUID并不会改变。SUID的值应该是sogou服务端随便分配的,只有当重新开启一个session时它的值才会更新。

SNUID

SNUID是sogou反爬虫的重点,sogou也是对同一个SNUID访问次数做了限制,而超过限制后,会跳转到验证码页面,只有输入验证码重新验证以后,SNUID才会更新,访问才能继续进行。那么SNUID是如何生成的呢?经过测试,应该是由javascript生成的,当然前提是要有SUID,SUID是生成SNUID的基础。

SUV

SUV参数内容是由javascript生成的,测试并没有发现其对于反爬虫有何影响,故本文不做详细介绍。

被屏蔽现象

同样,要解决反爬虫问题,我们先来看看触发反爬虫的现象。当同一个SNUID访问次数受限后,继续访问sogou会跳转到一个验证码页面。

URL地址:http://www.sogou.com/antispider/?from=%2fweb%3Fquery%3d152512wqe%26ie%3dutf8%26_ast%3d1488957312%26_asf%3dnull%26w%3d01029901%26p%3d40040100%26dp%3d1%26cid%3d%26cid%3d%26sut%3d578%26sst0%3d1488957299160%26lkt%3d3%2C1488957298718%2C1488957298893

大家可以看一下,是因为访问的过于频繁,导致需要验证码。

验证.png

这里,搜狗有个心机,他们说是由于IP问题,导致大多数人会从IP这点去考虑,然而,真相往往隐藏在深处.....

看看这个页面的源码HTTP/1.1 200 OK

Server: nginx

Date: Thu, 27 Oct 2016 04:41:19 GMT

Content-Type: text/html

Connection: keep-alive

X-Powered-By: PHP/5.3.3

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Content-Length: 5130HTML>

搜狗搜索

var domain = getDomain();        window.imgCode = -1;

(function() {            function checkSNUID() {                var cookieArr = document.cookie.split('; '),

count = 0;                for(var i = 0, len = cookieArr.length; i  -1) {

count++;

}

}                return count > 1;

}            if(checkSNUID()) {                var date = new Date(), expires;

date.setTime(date.getTime() -100000);

expires = date.toGMTString();                document.cookie = 'SNUID=1;path=/;expires=' + expires;                document.cookie = 'SNUID=1;path=/;expires=' + expires + ';domain=.www.sogou.com';                document.cookie = 'SNUID=1;path=/;expires=' + expires + ';domain=.weixin.sogou.com';                document.cookie = 'SNUID=1;path=/;expires=' + expires + ';domain=.sogou.com';                document.cookie = 'SNUID=1;path=/;expires=' + expires + ';domain=.snapshot.sogoucdn.com';

sendLog('delSNUID');

}            if(getCookie('seccodeRight') === 'success') {

sendLog('verifyLoop');

setCookie('seccodeRight', 1, getUTCString(-1), location.hostname, '/');

}            if(getCookie('refresh')) {

sendLog('refresh');

}

})();        function setImgCode(code) {            try {                var t = new Date().getTime() - imgRequestTime.getTime();

sendLog('imgCost',"cost="+t);

} catch (e) {

}            window.imgCode = code;

}

sendLog('index');        function changeImg2() {            if(window.event) {                window.event.returnValue=false

}

}

您的访问出错了返回首页>>

IP:183.129.218.233
访问时间:2016.10.27 12:41:19

用户您好,您的访问过于频繁,为确认本次访问为正常用户行为,需要您协助验证。

验证码:

换一张

提交

提交后没解决问题?欢迎反馈。

企业推广关于搜狗免责声明意见反馈
 © 2016SOGOU - 京ICP证050897号 - 京公网安备110000000025号

自动化生成SNUID

虽然知道了SNUID值生成的过程,但只有实现了自动化生成,才能正真绕过反爬虫的限制。

通过访问验证码页面获取

当访问验证码页面,并填写验证码完成验证后,会重新生成一个新的SNUID,而此请求可以重复发送(不需要再次输入验证码),每次发送都会生成一个新的SNUID。

通过模拟浏览器访问,执行javascript

可以利用phantomjs去爬取sogou页面,也能获取SNUID值。

获取SNUID代码#! -*- coding:utf-8 -*-'''

获取SNUID的值

'''import requestsimport jsonimport timeimport random'''

方法(一)通过phantomjs访问sogou搜索结果页面,获取SNUID的值

'''def phantomjs_getsnuid():

from selenium import webdriver

d=webdriver.PhantomJS('D:\python27\Scripts\phantomjs.exe',service_args=['--load-images=no','--disk-cache=yes'])    try:

d.get("https://www.sogou.com/web?query=")

Snuid=d.get_cookies()[5]["value"]    except:

Snuid=""

d.quit()    return Snuid'''

方法(二)通过访问特定url,获取body里面的id

'''def Method_one():

url="http://www.sogou.com/antispider/detect.php?sn=E9DA81B7290B940A0000000058BFAB0&wdqz22=12&4c3kbr=12&ymqk4p=37&qhw71j=42&mfo5i5=7&3rqpqk=14&6p4tvk=27&eiac26=29&iozwml=44&urfya2=38&1bkeul=41&jugazb=31&qihm0q=8&lplrbr=10&wo65sp=11&2pev4x=23&4eyk88=16&q27tij=27&65l75p=40&fb3gwq=27&azt9t4=45&yeyqjo=47&kpyzva=31&haeihs=7&lw0u7o=33&tu49bk=42&f9c5r5=12&gooklm=11&_=1488956271683"

headers={"Cookie":    "ABTEST=0|1488956269|v17;\

IPLOC=CN3301;\

SUID=E9DA81B7290B940A0000000058BFAB6D;\

PHPSESSID=rfrcqafv5v74hbgpt98ah20vf3;\

SUIR=1488956269"

}    try:

f=requests.get(url,headers=headers).content

f=json.loads(f)

Snuid=f["id"]    except:

Snuid=""

return Snuid'''

方法(三)访问特定url,获取header里面的内容

'''def Method_two():

url="https://www.sogou.com/web?query=333&_asf=www.sogou.com&_ast=1488955851&w=01019900&p=40040100&ie=utf8&from=index-nologin"

headers={"Cookie":    "ABTEST=0|1488956269|v17;\

IPLOC=CN3301;\

SUID=E9DA81B7290B940A0000000058BFAB6D;\

PHPSESSID=rfrcqafv5v74hbgpt98ah20vf3;\

SUIR=1488956269"

}

f=requests.head(url,headers=headers).headers    print f'''

方法(四)通过访问需要输入验证码解封的页面,可以获取SNUID

'''def Method_three():

'''

http://www.sogou.com/antispider/util/seccode.php?tc=1488958062 验证码地址

'''

'''

http://www.sogou.com/antispider/?from=%2fweb%3Fquery%3d152512wqe%26ie%3dutf8%26_ast%3d1488957312%26_asf%3dnull%26w%3d01029901%26p%3d40040100%26dp%3d1%26cid%3d%26cid%3d%26sut%3d578%26sst0%3d1488957299160%26lkt%3d3%2C1488957298718%2C1488957298893

访问这个url,然后填写验证码,发送以后就是以下的包内容,可以获取SNUID。

'''

import socket    import re

res=r"id\"\: \"([^\"]*)\""

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(('www.sogou.com',80))

s.send('''

POST http://www.sogou.com/antispider/thank.php HTTP/1.1

Host: www.sogou.com

Content-Length: 223

X-Requested-With: XMLHttpRequest

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

Cookie: CXID=65B8AE6BEE1CE37D4C63855D92AF339C; SUV=006B71D7B781DAE95800816584135075; IPLOC=CN3301; pgv_pvi=3190912000; GOTO=Af12315; ABTEST=8|1488945458|v17; PHPSESSID=f78qomvob1fq1robqkduu7v7p3; SUIR=D0E3BB8E393F794B2B1B02733A162729; SNUID=B182D8EF595C126A7D67E4E359B12C38; sct=2; sst0=958; ld=AXrrGZllll2Ysfa1lllllVA@rLolllllHc4zfyllllYllllljllll5@@@@@@@@@@; browerV=3; osV=1; LSTMV=673%2C447; LCLKINT=6022; ad=6FwTnyllll2g@popQlSGTVA@7VCYx98tLueNukllll9llllljpJ62s@@@@@@@@@@; SUID=EADA81B7516C860A57B28911000DA424; successCount=1|Wed, 08 Mar 2017 07:51:18 GMT; seccodeErrorCount=1|Wed, 08 Mar 2017 07:51:45 GMT

c=6exp2e&r=%252Fweb%253Fquery%253Djs%2B%25E6%25A0%25BC%25E5%25BC%258F%25E5%258C%2596%2526ie%253Dutf8%2526_ast%253D1488957312%2526_asf%253Dnull%2526w%253D01029901%2526p%253D40040100%2526dp%253D1%2526cid%253D%2526cid%253D&v=5

''')

buf=s.recv(1024)

p=re.compile(res)

L=p.findall(buf)    if len(L)>0:

Snuid=L[0]    else:

Snuid=""

return Snuiddef getsnuid(q):

while 1:        if q.qsize()<10:

Snuid=random.choice([Method_one(),Method_three(),phantomjs_getsnuid()])            if Snuid!="":

q.put(Snuid)                print Snuid

time.sleep(0.5)if __name__=="__main__":    import Queue

q=Queue.Queue()

getsnuid(q)

cookie问题解决方案SUID的值获取比较简单,直接访问sogou即可获取。

获取到SUID的值后,再去获取SNUID值(可通过以上几种方式)

获取到SNUID后,可保存到队列中。

说明:SNUID的值如果不去使用它,可以存放很久,直到使用它到上限才会作废;SUID一般不会做次数限制,可以一直使用。

作者:Lateautumn_Lin

链接:https://www.jianshu.com/p/49422e2dd5a3

php 抓取搜狗页面,爬虫解决方案之爬取“搜狗引擎”相关推荐

  1. 利用img请求一个html页面,爬虫学习笔记——爬取单个网页里的所有图片(入门)...

    最近闲着,想学一下爬虫 (^-^)V --[手动比耶]先从简单的练习开始吧~ 爬取单个网页里的所有图片,这个没有什么难点,因为不需要翻页哈哈哈哈. 我很喜欢一些文章中的配图,比如这篇,里面就会有很多电 ...

  2. 爬虫python的爬取步骤-python爬虫实战之爬取京东商城实例教程

    前言 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1. ...

  3. python爬虫爬取教程_python爬虫实战之爬取京东商城实例教程

    前言 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1. ...

  4. python爬虫爬取豆瓣_爬虫,从爬取豆瓣开始

    1 爬虫概述 当初第一次接触python,听的最多的就是爬虫爬虫,搞得我一脸蒙蔽,因为我从来都没听过这么新颖的词,而且我还天真的以为是不是python长得像一条小虫子,所以才叫爬虫. 直到后来经过不断 ...

  5. python 爬取直播_python爬虫,轻快爬取直播平台热度排行

    ''' 需求分析 1.爬取页面 2.获取单个房间的数据 3.从上面数据中提取主播昵称和查看次数 4.格式化数据 5.按查看次数排序数据 6.添加序号 7.打印输出 ''' ''' 理解面向对象的封装思 ...

  6. python爬虫抓取双色球_Python爬虫练习:爬取双色球每期的中奖号码,看能不能中奖...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于CSDN ,作者嗨学编程 确定URL 请求网页 http://www.cwl. ...

  7. 什么是定向爬取技术,Python爬虫的定向爬取技术需解决哪些问题?

    一.什么是爬虫的定向爬取技术 通俗来说,爬虫的定向爬取技术就是根据设置的主题,对要爬取的网址或者网页中的内容进行筛选.比如我们可以使用正则表达式进行筛选等,筛选之后,再爬取对应的网址中的内容,并可以根 ...

  8. python爬取百度百科表格_第一个python爬虫(python3爬取百度百科1000个页面)

    以下内容参考自:http://www.imooc.com/learn/563 一.爬虫简介 爬虫:一段自动抓取互联网信息的程序 爬虫可以从一个url出发,访问其所关联的所有的url.并从每个url指向 ...

  9. python爬虫——使用xpath爬取搜狗微信文章

    缺点:爬取一定数量之后会出现验证码,导致不能继续爬取,需要更换ip才可以继续爬取,或者在浏览器重新输入验证码之后复制cookie后方能继续爬取. import requests from fake_u ...

  10. python抓取文献关键信息,python爬虫——使用selenium爬取知网文献相关信息

    python爬虫--使用selenium爬取知网文献相关信息 写在前面: 本文章限于交流讨论,请不要使用文章的代码去攻击别人的服务器 如侵权联系作者删除 文中的错误已经修改过来了,谢谢各位爬友指出错误 ...

最新文章

  1. springboot+mybatis ,出现多于的参数导致查询数据缺少
  2. 盘点互联网大厂AI战略变迁,开发者将怎样pick前进路线?
  3. UNITY statistic中的 SetPass和Batches
  4. 哪个瞬间你对科研圈彻底失望了?
  5. 基本数据类型和包装类型
  6. 多边形三角剖分问题的综述
  7. 莫烦python博客_《莫烦Python》笔记 -- numpy部分
  8. ~~单调栈(数据结构)
  9. 解决方案:rabbitmq使用场景-超时未支付订单处理
  10. 逻辑回归(logistics regression)
  11. 2019面试宝典之.Net
  12. Zabbix报告无交换内存主机“Lack of free swap space”问题解决
  13. 中介者模式-Mediator Pattern
  14. Mockito开发指南
  15. 可能是最强的Python可视化神器,建议一试
  16. 乐视2 pro2 IMAX手机root权限 刷rece 解锁 刷系统等
  17. ArcGIS Pro中管线三维符号化方法
  18. PhoneGap Cordova 安装白皮书
  19. 关于pip下载很慢很慢
  20. 测试人生 | 从底薪助理4.5k转行到软件测试工程师月薪13k,妹子成功逆袭

热门文章

  1. 如何看懂这些图形学公式
  2. 为何CPU散片这么便宜?盒装CPU值得买吗
  3. 【U盘检测】为了转移压箱底的资料,买了个2T U盘检测仅仅只有47G~
  4. Matching the Blanks: Distributional Similarity for Relation Learning (通篇翻译)
  5. 两步就能使用pyqt制作软件界面,写一个基于you-get的windows端app
  6. Linux——Linux系统编程之基于TFTP实现服务器与开发板间的文件传输实战总结
  7. 典型相关分析及相关知识
  8. Ellisys Bluetooth Sniffer 文档 (EEN-BT09) - 访问链接密钥的方法
  9. 可视化图表告诉你,《人世间》《余生,请多指教》到底爆没爆?
  10. python模拟预测孩子身高_这个公式可以帮你预测你家孩子身高