想要通过网络爬虫来赚取收益,却遇到了不少风险和困难?让我们一起来探讨一下在这个过程中究竟遭遇了哪些问题。
爬虫“景”现
网络爬虫如今成为灰色产业的抢手项目,”运用爬虫技术,饭碗不愁”这句话并非虚言。有些人只是利用爬虫获取公开数据,用于研究分析,并不涉及商业目的,相对而言风险较低。然而,若将爬虫应用于特定部门的项目,情况就变得复杂起来。就有一个例子,该部门定制的爬虫版本众多且相互重叠,在测试过程中竟然出现了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的过滤
方案转变波折
核实无误便启动首选计划,整合若干工具,将服务器位置纳入项目,对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()