淄博建企业网站,如何起手做网站项目,WordPress获取评论内容,网络营销环境分析报告在网络爬虫中#xff0c;使用Scrapy和Selenium相结合是获取动态网页数据的有效方式。本文将介绍如何使用Scrapy和Selenium构建一个爬取携程旅游信息的爬虫#xff0c;实现自动化获取数据的过程。 本文已对部分关键URL进行处理#xff0c;本文内容仅供参考#xff0c;请勿用…在网络爬虫中使用Scrapy和Selenium相结合是获取动态网页数据的有效方式。本文将介绍如何使用Scrapy和Selenium构建一个爬取携程旅游信息的爬虫实现自动化获取数据的过程。 本文已对部分关键URL进行处理本文内容仅供参考请勿用以任何商业、违法行径
简介
携程you.ctrip.com是一个提供旅游信息的网站但它的部分内容可能是动态加载的难以直接通过Scrapy获取。这时就需要借助Selenium这样的工具模拟浏览器行为进行数据的获取和处理。
工具准备
Scrapy 一个用于爬取网站并提取结构化数据的强大框架。Selenium 一个自动化测试工具可以模拟用户操作浏览器的行为。ChromeDriver 作为Selenium WebDriver的一部分用于驱动Chrome浏览器进行自动化测试。 具体下载地址和环境配置可参考 使用Selenium和bs4进行Web数据爬取和自动化(爬取掘金首页文章列表) - 掘金 (juejin.cn)
实现步骤
设置Scrapy项目 创建Scrapy项目并配置爬虫。编写爬虫 使用Scrapy的Spider编写爬虫设置起始URL和数据提取规则。设置Selenium中间件 创建Selenium中间件用于处理需要动态加载的页面内容。利用Selenium模拟浏览器行为 在Selenium中间件中使用ChromeDriver启动浏览器模拟点击、等待页面加载等操作。处理页面内容 利用Selenium获取到的页面内容提取需要的信息并返回给Spider。数据存储或处理 Spider获取到数据后可以选择存储到数据库或进行其他处理。
代码实现
爬虫部分 爬虫启动 爬虫启动后读取Excel文件中的景区名称作为搜索关键词。构建对应的携程搜索链接并发起Request请求。 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 keyyield Request(urlnewurl, meta{use_selenium: True, title: key, id: i, closeid: dflen - 1})Selenium配置 通过Selenium进行浏览器模拟创建Chrome实例设置headless模式无界面运行。使用预设的Chrome浏览器驱动chromedriver.exe打开携程首页读取并加载已保存的Cookie信息实现自动登录。 def creat_browser(self):# ... ChromeOptions设置及浏览器实例化 ...browser webdriver.Chrome(serviceservice, optionsoptions)browser.get()browser.delete_all_cookies()with open(scrapy_tour/cookies_xiecheng.json, r, encodingutf-8) as f:listCookies json.loads(f.read())for cookie in listCookies:browser.add_cookie(cookie)browser.refresh()return browser评论信息采集 在页面加载完毕后使用Selenium定位和等待元素加载获取评论相关内容评分、评论内容、评论时间等。实现翻页操作模拟用户点击下一页持续获取更多评论信息直至达到设定的页数或无法继续翻页。 def parse(self, response):# ...while True:# 定位评论元素等待加载elements WebDriverWait(self.driver, 3).until(lambda x: x.find_elements(byBy.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] titlexiecheng_item[Commentlist] commentstrxiecheng_item[AverageScore] averagescorexiecheng_item[OpenTime] timexiecheng_item[Number] numberxiecheng_item[Id] idyield 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(byBy.CSS_SELECTOR, value.guide-main-item-bottom .title))Similarity_score []for element in elements:title element.textoldtitle 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 Nonemax_index Noneif Similarity_score![]:for index, score in enumerate(Similarity_score):if max_score None or max_score[-1] score[-1]:max_score scoremax_index index# 找到最匹配的选项# print(max, max_score)# print(max_index)# 若成功找到最匹配项,且各种匹配方式得分都大于50.点击该景点获取urlif 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.winflag1# thiswimself.winflagli 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(byBy.CSS_SELECTOR, value.heatView .heatScoreView .heatScoreText))# 将详情页信息发送到spiderbody to_bytes(self.driver.page_source, encodingutf-8)print(传入爬虫url)print(self.driver.current_url)# 修改中间件判断参数request.meta[use_selenium] Falseresponse HtmlResponse(urlself.driver.current_url, bodybody, encodingutf-8,requestrequest)# 关闭窗口句柄减一self.driver.close()# 切换至搜索页面窗口if len(li) 1:self.driver.switch_to.window(li[0])# self.winflag-1self.closemidd(request)return responseelse:self.closemidd(request)raise IgnoreRequest(未找到相似度合格的元素)except Exception as e:raise IgnoreRequest(中间件报错或可能是显示等待的元素等待超时或是元素不存在。)spider.logger.error(fError: 中间件报错{e})# return Noneelse:print(未进入携程的中间件被转移)# 不使用 Selenium直接返回 None让 Scrapy 使用默认的下载器处理这个请求# passreturn None以上是一个用于Scrapy爬虫的中间件主要功能是通过Selenium模拟浏览器操作实现页面交互和内容获取。 初始化 在初始化方法中创建了一个浏览器实例self.driver。设定了一个标志位self.winflag用于跟踪窗口数量。 请求处理 process_request方法处理请求当请求中包含指定的参数use_selenium时使用Selenium处理请求。使用WebDriverWait进行页面元素的显示等待等待指定元素加载完成。根据元素内容的相似度进行匹配点击最匹配的选项获取相关详情信息。如果成功找到匹配项且相似度符合要求切换到详情页等待详情页数据加载完毕获取页面信息并构造HtmlResponse对象。关闭详情页窗口返回HtmlResponse对象传递给爬虫处理。若未找到相似度合格的元素或发生异常则忽略该请求不进行处理。 资源释放 closemidd方法用于释放资源在请求处理完成后根据条件判断是否关闭浏览器窗口句柄。
Pipeline管道
在Scrapy框架中处理数据的管道Pipeline起着至关重要的作用。其中MySQLPipeline是一种常见的数据处理管道用于将爬取的数据存储到MySQL数据库中。 class MySQLPipeline:def __init__(self, mysql_host, mysql_port, mysql_database, mysql_user, mysql_password):# 初始化连接参数和数据库连接实例# ...classmethoddef 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):# 执行批量数据写入操作# ...初始化MySQLPipeline类在初始化时接收MySQL数据库连接所需的参数并创建了数据库连接的实例以及一个用于暂存数据的列表。从配置中获取参数通过from_crawler方法从Scrapy的配置中获取MySQL数据库连接的参数。数据库连接管理open_connection方法用于手动开启数据库连接open_spider方法在爬虫启动时调用也用于开启数据库连接close_spider方法在爬虫关闭时调用用于关闭数据库连接并提交数据到数据库。数据处理process_item方法根据不同的数据类型执行相应的数据库插入操作将数据存储到对应的数据表中。批量写入数据write_data方法用于执行批量数据写入操作将暂存的数据列表批量写入数据库表中并在操作完成后清空数据列表。
这样我们就成功的构建了一个旅游信息采集爬虫。
注意事项
页面结构变化 网站的页面结构可能会不定期更改导致原有的提取规则失效需要定期检查和更新提取规则。反爬措施 网站可能有反爬措施需要注意不要频繁请求或暴露爬虫行为。
总结
通过Scrapy和Selenium的结合我们可以构建一个能够有效获取旅游信息的爬虫。但是需要注意爬虫在实际应用中需要遵守网站的规则避免对网站造成过大压力或触发反爬机制。
以上就是利用Scrapy和Selenium构建旅游信息爬虫的基本流程和实现方法。
注意以上代码和步骤仅为示例实际爬虫需根据网站的页面结构和变化进行相应调整和处理。