brawellen 2024-07-23 16:03 采纳率: 40%
浏览 2
已结题

scrapy+selenium selenium操作出现异常如何返回请求重新执行新的请求

利用selenium+scrapy框架爬虫时,selenium在中间件的检索等自动化操作时遇到了已预知可承受的异常,如搜索不出结果的TimeoutException异常,怎样返回spiders的start_rqeuests继续下一次请求,且检索的内容是由列表构成的,循环遍历检索,出现异常后则跳过列表中该元素检索下一元素。

    def start_requests(self):
        # company_sum_list = get_all_company("昆山市")
        # company_before_list = get_company_before()
        # company_list = [company for company in company_sum_list if company not in company_before_list]
        company_list = ['公司1', '公司2']
        for company in company_list:
            for url in self.start_urls:
                # 第一次请求(使用Selenium中间件)
                yield scrapy.Request(url, callback=self.parse, meta={'use_selenium': True, 'company_name': company})


    def process_request(self, request, spider):
        if request.meta.get('use_selenium'):
            url = request.url
            company = request.meta.get('company_name')
            try:
                spider.driver.get(url)
                time.sleep(2)

                # 模拟搜索操作
                
                # 等待搜索结果加载
                WebDriverWait(spider.driver, 5).until(
                    EC.presence_of_element_located(By.XPATH, "//table[@class='result-table-list']"))
                html = spider.driver.page_source
                # spider.driver.close()
                # 提交搜索结果
                return HtmlResponse(url, body=html, encoding='utf-8', request=request)
            except TimeoutException:
                print(company")
                # 这里怎么返回?
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-23 16:04
    关注

    引自免费微信小程序:皆我百晓生

    在使用Scrapy和Selenium结合进行爬虫时,处理异常并重新发起请求是一个常见的需求。为了在Selenium遇到异常(如TimeoutException)时返回Scrapy的start_requests并继续下一个请求,你可以采取以下步骤来实现:

    1. 定义中间件处理异常: 在Scrapy中,你可以使用中间件来捕获和处理异常。创建一个自定义的中间件,并在其中处理Selenium相关的异常。
    2. 使用循环遍历列表: 当你的检索内容是一个列表时,你可以在中间件中使用循环来遍历这个列表。当Selenium操作遇到异常时,你可以跳过当前元素并继续下一个。

    下面是一个简单的示例代码,展示了如何实现这个过程:

    自定义中间件

    import scrapy
    from selenium.common.exceptions import TimeoutException
    
    class SeleniumMiddleware:
        def process_request(self, request, spider):
            # 假设你有一个列表,用于存储要检索的URL或其他数据
            data_list = [...]  # 这里填充你的数据列表
            index = 0  # 用于跟踪当前处理的数据索引
            
            while index < len(data_list):
                data = data_list[index]
                # 执行Selenium相关的操作,如搜索等
                try:
                    # 这里是执行Selenium操作的伪代码,根据实际情况替换为你的代码
                    selenium_action(data)  # 此处应调用你的Selenium方法或函数
                    # 如果一切正常,增加索引并返回请求给Scrapy处理
                    index += 1
                    return scrapy.Request(request.url, callback=spider.parse)  # 或者调用你需要的回调函数
                except TimeoutException:  # 处理Selenium的TimeoutException异常
                    # 如果遇到异常,跳过当前元素并继续下一个元素的处理
                    index += 1  # 跳过当前元素继续下一个循环迭代
                except Exception as e:  # 处理其他可能的异常
                    print(f"处理过程中遇到未知异常: {e}")  # 记录或处理其他异常
            # 如果所有数据都已处理完毕,则返回None以结束请求处理链
            return None  # 或抛出IgnoreRequest以阻止后续处理链执行,根据你的需求选择适当的处理方式
    

    在Scrapy中使用中间件

    在你的Scrapy项目中,确保已经注册了这个中间件。在settings.py文件中添加以下代码:

    DOWNLOADER_MIDDLEWARES = {
        'your_project.middlewares.SeleniumMiddleware': 543,  # 将上述中间件注册在这里,位置可根据需要调整。确保它排在所有其他的下载中间件之前。因为这里使用了全局唯一的数字标识符来排序中间件。你可以根据你的项目进行调整。确保这个路径指向你的自定义中间件文件。如果它不在你的项目中,你需要创建它。如果它已经在你的项目中存在,请确保路径是正确的。如果没有请复制相应的模板来创建新的文件或者新的配置(根据需要修改代码中的 'your_project' 和 'middlewares' 以匹配你的项目结构)。如果路径正确并且已经存在这个中间件类,那么你应该直接修改它以满足你的需求。更改这些值来反映你的项目的结构即可。"target="_blank" rel="nofollow noopener">''创建和注册中间件。你可能需要调整这些设置以匹配你的项目的具体情况。"}}} } """确保所有的路径和设置都正确无误。"请按照上述步骤操作,并确保你的代码正确无误。"```注意以下几点:你需要确保你已经正确地注册了中间件类并且它的位置在Scrapy的处理链中的位置是正确的(根据你的需求调整数字标识符)。同时确保你的代码逻辑是正确的并且适用于你的具体场景。"你可以根据需要添加额外的异常处理或修改现有代码以适应你的特定需求。"希望这个解答对你有所帮助!"在Scrapy爬虫项目中运行Python代码可能会涉及到其他一些具体的配置和操作步骤这些都没有在你的问题中详细提到如果你有更多的问题或者需要进一步的帮助请随时向我提问我会尽力帮助你解决!"```
    
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月23日
  • 修改了问题 7月23日
  • 创建了问题 7月23日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?