2020-02-23清郑州人物神平-产品经理范闲-程序员故事神平:有一个网站,我想根据它获取原始数据,然后分析它自己,有什么好办法吗?范闲:这就是传说中的爬虫,通过网络请求获取自己想要的数据。很多python库都可以实现这个功能,比如:requests、Scrapy、PySpider、Crawley、selenium等。神博:爬虫工具那么多,那么网站会不会有反爬虫的方案呢?范闲:魔高一丈,道高一丈。为了保护我们网站的健康成长,出现了很多反爬虫技术,使得爬虫越来越具有挑战性。沉平:有没有更通用的方案来完成爬虫任务?范闲:一定有。记得以前有人用“机械臂”模拟人手,点击手机屏幕实现毛线。同样,如果网站最终显示出来,也必须被浏览器识别。如果你模拟点击浏览器,分析浏览器的内容,自然可以得到你想要的数据。沉平:是的,但是模拟点击浏览器,从浏览器获取数据听起来很复杂?范闲:不用担心,现在的浏览器霸主,chrome已经发布了一个叫chromedriver的软件,可以用来操作chrome,还有很多基于它的python库,比如selenium,可以很好的操作浏览器.沈平:那你帮我看看这个网站的数据怎么获取?范闲:好的,上菜吧。需要从某网站爬取数据实验环境以下版本是博主自己的工作环境,也可以使用其他版本来操作代理2.1.4实现步骤实现1.准备实验环境1.1安装python环境安装python应用,然后切换到python安装路径下的Scripts目录(如:D:PythonPython352Scripts),然后安装selenium和browsermob-proxy模块。cd/dD:\Python\Python352\Scriptspipinstallselenium==3.141.0pipinstallbrowsermob-proxy==0.8.01.2安装chromedriver首先我们要查看当前的chrome版本,如下图:然后下载对应的chromedriver版本:chromedriver(80.0.3987.106)。最后将下载好的chromedriver.exe放到系统目录下(C:WindowsSystem32)。只有这样才能保证我们的程序能够找到chromedriver.exe。1.3安装browsermob-proxyBrowsermob-Proxy是一个基于LittleProxy的开源Java代理服务。Browsermob-Proxy的具体流程有点类似于Flidder或者Charles。即开一个端口,作为标准代理存在。当HTTP客户端(浏览器等)设置此代理时,它可以抓取所有请求详细信息并获取返回内容。去项目的github下载压缩包即可:https://github.com/lightbody/...,支持Linux和Windows。下载解压后,我们可以在bin目录下看到browsermob-proxy.bat文件,如下图所示:这个bat文件是用来启动代理服务器的。由于里面用到了JAVA,所以我们需要安装java环境。我这里使用的版本是1.8.0_73。2.编写爬虫代码。爬虫代码的内容格式是固定的,分为以下几个步骤:打开代理:下载解压后注意指定路径。配置Proxy以启动WebDriver。获取返回的内容。停止代理服务并退出selenium。fromseleniumimportwebdriverfrombrowsermobproxyimportServerfromselenium.webdriver.chrome.optionsimportOptions#打开代理:注意自己下载解压后指定路径server=Server(r'C:\Users\Administrator\Downloads\browsermob-proxy-2.1.4-bin\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')server.start()proxy=server.create_proxy()#配置Proxy启动WebDriverchrome_options=Options()chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))chrome_options.add_argument('--incognito')driver=webdriver.Chrome(chrome_options=chrome_options)#获取返回内容base_url="http://webapi.cninfo.com.cn/#/marketDataDate"proxy.new_har("抖音",options={'captureHeaders':True,'captureContent':True})driver.get(base_url)result=proxy.harforentryinresult['log']['entries']:_url=entry['request']['url']print(_url)#根据url查找数据接口if"api/sysapi/p_sysapi"in_url:_response=条目['响应onse']_content=_response['content']#['text']#获取接口返回内容Allowprint(_content)#停止代理服务,退出seleniumserver.stop()driver.quit()3.两个库都很好用,mode也固定了,但是我一开始还是获取不到数据。显示数据为空,具体调试信息如下:我们可以通过设置隐身模式chrome_options.add_argument('--incognito')来处理缓存,但是只在第一次有效。对于缓存问题,我们可以每次手动运行程序清除缓存(在Chrome浏览器中打开chrome://settings/clearBrowserData页面进行清理)。如果您有好的建议,欢迎留言!参考资料selenium+python配置chrome浏览器选项Python3+Selenium配置Chrome选项Selenium爬虫-获取浏览器网络请求与响应Selenium3+BrowserMobProxy2.1.4模拟浏览器访问(含绊坑)HOWTOCLEARTHECHROMEBROWSERCACHEWITHSELENIUMWEBDRIVER/CHROMEDRIVERdeclaresthat本文仅供技术研究之用,请勿利用文章内容进行违法操作。作者简介欢迎大家关注公众号和QQ群进行技术交流,关注有福利。微信公众号:qq群:IT技控/953949723本文由多帖博客平台OpenWrite发布!
