赞
踩
2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)_软件测试刷题小程序-CSDN博客文章浏览阅读2.7k次,点赞85次,收藏12次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、app自动化测试、接口测试、性能测试、自动化测试、安全测试及一些常问到的人力资源题目。最主要的是他还收集了像阿里、华为这样的大厂面试真题,还有互动交流板块……_软件测试刷题小程序https://blog.csdn.net/AI_Green/article/details/134931243?spm=1001.2014.3001.5502在网络爬虫中,使用Scrapy和Selenium相结合是获取动态网页数据的有效方式。本文将介绍如何使用Scrapy和Selenium构建一个爬取携程旅游信息的爬虫,实现自动化获取数据的过程。 本文已对部分关键URL进行处理,本文内容仅供参考,请勿用以任何商业、违法行径
携程(you.ctrip.com)是一个提供旅游信息的网站,但它的部分内容可能是动态加载的,难以直接通过Scrapy获取。这时就需要借助Selenium这样的工具,模拟浏览器行为进行数据的获取和处理。
爬虫启动:
- def start_requests(self):
- df = pd.read_excel("D:\code\Scrapy\scrapy_tour\A级景区(按省份).xlsx")
- scenic_namelist = df['景区名称']
- dflen = len(scenic_namelist)
- for i in range(10641, dflen):
- key = scenic_namelist[i]
- newurl = '' + key
- yield Request(url=newurl, meta={'use_selenium': True, 'title': key, 'id': i, 'closeid': dflen - 1})
2.Selenium配置:
- def creat_browser(self):
- # ... ChromeOptions设置及浏览器实例化 ...
- browser = webdriver.Chrome(service=service, options=options)
- browser.get("")
- browser.delete_all_cookies()
- with open('scrapy_tour/cookies_xiecheng.json', 'r', encoding='utf-8') as f:
- listCookies = json.loads(f.read())
- for cookie in listCookies:
- browser.add_cookie(cookie)
- browser.refresh()
- return browser
- def parse(self, response):
- # ...
- while True:
- # 定位评论元素,等待加载
- elements = WebDriverWait(self.driver, 3).until(
- lambda x: x.find_elements(by=By.CSS_SELECTOR, value='.commentList .commentItem .contentInfo'))
- # 获取评论相关信息
- # 翻页操作
- # ...
XiechengItem
中,并利用Scrapy框架的Item Pipeline进行后续处理和存储。- if id is not None and title is not None and commentstr!='':
- xiecheng_item['Title'] = title
- xiecheng_item['Commentlist'] = commentstr
- xiecheng_item['AverageScore'] = averagescore
- xiecheng_item['OpenTime'] = time
- xiecheng_item['Number'] = number
- xiecheng_item['Id'] = id
- yield xiecheng_item
通过这样的爬取方式,可以获取携程上景区的评论信息,包括评分、评论内容、评论时间等,为进一步分析景区口碑提供了数据支持。
- class xiecheng_SeleniumMiddleware:
- def __init__(self):
-
- self.driver = creat_browser()
- self.winflag = 0
-
-
-
-
- # 释放资源
- def closemidd(self,request):
- if request.meta.get('closeid')==request.meta.get('id'):
- self.driver.quit()
-
-
-
- def process_request(self, request, spider):
- if request.meta.get('use_selenium'):
- self.driver.get(request.url)
- # 在这里使用Selenium进行页面交互,如点击按钮、填写表单等
- # 并等待页面加载完成
- # 获取页面内容
- # page_source = self.driver.page_source
- # 转换为字节格式,以避免一些编码错误
- # self.driver.implicitly_wait(5) # 设置隐式等待时间为5秒
- try:
-
- # 显示等待确保能找到元素,显示等待3s
- # raise IgnoreRequest("强制取消")
- elements = WebDriverWait(self.driver, 3).until(
- lambda x: x.find_elements(by=By.CSS_SELECTOR, value='.guide-main-item-bottom .title'))
-
- Similarity_score = []
- for element in elements:
- title = element.text
- oldtitle = request.url.split('=')[1]
- # url 转码中文
- oldtitle = urllib.parse.unquote(oldtitle)
- Similarity_score.append(get_similarity(oldtitle, title))
- # if Similarity_score[-1][4] >=50:
- # print(Similarity_score[-1])
-
- max_score = None
- max_index = None
-
- if Similarity_score!=[]:
- for index, score in enumerate(Similarity_score):
- if max_score == None or max_score[-1] < score[-1]:
- max_score = score
- max_index = index
-
-
- # 找到最匹配的选项
- # print('max', max_score)
- # print(max_index)
- # 若成功找到最匹配项,且各种匹配方式得分都大于50.点击该景点获取url
- if max_score != None and max_score[2] >= 50 and max_score[3] >= 50 and max_score[4] >= 50:
- print('max', max_score)
- elements[max_index].click()
- print("click yes")
- # self.winflag+=1
- # thiswim=self.winflag
- li = self.driver.window_handles # 出现多个窗口,需要切换句柄,先获取句柄列表
- if len(li)>=2:
- self.driver.switch_to.window(li[-1]) # 切换句柄
- # 显示等待热度数据,等待详情页显示完毕
- hot = WebDriverWait(self.driver, 3).until(
- lambda x: x.find_elements(by=By.CSS_SELECTOR, value='.heatView .heatScoreView .heatScoreText'))
- # 将详情页信息发送到spider
- body = to_bytes(self.driver.page_source, encoding='utf-8')
- print('传入爬虫url')
- print(self.driver.current_url)
- # 修改中间件判断参数
- request.meta['use_selenium'] = False
- response = HtmlResponse(url=self.driver.current_url, body=body, encoding='utf-8',
- request=request)
- # 关闭窗口句柄减一
- self.driver.close()
-
- # 切换至搜索页面窗口
- if len(li) >= 1:
- self.driver.switch_to.window(li[0])
- # self.winflag-=1
- self.closemidd(request)
- return response
-
-
- else:
- self.closemidd(request)
- raise IgnoreRequest("未找到相似度合格的元素")
- except Exception as e:
- raise IgnoreRequest("中间件报错,或可能是显示等待的元素等待超时或是元素不存在。")
- spider.logger.error(f"Error: 中间件报错,{e}")
-
- # return None
- else:
- print('未进入携程的中间件,被转移')
- # 不使用 Selenium,直接返回 None,让 Scrapy 使用默认的下载器处理这个请求
- # pass
- return None
以上是一个用于Scrapy爬虫的中间件,主要功能是通过Selenium模拟浏览器操作,实现页面交互和内容获取。
初始化:
self.driver
。self.winflag
用于跟踪窗口数量。请求处理:
process_request
方法处理请求,当请求中包含指定的参数use_selenium
时,使用Selenium处理请求。WebDriverWait
进行页面元素的显示等待,等待指定元素加载完成。HtmlResponse
对象。HtmlResponse
对象,传递给爬虫处理。资源释放:
closemidd
方法用于释放资源,在请求处理完成后,根据条件判断是否关闭浏览器窗口句柄。在Scrapy框架中,处理数据的管道(Pipeline)起着至关重要的作用。其中,MySQLPipeline是一种常见的数据处理管道,用于将爬取的数据存储到MySQL数据库中。
- class MySQLPipeline:
- def __init__(self, mysql_host, mysql_port, mysql_database, mysql_user, mysql_password):
- # 初始化连接参数和数据库连接实例
- # ...
-
- @classmethod
- def from_crawler(cls, crawler):
- # 从爬虫配置中获取数据库连接参数
- # ...
-
- def open_connection(self):
- # 手动开启数据库连接
- # ...
-
- def open_spider(self, spider):
- # 在爬虫启动时打开数据库连接
- # ...
-
- def close_spider(self, spider):
- # 在爬虫关闭时关闭数据库连接并提交数据
- # ...
-
- def process_item(self, item, spider):
- # 处理爬取到的数据,并根据数据类型执行相应的数据库插入操作
- # ...
-
- def write_data(self, sql):
- # 执行批量数据写入操作
- # ...
from_crawler
方法从Scrapy的配置中获取MySQL数据库连接的参数。open_connection
方法用于手动开启数据库连接;open_spider
方法在爬虫启动时调用,也用于开启数据库连接;close_spider
方法在爬虫关闭时调用,用于关闭数据库连接并提交数据到数据库。process_item
方法根据不同的数据类型,执行相应的数据库插入操作,将数据存储到对应的数据表中。write_data
方法用于执行批量数据写入操作,将暂存的数据列表批量写入数据库表中,并在操作完成后清空数据列表。这样我们就成功的构建了一个旅游信息采集爬虫。
通过Scrapy和Selenium的结合,我们可以构建一个能够有效获取旅游信息的爬虫。但是需要注意,爬虫在实际应用中需要遵守网站的规则,避免对网站造成过大压力或触发反爬机制。
以上就是利用Scrapy和Selenium构建旅游信息爬虫的基本流程和实现方法。
(注意:以上代码和步骤仅为示例,实际爬虫需根据网站的页面结构和变化进行相应调整和处理。)
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。