打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Selenium Browsermob

写在前面

  • 尝试使用Selenium和Browsermob-Proxy把network里面的数据扒下来。个人觉得这样扒数据又全又清晰,遂写下本文记录扒拉勾网数据时的踩坑过程。还用于个人回顾或给正在坑里的朋友提供一丢丢一丢丢的帮助。

Selenium

  • 安装驱动,建议把驱动放在python.exe同级目录下,使用时可以不用写驱动地址
  • 驱动要与自己的chrome浏览器版本相适应
  • Chrome Selenium驱动下载

Browsermob-Proxy

# 暂停程序运行
import time
# 后面扒下来的数据是字符串里面包着字典,毫无可读性,可以通过json字符串和python字典的相互转换来提高可读性
import json
from browsermobproxy import Server
from selenium import webdriver
# 配置代理用
from selenium.webdriver.chrome.options import Option
开启代理
BMPserver = Server(r'D:\Apython\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
BMPserver.start()
BMPproxy = BMPserver.create_proxy()
配置代理并启动WebDriver
  • add_argument参数整理
  • 喜欢博主底下的那句话
    • 今天太阳也东升,而后西沉,早晨盛开的花儿也将凋谢;今天的太阳也西沉,而后东升,阳光照射之处遍地花开,但却已非昨日之花
chrome_options = Options()
# 禁用扩展插件,因为我也不是太懂,总之没了这句,浏览器会报警提示如下图。魔法,勿动。
chrome_options.add_argument('--ignore-certificate-errors')
# BMPproxy.proxy返回的是localhost:8081端口
chrome_options.add_argument('--proxy-server={}'.format(BMPproxy.proxy))
# 如果Selenium驱动放在了python.exe同级目录下,executable_path参数可以省略
brosver = webdriver.Chrome(executable_path='D:\Apython\chromedriver.exe',options=chrome_options)

获取返回内容,har好像有专门的har reader软件
  • HTTP存档格式(HTTP Archive format)
  • 是一种JSON格式的存档文件格式,用于记录网页浏览器与网站的交互过程
  • 既然是json格式我们后面就直接使用json包打印出来
url = 'https://m.lagou.com/search.html'
# 个人理解是new一个空的har准备接收爬取网站的交互信息
BMPproxy.new_har('lagou',options={'captureContent': True,'captureContent': True})
使用Selenium模拟浏览器操作
  • 先模拟浏览器操作到想要爬取数据的页面
  • 然后再通过代理将har扒下来
  • 这里只爬取刚搜索“数据分析”后网页返回的十五条招聘信息
  • 想要爬取很多招聘信息可以模拟浏览器循环点击加载更多
  • 具体操作可参考我的另一篇博客用Selenium爬取拉勾网招聘信息
# 模拟浏览器
brosver.get(url)
# 搜索classname为inputer的Element对象
searchBox = brosver.find_element_by_class_name('inputer')
# 查找搜索按钮
button = brosver.find_element_by_class_name('search')
# 向搜索文本框送入关键字(工作名称)
searchBox.send_keys('数据分析')
# 点击搜索按钮
button.click()
time.sleep(3)
获取har
  • 将har写入json文件
  • 在pycharm中打开json文件点击加减的小图标可以展开合并操作
  • 先将数据合并起来查看大体结构,如下图
result = BMPproxy.har
result_json = json.dumps(result,indent=4)
with open('lagoujob.json','w',errors='igone') as f:
    f.write(result_json)

筛选数据
  • 使用 ctrl+f 查找关键字功能
  • 我这里用url筛选接口,定位到我想要的信息在第2121行,将那个合并的字典展开如下图
  • 简单查看一下可以发现我们要的十五条招聘信息全在text中
  • josn数据中文是十六进制的编码,这没关系,转成python字典会自动解码为汉字
    for entry in result['log']['entries']:
        entry_url = entry['request']['url']
        # 根据URL找到数据接口
        if 'city=%E5%85%A8%E5%9B%BD&positionName=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90' in entry_url:
            # 获取接口返回内容
            _response = entry['response']
            _content = _response['content']['text']
            # 返回的均是json字符串,为了提高可读性,先将数据转换成python字典,再转成json数据
            content_dict = json.loads(_content)
            content_json = json.dumps(content_dict,indent=4)
        else:
            continue
    print(content_json)

结尾

  • 数据全在result列表里面
  • result里面有十五个字典数据,招聘信息以键值对呈现
  • 可自行提取
  • 下面是我写的一个简单的转换,可以将十六进制的代码复制进去打印出来便于查看
import json
# 注意是json数据字符串,注意单双引号
html_json = '{'code': '\u884c\u52a8\u4ee3\u53f7\uff1a\u5929\u738b\u76d6\u5730\u864e'}'
html_dict = json.loads(html_json)
print(html_dict)
{'code': '行动代号:天王盖地虎'}
下面是全部的源代码
  • 有调试的注释语句可自行调整
import time
import json
from browsermobproxy import Server
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


def main():
    # 开启代理
    BMPserver = Server(r'D:\Apython\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
    BMPserver.start()
    BMPproxy = BMPserver.create_proxy()

    # 配置代理启动webdriver
    chrome_options = Options()
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_argument('--proxy-server={}'.format(BMPproxy.proxy))
    brosver = webdriver.Chrome(executable_path='D:\Apython\chromedriver.exe',options=chrome_options)

    # 获取返回内容
    url = 'https://m.lagou.com/search.html'
    BMPproxy.new_har('lagou',options={'captureContent': True,'captureContent': True})

    # 模拟浏览器
    brosver.get(url)
    # 搜索classname为inputer的Element对象
    searchBox = brosver.find_element_by_class_name('inputer')
    # 查找搜索按钮
    button = brosver.find_element_by_class_name('search')
    # 向搜索文本框送入关键字
    searchBox.send_keys('数据分析')
    # 点击搜索按钮
    button.click()
    time.sleep(3)

    result = BMPproxy.har
    # result_json = json.dumps(result,indent=4)
    # with open('lagoujob.json','w',errors='igone') as f:
    #     f.write(result_json)
    for entry in result['log']['entries']:
        entry_url = entry['request']['url']
        # 根据URL找到数据接口
        if 'city=%E5%85%A8%E5%9B%BD&positionName=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90' in entry_url:
            # 获取接口返回内容
            _response = entry['response']
            _content = _response['content']['text']
            # 返回的均是字符串包着字典,为了提高可读性,先将数据转换成python字典,再转成json数据
            content_dict = json.loads(_content)
            content_json = json.dumps(content_dict,indent=4)
        else:
            continue
    print(content_json)

main()
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Selenium爬虫
Selenium抓取HTTPS请求
Selenium爬虫登录生成Cookie
Python爬虫IP代理教程,让你不再为IP被封禁发愁!
WebDriver入门知识点
Python使用浏览器模拟访问页面之使用ip代理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服