scrapy---爬虫中间件和下载中间件

爬虫中间件

python 复制代码
# 爬虫中间件 (了解) middlewares.py
class MysfirstscrapySpiderMiddleware:

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_spider_input(self, response, spider):
        return None

    def process_spider_output(self, response, result, spider):
        for i in result:
            yield i

    def process_spider_exception(self, response, exception, spider):

        pass

    def process_start_requests(self, start_requests, spider):

        for r in start_requests:
            yield r

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

下载中间件

-进来request对象

-加代理

-加cookie

-加请求头

-出去response对象

-修改响应对象,最后进入到爬虫的parser中就是修改后的response

python 复制代码
# 下载中间件
class MysfirstscrapyDownloaderMiddleware:

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    # 请求来了执行
    def process_request(self, request, spider):
        # 返回值可以是如下
        # return None:继续处理本次请求,执行执行下一个中间件的process_request
        #return Response:执行当前中间件的process_response回去,进入到引擎,被调度,进入第6步,返回到爬虫的解析方法中
        # return a Request:直接返回,给引擎,被调度,进入第2步,进入调度器等待下次被调度爬取
        # raise IgnoreRequest:执行 process_exception
        return None

    # 请求走了
    def process_response(self, request, response, spider):

        # 返回如下
        # return Response :继续往后走,进入到引擎,被调度到爬虫中解析
        # return Request :进入到引擎,被调度进调度器
        # - or raise IgnoreRequest:会执行process_exception
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

        
# 在配置文件中配置

1.加代理

python 复制代码
# 在下载中间件的def process_request(self, request, spider):写代码

# 第一步:
	-在下载中间件写process_request方法
   	 def get_proxy(self):
        import requests
        res = requests.get('http://127.0.0.1:5010/get/').json()
        if res.get('https'):
            return 'https://' + res.get('proxy')
        else:
            return 'http://' + res.get('proxy')
     def process_request(self, request, spider):
            request.meta['proxy'] = self.get_proxy()
            return None
        
# 第二步:代理可能不能用,会触发process_exception,在里面写
    def process_exception(self, request, exception, spider):
        print('-----',request.url)  # 这个地址没有爬
        return request

2.加cookie,修改请求头,随机生成UserAgent

2.1加cookie
python 复制代码
def process_request(self, request, spider):
    print(request.cookies)
    request.cookies['name']='lqz'
    return None
2.2 修改请求头
python 复制代码
  def process_request(self, request, spider):
        print(request.headers)
        request.headers['referer'] = 'http://www.lagou.com'
        return None
2.3 动态生成User-agent使用

需要先安装模块

python 复制代码
pip insttall fake_useragent
python 复制代码
 def process_request(self, request, spider):
        # fake_useragent模块
        from fake_useragent import UserAgent
        ua = UserAgent()
        request.headers['User-Agent']=str(ua.random)
        print(request.headers)
        return None
相关推荐
小白不想白a6 小时前
消息队列--包括面试常考题/运维监控指标
中间件
金刚猿6 小时前
01_虚拟机中间件部署_root 用户安装 docker 容器,配置非root用户权限
docker·中间件·容器
青春不朽5128 小时前
Scrapy框架入门指南
python·scrapy
深蓝电商API10 小时前
处理字体反爬:woff字体文件解析实战
爬虫·python
NPE~11 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化
喵手18 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
摘星|18 小时前
正则匹配与爬虫爬取图片路径综合练习
爬虫
喵手18 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出
Hello.Reader18 小时前
Rocket Fairings 实战把全局能力做成“结构化中间件”
中间件·rust·rocket
0思必得019 小时前
[Web自动化] Selenium获取元素的子元素
前端·爬虫·selenium·自动化·web自动化