今天主要讲讲最近碰到的那个反爬网站,我当时的心情真的是:
让我们来回顾一下我们和这群正在招月薪3w反爬工程师网站的斗智斗勇。。。
事情是这样的,首先我们开了个大创项目,正好老师底下有个学生做毕设是做股权分析的,于是就顺带把我们现在做的这个大创项目就弄的和学长做同一个方向了:目标主要是爬取网站得到所有A股上市公司的股权信息。
当时我们心情是:
组里两个人都写过scrapy的爬虫, 什么大风大浪没见过对吧(开个玩笑)
不过这学长是真坑啊,连着那网站也坑,两坑加一起....
首先学长都没说具体到底要爬哪些公司(一开始都不知道是A股),一看到那网站,我们就懵逼了:
这东西只能搜索然后查找啊, 这..这..这...何从爬起啊?它根本都没提供一个所有公司的展示界面啊???
我们随意搜了搜,看能不能找到全部公司:
哼哼看来人家又不傻....
紧接着看到了这个:
当时就懵逼了...这要是我们真有能力把它所有的公司都抓下来,这个网站不就倒闭了...还搞个啥会员服务呢??!!
果不其然,一位同学搜了搜招聘网站:
当时心里头万头草泥马奔涌而过啊...这我们拿着5000块钱的资金,去跟一个企业一群月薪3W 的反爬工程师做斗争呢?这还玩毛啊...还拖人家数据库,到时候会不会人家把你举报了都不知道,算了算了,当时想着学长这毕设估计要 gg了...
但是没办法,该爬还得爬,怎么爬呢?我们准备细心观察每个企业的url结构:
结果是:
根本没有任何规律
百度的url:http://www.tianyancha.com/company/22822
但是 http://www.tianyancha.com/company/22823 就没有任何企业是这个url。
说明一堆堆的企业好像被随机分派在了0-100000000000(11个0)的范围内..
胖哥一声令下:这还不简单,遍历下就好了(单纯的我们大概根本没有这个概念:想把一个几百十号人靠这个吃饭的数据库拖下来哪能是我们三个单纯的大三生能干的。。)
看了下网站结构,得开启selenium+phantomjs神器,于是,就开始愉快地爬取啦!!
爬取的是很愉快,但是速度感人呀:
算了算,如果碰到url找不到企业,大概是1秒1个,如果url找得到企业,抓取信息下来大概是5秒一个,机智的我按了下计算器:
100000000000/3600/24/365 = 3000左右
卧槽,我们在一切顺利的情况下只需要爬3000年就可以爬完哦!!!!3000年爬完哦!!!爬!!完!!哦!!!
哇说不定我们开多个进程,再搞个分布式可以缩短到100年呢,真是美滋滋...
而且“高兴”到一半,突然爬虫GG了。。。
出现了图片拖动验证码...
爬了十几个,就出现了图片?验证?码?
机智的胖哥立马搜了搜相关方案:大致解决方法是模拟鼠标去把那个图片拖动到合适位置(一句话就讲完了看起来很简单的样子)然后看了看那几百行的代码我们决定:!放弃!...
于是我们决定利用ip池来进行爬取:随便google了一下就找到了几百个免费的代理ip,方便的很.发现换了ip之后,终于可以跳过验证码的验证界面了...松了一口气,也就在这时,学长跟我们说,不用爬全部啊,主需要爬A股,让我们的信心都为之一振!!
说做就做,于是我们又开始嗖嗖嗖地爬取:首先在网上得到A股名单,然后在天眼查搜索企业,然后点击进去进入该公司网站,然后开始爬取!!
一切很顺利,直到............
我们发现,爬下来,确实是没什么问题,但是....这数据特么是个假的!!!假...的....假...的....
如下是爬到假数据的代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
dcap = dict(DesiredCapabilities.PHANTOMJS) # 设置userAgent
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0")
obj = webdriver.PhantomJS(executable_path=r"/home/jack/Downloads/App/phantomjs-2.1.1-linux-x86_64/bin/phantomjs", desired_capabilities=dcap)
obj.get('http://www.tianyancha.com/company/22822')
time.sleep(3)
print obj.page_source
来我们来看看原网站:
来我们来看看我们爬到了些啥:
工商注册号:440104113453756(这特么什么鬼)
行业:消防(我要砸桌子了)
....
以下不列举了...
我当时只想:
这还玩个蛇皮...
大家开始到网上搜寻解决方案, 我也赶紧问了问最近在知乎上捉到的@waking_up 一个自称小白的大神, 结果三个人都无果而终....好像剩下的方法就只能试试抓包?
终于学长在此时没坑,给出了一波给你的助攻:换浏览器ua:
果然,在换取浏览器ua之后,千辛万苦我们终于可以爬到了真实数据!!
简直要喜极而泣..
然而...
我们发现,当我们直接访问例如:http://www.tianyancha.com/company/22822 网站时, 给的是真实的数据.然而,当我们为了批量化处理, 是这样的处理的:首先从网上获取所有A股名单, 比如我们找到了百度, 然后我们在主页利用webdriver模仿用户行为:
搜索百度:
然后模仿用户行为,点击第一个链接:
之后,我们又GET了假数据!!!假!!数!!据!!!
此时内心是崩溃的....
好气啊,想砸桌子...
此时又发现消息: 学长给的A股信息是假的,假的还不说了,一些简称在天眼查底下根本搜不到(比如"ST东北高")...
意思是即便我们用了合适的ua头,但是只要利用phantomjs模仿用户行为,比如点击什么的,就会被侦测到!
无可奈何....
没办法本来也只是想把爬虫作为工具,并不是什么以后想要专门搞这个的,WEB基础也不够,就没打算深究机理了....(也深刻感觉到了时间有限, 应该把时间放在自己的那个方向上,其他只是作为工具而已,能利用就利用)
于是我重新google了下企业A股名单,然后发现虽然可能有些简称搜不到,但是企业的编号是可以搜到的.在天眼查里搜编号就好了..
然后我们换用了移动端的表头:
惊喜地发现(终于这一次是惊喜了):移动端没有任何反爬措施,连验证码都没有!!!
所以也提个醒吧,如果发现WEB太难啃的话,直接把ua头换移动端就好了..
好了这是倒今天为止的进度,具体项目完工后会写一篇正式的稿子的,这里只是记录一下辛酸史= =真是心累啊.....不过也很佩服, 反爬与反反爬的过程还是很有趣的,仿佛是在斗智斗勇2333