作为一名爬虫界的农名工,一直都是熟练使用scrapy,永久了之后觉得效率颇高,也爬过大大小小的几十个网站了。以前见过很多不同的反爬虫机制:
1)robot.txt禁止爬虫,这种是最好突破的了;
2) 需要添加header的, 才能得到争取的response的; 也算是常规网站都有的;
3) 需要使用cookie的, 这部分需要登录的网站中比较常用, 这部分算少一些了;
4) 登录的时候要求使用验证码的, 还需要调用ocr接口识别验证码信息的, 之前爬取amazon就需要如此;
5) 最后一个就是类似于boss直聘这种网站了,需要拖动滑块来获得验证,然后再登录,之前研究了一会,以失败告终,未做进一步研究;
就在这两天,我碰到一个网站lighting1.com,受搞外贸的朋友委托,帮忙爬取下客户信息。作为一名熟练的爬虫农民工,第一次登录lighting1.com的时候,觉得没什么难度。马上开搞,第一次请求完
淡定淡定,添加了user agent,再来
淡定淡定, 添加了header和cookie, 再来
what the fuck!!!
在心里奔腾过几万只草泥马之后,作为资深农民工的我还是冷静了下来,一定要心平气和,爬不了没关系,要文明。于是乎,我请求浏览器缓存,再一次打开了这个网站,看到了一个神奇的事情:
Checking your browser before accessing lighting1.com. This process is automatic. Your browser will redirect to your requested content shortly, please allow up to 5 seconds...意思是现在在检查浏览器,你的请求在5s之后才会返回,这也就解释了为什么刚才每一次都是503了,浏览器还没有返回正确的response, 而程序因为收到503就自动结束了。而且,打开详细的公司信息的时候,也是会有这样子的问题,都要有检查浏览器的过程。
思考的时候,脑海里浮现出印象中有一个叫做webdriver可以真正完美的模拟浏览器的运行, 于是, 我就上手了。
环境: win10 x64
python: 3.8.1
工具: pycharm
因为我习惯用的是Google Chrome, 所以下载安装chromedriver.exe
第一步, 当然是启动浏览器了:
第二步, 获取与分析网页:
默认使用get方法, 不用像在scrapy里面, 需要添加各种header, cookies这些。需要添加time.sleep(5)是为了解决刚才浏览器进入网站是检查5s在返回数据的问题. 再返回数据之后, 我们需要提取当中每一个公司的详情页面的链接。作为一名长期使用scrapy的农民工,我习惯使用xpath, 于是就通过find_elements_by_xpath()来提取链接,并把链接保存到list里面.
当抓取到第3页的时候,就开始提示要登录了,要是以前使用scrapy必须先处理登录的请求,然后才能继续往下抓取。使用selenium发现浏览器自动的往下走,丝毫不管需不需要登录,都能正确获取链接,真香。
第三步,请求公司详情页,并保存返回数据
第四步, 保存数据,作为一名懒人,直接使用最简单的办法来保存:
自此大功告成。
第一次使用selenium, 发现真是一个神器,除了效率低,其他方面真的是无可挑剔。特别是在应对服务端和客户端的一些验证上面,流氓得不要不要的。接下去的爱好就是挖掘selenium的其他潜力。