网络爬虫用于项目测试遇404错误,尝试实现惨遭打脸

想要通过网络爬虫来赚取收益,却遇到了不少风险和困难?让我们一起来探讨一下在这个过程中究竟遭遇了哪些问题。

爬虫“景”现

网络爬虫如今成为灰色产业的抢手项目,”运用爬虫技术,饭碗不愁”这句话并非虚言。有些人只是利用爬虫获取公开数据,用于研究分析,并不涉及商业目的,相对而言风险较低。然而,若将爬虫应用于特定部门的项目,情况就变得复杂起来。就有一个例子,该部门定制的爬虫版本众多且相互重叠,在测试过程中竟然出现了404这样的低级错误。

测试难题待解

之前我也有进行过接口测试,比如进行流量测试接口、通过浏览器获取HAR文件来解析并自动生成自动化测试用例等。然而,由于项目大多是定制化的,每个版本都有所不同,而且时间紧迫任务繁重,这些方法并没有发挥出应有的作用。现在,随着新的大版本即将发布,领导指出之前存在404错误等低级bug。这时,我开始考虑是否可以通过爬取页面URL并发出请求来进行检测。

爬取URL尝试

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
SPLASH_URL = 'http://10.16.53.17:8050'
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
    }

原本打算通过爬取系统中的所有URL,然后进行请求解析,将异常页面记录到CSV文件中。然而,在登录并进入首页后,就遇到了问题,访问页面获取到的数据完全相同,甚至还出现了“很抱歉,safe–v2无法正常工作”的提示信息。误以为没有启动,于是开始忙碌起来,先是检查前端使用的vue路由模式,确认采用的是hash模式,接着又去查看nginx的配置。

from scrapy_splash import SplashRequest
def parse_login(self, response):
    result = response.body.decode('utf-8')
    result = json.loads(result) if isinstance(result, str) else result
    if result.get("errno") != 0:
        logger.info("登录失败,用户名或密码错误")
        exit(0)
    else:
        logger.info(f"用户:{self.data['username']}, 登录成功!")
    _cookie = response.headers['Set-Cookie']
    self.headers["Cookie"] = _cookie
  
    for url in self.start_urls:
        yield SplashRequest(url, self.parse_page, headers=self.headers, 
                            cookies=_cookie, dont_filter=True)  
# dont_filter=True 忽略allowed_domains的过滤

方案转变波折

图片[1]-网络爬虫用于项目测试遇404错误,尝试实现惨遭打脸-东山笔记

核实无误便启动首选计划,整合若干工具,将服务器位置纳入项目,对ES中的中间件进行添加并调整其优先级。只需替换业务请求中的类即可,操作看似简单。然而,调用的数据返回却是乱码,无奈之下,考虑到时间因素,只得放弃此方案。

模拟解析困境

随后,我尝试利用某些工具来抓取实时数据。这些工具模仿浏览器的操作来呈现数据,并采用特定手段解析页面上的元素。尽管完成了配置,但结果并不理想。当我运行爬虫时,发现它不支持当前的环境。于是,我配置了服务器环境进行测试,但获取到的依然是Vue配置的全局index页面。即便更改了配置,结果依旧如此。

单独使用利弊

DOWNLOADER_MIDDLEWARES = {
    'spider_projects.downloadermiddlewares.PlaywrightMiddleware': 543,
}
GERAPY_PLAYWRIGHT_HEADLESS = True #无头、浏览器不弹窗
GERAPY_PLAYWRIGHT_PRETEND = True
GERAPY_PLAYWRIGHT_PROXY = 'http://vpn:3333' # 代理设置
GERAPY_PLAYWRIGHT_PROXY_CREDENTIAL = {  'username': 'xxx',  'password': 'xxxx'}

既然之前的工具组合不适用,便只能独立操作。虽然可行,但工作量相当庞大,每个元素都逐一识别和核实,而最终成果却微乎其微,感觉并不划算。然而,任务完成,因此只能借助浏览器来生成har文件,接着利用系统进行解析,生成接口测试用例,最后完成工作并上传结果,提交报告。

大家不妨思考一下,当遭遇众多技术挑战和繁杂状况时,我们该如何迅速锁定最恰当的应对之策?快来评论区发表你的见解,若觉得内容有价值,不妨点赞并转发!

def main():
    driver = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH)
    driver.get("http://10.20.21.185:8081/dist/#/login")
    driver.maximize_window()
    driver.implicitly_wait(3)
    driver.find_element_by_xpath("*//input[@class='el-input__inner'][1]").send_keys('admin')
    driver.find_element_by_xpath("*//input[@type='password']").send_keys("Admin@123456")
    driver.find_element_by_xpath("*//button[contains(@class,'el-button btn-login')]").click()
    driver.implicitly_wait(3)
    elem = driver.find_element_by_xpath("*//div[text()=' 数据总览 ']")
    all_href = driver.find_elements_by_xpath("(//div[@class='overflow-hidden']//ul)[1]/li/a")
    urls = [i.get_attribute('href') for i in all_href[1:]]
    print(urls)
    titles = driver.find_elements_by_xpath("//p[@class='title']")
    for i in titles:
        spans = i.find_elements_by_xpath("span")
        if len(spans) == 3:
            print(f'菜单:{spans[1].text}')
            spans[2].click()
            for t in spans[2].find_elements_by_xpath():
                pass
        else:
            print(f'按钮:{spans[1].text}')
            spans[1].click()
        driver.forward()

© 版权声明
THE END
喜欢就支持一下吧
分享