继续上一个爬虫,所以说selenium加browsermobproxy

这篇具有很好参考价值的文章主要介绍了继续上一个爬虫,所以说selenium加browsermobproxy。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

继续,书接上回,这次我通过jsrpc,也学会了不少逆向的知识,感觉对于一般的网站应该都能应付了。当然我说的是简单的网站,遇到那些混淆的,还有那种猿人学里面的题目,还是免谈了。那种需要的水平太高,我学习爬虫的目的也不是找什么工作,只是为了找数据,能够满足我找数据的需要就好。

现在我的初步问题已经解决了,原以为可以使用jsrpc一路搜集数据。可是还是遇到了新的问题。

接下来我想搜集这个网站的志愿服务项目的数据。发现这个网站的请求类型也比较复杂,要抓到某一个项目的数据,需要多次点击,定位到那个项目,而且进入项目的新页面,好像jsrpc获得的参数也是没什么用的了。

不知道为什么。可以先看一下。

继续上一个爬虫,所以说selenium加browsermobproxy,selenium,测试工具,爬虫

这时,我知道这个query应该是也带bean参数。

 那么再次截获它的i值,就可以使用rpc,获得bean参数吧,想着时这样的。

继续上一个爬虫,所以说selenium加browsermobproxy,selenium,测试工具,爬虫

这个query,地址是:/webapi/listProjectsFortisWeb/query

那么我们就找这个请求时的i

继续上一个爬虫,所以说selenium加browsermobproxy,selenium,测试工具,爬虫

 i值有了,可以直接请求了吧。但是结果令人失望

继续上一个爬虫,所以说selenium加browsermobproxy,selenium,测试工具,爬虫

得到的结果一直是固定的那么几个东西。即使换了i,换了参数,也会得到同样的结果。我也不太明白为什么。可能是网站需要经过几次鼠标点击,在点击的过程中,请求变了,我使用python请求,并没有抓到他那个真实的请求。

过程太复杂,我想我也研究不出来,比不了那些搞网站的。所以眼看又进入了困境。

这时候,想到了selenim。虽然一直以来都觉得selenium慢的要死。但是没办法啊,我会的,能够用的都用的差不多了,不会的也学了,学的也快吐了。不想再继续搞下去了,想着selenium慢就慢吧,好歹也是个办法。

环境配置

先安装 

pip install browsermob-proxy

pip install selenium

然后需要根据自己的浏览器版本,下载相应的webdriver

我的是chrome116,需要chrome116的webdriver。

直接从官网下。下好之后放到虚拟环境里。

另外还需要 browsermobproxy的环境,也是直接百度搜,下载下来。

browsermobproxy的使用

说干就干, 但是还有一个问题,就是我怎么能让senenium返回给我一个json,也就是一个动态网站返回给我的东西,我怎么截取这个json。selenium一旦渲染出来,就是一个网页元素了。怎么抓取到服务器发给我的json呢。

这时候看到知乎上一个帖子介绍了browsermobproxy。感觉可以用,就试了一下。

确实可以。简单来说,这个库就是相当于一个python版的fiddler,只不过fiddler是集成在一个软件里面,python调用不方便。但是这个库直接安装到python里面就可以了。简单

直接pip install就可以。

然后我也放弃了使用rpc方法,直接使用python模拟鼠标点击。

继续上一个爬虫,所以说selenium加browsermobproxy,selenium,测试工具,爬虫

 简单粗暴。就是慢点。

直接上代码,

import json
from selenium.webdriver.common.keys import Keys
import numpy as np
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from browsermobproxy import Server
from selenium.webdriver.chrome.options import Options
import os
import requests
import time

js="var q=document.documentElement.scrollTop=10000"

# 开启proxy
def start_proxy(har_name):
    server = Server(r'E:\code\codeForArticle2023\sdzyfw2\sdzyfw2.0\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
    server.start()
    proxy = server.create_proxy()
    print(proxy.proxy)
    proxy.new_har(har_name, options={"captureHeaders": True, "captureContent":True})
    return  proxy

# 打开driver
def start_driver(proxy):
    chrome_options = Options()
    chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))
    chrome_options.add_argument('--ignore-certificate-errors')
    chrome_options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"])

    driver = webdriver.Chrome(executable_path=r'venv/Scripts/chromedriver-win64/chromedriver.exe', options=chrome_options)
    driver.get("http://sd.chinavolunteer.mca.gov.cn/subsite/shandong/project")
    return driver


# 进入页面
def fetch_yantai(driver):
    ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="烟台市"]')), u'没有发现内容')
    if ele:
        item = driver.find_element_by_xpath("//div//a[text()='烟台市']")
        item.click()

    ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="芝罘区"]')), u'没有发现内容')
    if ele:
        item2 = driver.find_element_by_xpath("//a[text()='芝罘区']")
        item2.click()

    ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="已结项"]')), u'没有发现内容')
    if ele:
        item3 = driver.find_element_by_xpath("//a[text()='已结项']")
        item3.click()

def switch_to_proj_list_page(projList_pageNum):
    pn = int(projList_pageNum)
    print(pn)
    element = driver.find_element_by_css_selector(".pages input")
    element.send_keys(Keys.CONTROL + "a")
    element.send_keys(Keys.DELETE)
    time.sleep(2)
    element.send_keys(f"{pn}")
    time.sleep(2)
    driver.find_element_by_xpath("//a[text()='跳转']").click()


# 获取项目并且点击 num是第几个项目
def get_proj(driver, num):

    ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.CSS_SELECTOR, u'div.panel-card')), u'没有发现内容')
    if ele:
        panels = driver.find_elements_by_css_selector(".panel-card")
        p1 = panels[num]
        print(len(panels))

    link = p1.find_element_by_css_selector('h2')
    link.click()

    win_hans = driver.window_handles
    driver.switch_to.window(win_hans[-1])

#采集信息

# 进入时长公示 页面,返回 page_num
def go_to_time(driver):
    # 获取项目了之后,需要进入新的一页,进入项目的详情页。
    page_num = 0
    ele =  WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, "//span[text()='时长公示']")), u'没有发现内容')
    # 如果出现时长公示了,那么就可以点击时长公示,让网站显示时长。
    # 接下来要判断的是,是否有时长公示
    if ele:
        shijian  = driver.find_element_by_xpath("//span[text()='时长公示']")
        shijian.click()
    pages = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".pages")), u"没有时长页面")
    print(pages)
    if pages:
        recordsNum = driver.find_element_by_css_selector(".pages span:last-child").text
        print(recordsNum)
        rn = re.search(r'共(\d+)条', recordsNum).group(1)
        rn = int(rn)
        page_num = int(np.ceil(rn/8))
    print(page_num)

    return page_num

def click_pages(driver, page_num):
    if page_num == 0:
        pass
    # 若只有一页,那么不需要操作了,直接退出
    if page_num == 1:
        pass
        # 若超过2页,那么需要不断点击下一页,点击下一页需要等待,这里使用显示等待
    if page_num >= 2:

        for i in range(2, page_num+1):
            time.sleep(3)
            ele = WebDriverWait(driver, 10, 0.2).until(
                EC.visibility_of_element_located((By.XPATH, "//a[text()='下一页']")), u'没有发现内容')
            if ele:
                next_page = driver.find_element_by_xpath("//a[text()='下一页']")
                next_page.click()

                WebDriverWait(driver, 10, 0.2).until(
                    EC.visibility_of_element_located((By.XPATH, "//a[text()='下一页']")), u'没有发现内容')

# 返回结果
def get_resp(driver, proxy):
    result = proxy.har
    timefortisProj =[]
    postfortisProj = []
    inforfortisProj = []
    for rs in result['log']['entries']:
        if   "webapi/timeFortisWeb/query" in rs['request']['url']:  # 时长记录
            # 时长请求 url
            print(rs['request']['url'])
            timefortisProj.append(rs['response']['content']['text'])

        if 'getProjectInfoFortisWeb' in rs['request']['url']:  # 发起人信息
            print(rs['request']['url'])
            inforfortisProj.append(rs['response']['content']['text'])

        if 'ProjectPostFortisWeb/query' in rs['request']['url']:  # 任务信息
            print(rs['request']['url'])
            postfortisProj.append(rs['response']['content']['text'])

    dt = {
        "time":timefortisProj,
        "post":postfortisProj,
        "info":inforfortisProj
    }
    return dt



def save_file(result, qu, har_name):
    with open(f"sdzyfw2/sdzyfw2.0/{qu}/{har_name}.json",'w', encoding='utf-8') as f:
        f.write(json.dumps(result, ensure_ascii=False))
    print("success!!!")



#---------------------------------------------------------#
#----           *         *        ----#
#---------------------------------------------------------#

projList_pageNum = "002"
num = 3
proj_num =  str(num)
har_name = "proj_" + projList_pageNum + "_"+ proj_num
print(har_name)
#建立一个 mobproxy代理,返回端口号
proxy = start_proxy(har_name)
#通过selenium打开目标网站,
driver = start_driver(proxy)

fetch_yantai(driver)
driver.execute_script(js)

if projList_pageNum != "001":
    switch_to_proj_list_page(projList_pageNum)


get_proj(driver, num)

driver.execute_script(js)

# 返回一个页码
try:
    page_num = go_to_time(driver)
except:
    page_num = 0

driver.execute_script(js)

# 根据页码翻页
if page_num is None:
    pass
else:
    try:
        click_pages(driver, page_num)
    except:
        pass


result = get_resp(driver, proxy)

qu = "zhifuqu"
save_file(result, qu, har_name)




 上面的翻页部分的逻辑还没整清楚,会出现bug,暂时先放上。回头把翻页部分整理好了再修改吧。大致思想基本没啥问题。

代码也没怎么整理,大致的意思就是使用selenium呼出浏览器,然后在浏览器里面一步步找到我想要的东西,最后把这些所有的包存放到一个har里面。后期在筛选har,提取我想要的信息。

发现这个也是很无敌的,直接免去了反反爬措施。因为就是浏览器,除非网站对webdriver有检测,不然也没办法。就老老实实的一个一个爬吧。

这个过程,看上去不复杂,其实挺麻烦,要一个个执行。估计要有几千个,想了想,还是找别人帮忙吧。其实就是学习了以下mobproxy。真要这么做的话,还是挺麻烦。最好是逆向到参数,直接提取。不推荐这种方式,当然,如果没办法,那么这个真的是终极大招了。文章来源地址https://www.toymoban.com/news/detail-738871.html

到了这里,关于继续上一个爬虫,所以说selenium加browsermobproxy的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python爬虫selenium页面滑动案例,作为一个Python程序员你还不会JetPack

    def up_page(self): time.sleep(1) self.driver.find_element(By.XPATH,‘//*[text()=“下一页”]’).click() def save_page(self, n=1): time.sleep(2) with open(f’第{n}页.html’, ‘w’, encoding=‘utf-8’) as f: f.write(self.driver.page_source) def run(self): try: self.save_page() # 第一页 for n in range(2, 6): # 第二三四五页 self.scroll() s

    2024年04月22日
    浏览(50)
  • python如何批量读取一个文件夹里的所以excel文件

    在数据分析工作中,尝尝需要处理多个不同月的excel文件,但无奈与excel文件的局限性,不能同时处理多个月的excel数据,所以python的批量读取excel文件就显得十分重要,下面我将展示如何用python将每个月度的excel数据进行读取并汇总处理和输出。 最好excel的文件名就是按照日期

    2024年02月16日
    浏览(63)
  • 阿里云盘太小啦,所以自己动手写了一个阿里云盘的搜索引擎

    是不是还在为阿里云盘空间太小而烦恼! 好东西太多,奈何就这么点空间,存不下所有东西,何解? 阿里云盘空间不足的问题也让我头疼,虽然有一些免费的阿里云盘的搜索引擎,但那不是我的! 终于决定了,自己编写一个阿里云盘搜索引擎服务! 先看一下成品图: 如果

    2024年02月13日
    浏览(60)
  • 自动化测试工具-Selenium:Selenium的核心三大组件详解

    目录 1. WebDriver 1.1 WebDriver的通信方式 1.2 WebDriver的功能 1.3 W3C推荐标准 2. Grid 3. IDE Selenium 是支持 web 浏览器自动化的一系列工具和库的综合项目。官方对Selenium认可的三大组件或API分别是: WebDriver、Selenium IDE、Grid。 其中,WebDriver又被称为Selenium的核心。 下面本篇文章将深度介

    2024年02月03日
    浏览(46)
  • selenium之显示等待(等到某个元素出现后再继续执行)

    本文章还请认真仔细阅读,非常简单,阅读前,你可能已经掌握,xpath 我们在爬虫的时候,总会利用time.sleep(),去等待元素的出现,但是这很容易出错,因为你不知道你的网速有多卡😂,从而导致频繁报错 我相信我的注释已经很 【言简意赅】了,你一定可以看得懂 我用了一

    2024年02月12日
    浏览(40)
  • 自动化测试工具——Selenium详解

    Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,支持的浏览器包括IE(7, 8,

    2024年01月20日
    浏览(62)
  • 【测试开发】第五节.测试——自动化测试(Selenium工具)

    作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java测试开发 每日一句: 人的一生,可以有所作为的时机只有一次,那就是现在!!! 前言 一、自动化测试的概念以及分类 二、Selenium—web自动化测试工具 2.1 自动化测试的一些前置工作 2.2 第一个自动化实例

    2024年02月04日
    浏览(64)
  • 一文详解:自动化测试工具——Selenium

    Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,支持的浏览器包括IE(7, 8,

    2024年01月16日
    浏览(59)
  • 如何使用自动化测试工具Selenium?

    哈喽,大家好,我是小浪。那么有一段时间没有更新了,还是在忙实习和秋招的事情,那么今天也是实习正式结束啦,开始继续更新我们的学习博客,后期主要是开发和测试的学习博客内容巨多,感兴趣的小伙伴们可以一键三连支持一下欧~ 目录 一、什么是自动化测试? 二、

    2024年02月11日
    浏览(61)
  • python自动化测试工具selenium

    selenium 是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:Selenium。相对于另外一款web自动化测试工具QTP来说有如下优点: 免费开源轻量级,不同语言只需要一个体积很小的依赖包 支持多种系统,包括Windows,Mac,Linux 支持多种浏

    2024年02月08日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包