【自动化】【爬虫】终极方案 = Selenium + brows

2020-02-23 晴 郑州
出场人物
- 沉瓶 - 产品经理
- 饭咸 - 程序员
故事
沉瓶:有个网站,我想根据拿到原始数据,然后自己分析一下,有什么好的方法没有?
饭咸:这个就是传说中的爬虫了,通过网络请求,获取自己想要的数据。python很多库都可以实现这个功能,比如:requests、Scrapy、PySpider、Crawley、selenium等等
沉瓶:爬虫工具竟然这么多,那么网站会不会有反爬虫的方案呢?
饭咸:魔高一尺道高一丈,为了保护自己网站的健康成长,现在出现了很多反爬虫技术,使得爬虫越来越有挑战性。
沉瓶:那有没有比较通用的方案完成爬虫任务呢?
饭咸:肯定有的,记得以前有人通过“机械臂”,模拟人手,进行点击手机屏幕,实现薅羊毛。同样的,网站最终要显示出来,肯定是得让浏览器认识的,如果模拟点击浏览器,分析浏览器的内容,自然也就可以拿到你想要的的数据。
沉瓶:这么说到也还真是,可是模拟点击浏览器,再从浏览器拿数据,听着很复杂呢?
饭咸:不用担心,现在的浏览器霸主,Chrome自己出了一个软件叫chromedriver,可以用来操作chrome,而据此产生的python库也很多,比如selenium就能很好的操作浏览器。
沉瓶:那你帮我看看这个网站的数据怎么拿到呢?
饭咸:好的,盘它。
需求
- 爬取某网站数据
实验环境
下面版本为博主自己的工作环境,您也可使用其它版本进行操作
- python(3.5.2)
- selenium=3.141.0
- browsermob-proxy=0.8.0
- chromedriver(80.0.3987.106)
- browsermob-proxy 2.1.4
实现步骤实现
1. 准备实验环境
1.1 安装python环境
安装python应用,然后切换到python安装路径下的Scripts目录(如:D:\Python\Python352\Scripts),然后安装selenium和browsermob-proxy模块。
cd /d D:\Python\Python352\Scripts
pip install selenium==3.141.0
pip install browsermob-proxy==0.8.0
1.2 安装chromedriver
首先我们需要查看当前chrome版本,如下图所示:

然后下载对应版本的chromedriver: chromedriver(80.0.3987.106)。
最后将下载好的chromedriver.exe放到系统目录下(C:\Windows\System32)即可。这样才能保证我们的程序可以找到chromedriver.exe。
1.3 安装browsermob-proxy
Browsermob-Proxy是一个开源的Java编写的基于LittleProxy的代理服务。Browsermob-Proxy的具体流程有点类似与Flidder或Charles。即开启一个端口并作为一个标准代理存在,当HTTP客户端(浏览器等)设置了这个代理,则可以抓取所有的请求细节并获取返回内容。
直接到项目的github上下载打好的压缩包即可:https://github.com/lightbody/browsermob-proxy/releases ,支持Linux和Windows。
下载解压后,我们可以看到bin目录下的browsermob-proxy.bat文件,如下图所示:

该bat文件用于启动代理服务器,由于里面使用的是JAVA,所以我们需要安装java环境,我这里使用的是1.8.0_73的版本。
2. 编写代码进行爬虫
代码内容格式是固定的,具体分为如下几步:
- 开启Proxy:注意指定自己下载解压后路径。
- 配置Proxy启动WebDriver。
- 获取返回内容。
- 停止代理服务,退出selenium。
from selenium import webdriver
from browsermobproxy import Server
from selenium.webdriver.chrome.options import Options
# 开启Proxy:注意指定自己下载解压后路径
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启动WebDriver
chrome_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("douyin", options={'captureHeaders': True, 'captureContent': True})
driver.get(base_url)
result = proxy.har
for entry in result['log']['entries']:
_url = entry['request']['url']
print(_url)
# 根据URL找到数据接口
if "api/sysapi/p_sysapi" in _url:
_response = entry['response']
_content = _response['content'] # ['text']
# 获取接口返回内容
print(_content)
# 停止代理服务,退出selenium
server.stop()
driver.quit()
3. 踩坑
两个库使用都很简单,模式是固定的,不过一开始我始终未能拿到数据,一直显示数据为空,具体调试信息如下:

我们可以通过设置无痕模式chrome_options.add_argument('--incognito')
处理缓存,但只有第一次有效果。
针对缓存问题,我们可以每次运行程序前,手动清理下缓存(在Chrome浏览器中打开chrome://settings/clearBrowserData页面进行清理)。
如果有好的建议欢迎留言!
参考资料
- selenium+python配置chrome浏览器的选项
- Python3+Selenium 配置Chrome选项
- Selenium爬虫-获取浏览器Network请求和响应
- Selenium 3 + BrowserMobProxy 2.1.4 模拟浏览器访问 (含趟坑)
- HOW TO CLEAR THE CHROME BROWSER CACHE WITH SELENIUM WEBDRIVER/CHROMEDRIVER
声明
本文章仅供用于技术研究用途,请勿利用文章内容操作用于违反法律的事情。
广而告之
欢迎各位关注公众号和QQ群进行技术交流,关注有福利喔。
微信公众号:

qq群:IT技术控/953949723
