当前位置: 首页 > news >正文

网站建设 首选百川互动富阳网站建设服务

网站建设 首选百川互动,富阳网站建设服务,辽宁建设工程信息网招标公告桓仁金山热电厂防水工程,宿州网站建设贰聚思诚信摘要 Scrapy爬虫模块是爬虫程序员使用最多的一个模块#xff0c;它以快速#xff0c;高层次等优势#xff0c;深受爬虫工作者的喜爱#xff0c;其中Scrapy的中间件功能也极其重要。中间件处于引擎和爬虫之间的钩子框架#xff0c;允许开发者自定义处理请求和响应的过程。…摘要 Scrapy爬虫模块是爬虫程序员使用最多的一个模块它以快速高层次等优势深受爬虫工作者的喜爱其中Scrapy的中间件功能也极其重要。中间件处于引擎和爬虫之间的钩子框架允许开发者自定义处理请求和响应的过程。常用于用户代理重试机制请求头等。、 钩子框架 钩子框架是一种软件设计模式允许程序在特定的点钩子点插入自定义代码。通过这些钩子点开发者可以在不修改核心的代码的前提下扩展或修改程序的行为。像不像python 中的装饰器钩子框架在插件系统事件处理拦截器等场景中非常常见。 在Scrapy模块中主要可以将中间件分为两类 下载器中间件Downloader Middleware: 处理请求和响应与下载器交互。 爬虫中间件Spider Middleware: 处理从下载器传递到爬虫的响应以及从爬虫输出的请求。 下载器中间件 在下载器中间件Downloader Middleware中主要有以下方法 process_request(request, spider) process_request(request, spider): 在请求发送到下载器之前调用。基于这个原理我们可以自定义头部cookie, 代理ip用户认证等信息添加上 1添加自定义头部信息 为每一个请求添加一个自定义的头部信息 def process_request(self, request, spider):# 在请求发送之前添加一个自定义头部request.headers[X-Custom-Header] CustomValuereturn None 2 设置代理 为请求设置代理服务器 class ProxyMiddleware:def process_request(self, request, spider):request.meta[proxy] http://your_proxy_server:portreturn None3模拟用户登录cookie 在请求中添加cookie模拟用户登录 class LoginMiddleware:def process_request(self, request, spider):request.cookies[sessionid] your_session_idreturn None4 返回缓存响应 如果需要可以直接返回一个缓存的响应而不发送实际请求 from scrapy.http import HtmlResponseclass CacheMiddleware:def process_request(self, request, spider):if some_condition_based_on_request(request):return HtmlResponse(urlrequest.url, bodyCached response, encodingutf-8, requestrequest)return None启用中间件 要使中间件生效需要在settings.py中启用它 process_response(request, response, spider) process_response(request, response, spider)用于在下载器接收到响应后进行处理。通过这个方法我们可以修改响应对象执行日志记录处理错误操作 方法签名 def process_response(self, request, response, spider):# 这里编写处理逻辑return response # 或返回一个新的 Response 对象或者抛出一个 IgnoreRequest 异常参数说明 request :scrapy.http.Request对象表示对应的请求 response:scrapy.http.Response对象表示下载器接收到的响应 spider:当前处理响应的爬虫实例便于访问爬虫的属性方法 返回值 response对象可以使传入的响应对象也可以是一个新的响应对象。如果返回新的响应对象那么原有的响应将被替换。 request对象可以返回一个新的请求对象重新调度新的请求。 IgnoreRequest异常可以抛出scrapy.exceptions.IgnoreRequest异常忽略该请求 1修改响应内容 可以对响应的内容进行修改例如添加自定义标记或替换某些内容例如给爬取的数据加上时间戳 class ModifyResponseMiddleware:def process_response(self, request, response, spider):# 假设我们希望在响应体中添加一个自定义标记modified_body response.body b\n!-- Custom Footer --return response.replace(bodymodified_body)2 日志记录 记录响应的状态码方便调试和监控 class LogResponseMiddleware:def process_response(self, request, response, spider):spider.logger.info(fResponse received from {request.url} with status {response.status})return response3重试处理 根据响应状态码决定是否进行重试例如对于某些特定的错误状态码进行重试 from scrapy.exceptions import IgnoreRequestclass RetryMiddleware:def process_response(self, request, response, spider):if response.status in [500, 502, 503, 504]:spider.logger.warning(fRetrying {request.url} due to server error {response.status})return request # 重新调度请求以进行重试return response4 缓存响应 将响应缓存到本地文件避免重复下载: import os from scrapy.http import HtmlResponseclass CacheResponseMiddleware:def process_response(self, request, response, spider):cache_dir cacheos.makedirs(cache_dir, exist_okTrue)cache_path os.path.join(cache_dir, f{hash(request.url)}.html)with open(cache_path, wb) as f:f.write(response.body)return responsedef process_request(self, request, spider):cache_path os.path.join(cache, f{hash(request.url)}.html)if os.path.exists(cache_path):with open(cache_path, rb) as f:body f.read()return HtmlResponse(urlrequest.url, bodybody, encodingutf-8, requestrequest)return None最后要在setting中启用这些中间件 process_exception(request, exception, spider) process_exception(request, exception, spider)用于处理在爬取过程中发生的异常当请求处理过程中出现异常时Scrapy将调用该方法并将相关请求异常和爬虫对象作为参数传递给该方法。 参数说明 request:发生异常的请求对象 exception: 抛出的异常对象 spider: 当前爬虫对象 使用process_exception()方法可以根据具体的需求来处理异常记录日志重新发送请求忽略异常等以下是一个代码示例 class MyMiddleware(object):def process_exception(self, request, exception, spider):# 处理异常的逻辑print(fAn exception occurred while processing {request.url}: {exception})# 返回None表示继续处理异常返回Response对象表示忽略异常并返回自定义的响应return None在这个示例中我们打印了异常的详细信息并返回了None,表示继续处理异常。如果要忽略异常并返回自定义响应可以通过返回一个Response对象来实现。 爬虫中间件 爬虫中间件主要包括以下方法 process_spider_input(response, spider)在爬虫处理响应之前调用。process_spider_output(response, result, spider)在爬虫处理完响应之后调用。process_spider_exception(response, exception, spider)在爬虫处理响应过程中抛出异常时调用。process_start_requests(start_requests, spider)处理爬虫产生的初始请求。 我们一一介绍 process_spider_input(response, spider) process_spider_input(response, spider)用于在爬虫处理响应数据之前对响应进行预处理。这个方法通常被用来对响应进行一些定制化的操作例如修改响应内容添加额外的字段或者进行其他预处理操作。 当爬虫处理一个响应时scrapy会调用每个下载中间件的process_spider_input()方法以便对响应进行处理这个方法可以在自定义的下载中间件中实现来响应进行定制化处理。 以下是process_spider_input()方法的参数说明 response:要处理的响应对象。 spider:当前爬虫对象 如何在自定义下载中间件中实现process_spider_input()方法 class MyMiddleware(object):def process_spider_input(self, response, spider):# 对响应进行处理的逻辑if special_field not in response.meta:response.meta[special_field] special_valuereturn response在这个实例中在process_spider_input()方法中向响应的meta信息中添加一个特使字段如果这个字段不存在的话。然后返回了处理后的响应对象。这样在爬虫处理响应数据之前我们就可以对响应进行一些自定义的操作。 process_spider_output(response, result, spider) process_spider_output(response, result, spider) 用于在爬虫生成的结果如item, Request等返回之前对其进行处理。这个方法通常被用在自定义的爬虫中间件中以便对爬虫生成的结果进行筛选修改或扩展。 该方法在爬虫处理完一个响应后生成结果会依次传递给每个爬虫中间件的process_spider_output()方法这样就可以在结果返回给引擎之情对其进行处理。 以下是process_spider_output()方法的参数说明 response:处理过的响应对象 result:爬虫返回的结果通常是包含一个item,request或者其他对象的可迭代对象如生成器列表等 spider:当前爬虫对象。 下面一个简单的代码展示如何在自定义爬虫中间件中实现process_spider_output方法 class MySpiderMiddleware(object):def process_spider_output(self, response, result, spider):# 对爬虫输出的结果进行处理的逻辑for item in result:if isinstance(item, dict): # 假设我们只对Item进行处理item[processed_by] MySpiderMiddlewareyield item在这个实例中process_spider_output()方法逐一处理爬虫生成的结果。如果结果是一个字典假设它是一个item,则在其中添加一个字段processed_by,然后再将结果通过yield返回这种方式可以确保所有生成的结果都被处理返回。 需要注意的是process_spider_output()方法应该返回一个可迭代对象通常使用yield来逐个返回结果。如果多个中间件实现这个方法它们将在设置中的顺序依次被调用对结果进行链式处理。记得在中间件中启用。 process_spider_exception(response, exception, spider) process_spider_exception(response, exception, spider)用于爬虫处理响应时发生异常时对该异常进行处理。这个方法通常被用在自定义的爬虫中间件中以便在异常发生时执行特定的逻辑例如日志记录错误处理或重试等操作。 方法参数 response:导致异常的响应对象 exception:抛出的异常对象 spider:当前的爬虫对象 返回值 可以返回None或者一个None值的可迭代对象以继续传播异常或者可以返回一个新的result如Item或Request对象的可迭代对象在替代异常。 class MySpiderMiddleware(object):def process_spider_exception(self, response, exception, spider):# 处理异常的逻辑spider.logger.error(fException caught: {exception} for URL: {response.url})# 如果需要可以生成新的Request以重试请求if isinstance(exception, SomeSpecificException):new_request response.request.copy()new_request.dont_filter True # 不要因为重复请求而被过滤return [new_request]# 返回None以继续传播异常return None在这个实例中当爬虫处理响应时发生异常时process_spider_exception()方法会 1记录异常信息和相关的URL 2 如果异常类型为SomeSpecificException,则生成一个新的请求以重试该请求并返回这个请求。 3如果不是这个特定的异常类型则返回None,继续传播异常 为了让Scrapy使用这个中间件需要在项目的设置文件settings.py中启用它 process_start_requests(start_requests, spider) process_start_requests(start_requests, spider): 用于在开始爬取时对起始请求进行处理。这个方法通常被用在自定义的爬虫中间件中以便对起始请求进行自定义操作例如添加额外的请求参数修改请求头部。这和下载器中间件的process_request(request, spider)方法类似。 方法参数 start_requests:起始请求的可迭代对象。 spider当前的爬虫对象 返回值 必须返回一个可迭代对象该对象包含要发送的起始请求。 下面是一个示例代码展示了如何在自定义爬虫中间件中实现process_start_requests()方法 class MySpiderMiddleware(object):def process_start_requests(self, start_requests, spider):# 对起始请求进行处理的逻辑for request in start_requests:# 添加额外的请求参数request.meta[extra_param] some_value# 修改请求头部request.headers[User-Agent] Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36yield request在这个示例中process_start_request()方法会遍历起始请求并对每个请求执行以下操作 1添加名为extra_param的额外参数请求值为“some_value” 2修改请求的头部将User_Agent修改为指定的值 3通过yield返回修改请求。 记得在settings.py文件汇总启用它
http://www.zqtcl.cn/news/508719/

相关文章:

  • wordpress小说网站模板南宁企业网站seo
  • 网站开发与设计课程时间网站推广的搜索引擎推广
  • 网站首页幻灯片不显示网页设计制作项目
  • 遂宁网站建设哪家好深圳做响应式网站设计
  • 慈溪建设企业网站wordpress 增加分类字段
  • 毕业设计做系统网站wordpress修改评论框
  • 上海网站开发孵化设计者联盟官网
  • 旅游网站开发需求报告微信创建小程序
  • 不收费推广网站有哪些h5网站要多久
  • seo网站营销推广全...互联网创业好项目
  • vx小程序制作网站优化标题怎么做
  • 做旅游网站课程设计报告湘潭学校网站建设 x磐石网络
  • 接网站 建设没有网站可以做seo排名吗
  • 抚顺网站seo建设网站需要支付什么插件费用吗
  • 东台做淘宝网站电子商务是学什么
  • 建一个购物网站多少钱wordpress托管在哪里
  • 怎么建设免费网站北京最大的火车站
  • 做视频网站被判刑豫建设标 网站
  • 济南网站建设济南wordpress计次查询
  • 做英文小工具网站赚钱商城网站是免费开吗
  • 做网站需要注意的问题seo推广代运营
  • 采购网站大全wordpress decorum
  • wordpress建站教程道一网页效果图素材
  • 广州网站开发哪家专业免费咨询怀孕医生
  • 洛阳网站的优化阿里云购买域名后怎么建网站
  • 我是做环保类产品注册哪些浏览量大的网站推销自己的产品比较好呢网站功能模块设计
  • 叫人做网站多少钱百度免费网站怎样建设
  • 本地南通网站建设新手编程入门先学什么
  • asp网站开发的背景与环境久久建筑网会员
  • 河北省住房建设厅官方网站个人计算机做服务器建网站