暑假实习的时候,老板让收集北上广深公司的联系方式,最好是email或者手机。鉴于老板不想花钱,就拜托本菜鸟写爬虫,去爬取各色B2B网站企业信息。
现在的时代,数据就是金钱,各大网站是不可能让你轻而易举爬走数据滴,即使这些数据都是开源的。常见的反爬手段包括禁止频繁访问,将手机号码转换成图片显示。有些丧心病狂的网站,反爬工程师每月拿2万大洋,让萌新瑟瑟发抖。
顺企网是个比较有意思的网站(截图如下)(从爬虫角度来说),且听我细细道来。
1) 解决频繁访问
博主尝试过每发送一次请求,休息2秒,然而在300-400个请求后被拒绝,爬虫光荣阵亡。出离愤怒的博主,将出错的url通过浏览器访问,返回以下界面。
手动点击“点击继续”这个超链接后,即可跳转到需要的公司信息界面,正常访问(发送请求)。
由于要获取的企业数量在万级,必须要解决这个因频繁访问被验证非机器人的问题。
最直接的思路就是如何让python模拟浏览器点击“点击继续”并跳转?
于是博主右键查看源代码,如下
可能您访问的有点快了,请... <a href="#"οnclick="window.location='/php/banip.php?sid=a57f9e4c0ea4f82548581612573b0e61'">点击继续</a>做了个简单尝试,将php及后面一串字符串粘贴至“http://www.11467.com/”(顺企网主页url)后面,刷新后浏览器显示跳转界面,如下:
这时,再将方才请求的公司url粘贴至地址栏,即可得到正确展示公司信息的页面。
于是乎,用python脚本实现,得到以下代码:
except: #请求过于频繁,无法得到企业正常信息页 print "Crawler detected!" print url newPage = requests.get(r'http://www.11467.com/php/banip.php?sid=a57f9e4c0ea4f82548581612573b0e61') #sid因session而异 print "\n" return
2) 解决图片式手机号码
B2B网站为防止商家联系方式(特别是手机号码)被大量爬取,将手机号码以图片形式显示。最直观的解决方法就是获取图片来源的url,下载至本地,再用python中图片识别的模块去转换成数字。
博主尝试过pytesseract(tesseract的python API),并将输出设置为仅数字,然而识别效果依然差强人意。博主心一横,差点走上了自己做training data的不归路。突然,博主发现这些图片的url与图片中的手机号码十分相似!
譬如手机号为13636447122的图片url为http://simg.11467.com/phone/3133363336343437313232.jpg,手机号中的每个数字在url的数字段都出现过,而且是间隔着一个“3”。看穿之后,事情就好办很多了。通过下面一段代码就可以提取手机号了,妈妈再也不用担心图片识别准确率底下了!因为根本就不用下载并识别图片了。
codeMobile = re.findall('([0-9]+).jpg',mobpicA)[0] #正则表达式获取图片来源url的数字部分,mobpicA为图片url mobile = '' for i in range(11): mobile += codeMobile[2*i + 1]
完全脚本GitHub链接:https://github.com/chengnn119/contactCrawlers
文件名:Shunqi_SH.py, Shunqi_SH_pages.py