【自动化】【爬虫】终极方案_Selenium_browsermob-proxy

逐梦中原

2020-02-23 晴 郑州

出场人物

  • 沉瓶 - 产品经理
  • 饭咸 - 程序员

故事

沉瓶:有个网站,我想根据拿到原始数据,然后自己分析一下,有什么好的方法没有?
饭咸:这个就是传说中的爬虫了,通过网络请求,获取自己想要的数据。python很多库都可以实现这个功能,比如:requests、Scrapy、PySpider、Crawley、selenium等等
沉瓶:爬虫工具竟然这么多,那么网站会不会有反爬虫的方案呢?
饭咸:魔高一尺道高一丈,为了保护自己网站的健康成长,现在出现了很多反爬虫技术,使得爬虫越来越有挑战性。
沉瓶:那有没有比较通用的方案完成爬虫任务呢?
饭咸:肯定有的,记得以前有人通过“机械臂”,模拟人手,进行点击手机屏幕,实现薅羊毛。同样的,网站最终要显示出来,肯定是得让浏览器认识的,如果模拟点击浏览器,分析浏览器的内容,自然也就可以拿到你想要的的数据。
沉瓶:这么说到也还真是,可是模拟点击浏览器,再从浏览器拿数据,听着很复杂呢?
饭咸:不用担心,现在的浏览器霸主,Chrome自己出了一个软件叫chromedriver,可以用来操作chrome,而据此产生的python库也很多,比如selenium就能很好的操作浏览器。
沉瓶:那你帮我看看这个网站的数据怎么拿到呢?
饭咸:好的,盘它。

需求

  • 爬取某网站数据

实验环境

下面版本为博主自己的工作环境,您也可使用其它版本进行操作

实现步骤实现

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页面进行清理)。

如果有好的建议欢迎留言!

参考资料

声明

本文章仅供用于技术研究用途,请勿利用文章内容操作用于违反法律的事情。

关于作者

欢迎各位关注公众号和QQ群进行技术交流,关注有福利喔。

微信公众号:

微信公众号

qq群:IT技术控/953949723

逐梦中原技术交流QQ群

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值