zoukankan      html  css  js  c++  java
  • 2----scrapy框架之代理and日志级和请求传参

    一、代理

    爬虫文件 daili.py

    class DailiSpider(scrapy.Spider):
        name = 'daili'
        #allowed_domains = ['www.xxx.com']
        start_urls = ['https://www.baidu.com/s?wd=ip']
    
        def parse(self, response):
           page_text = response.text
           with open('daili.html','w',encoding='utf-8') as fp:
               fp.write(page_text)

    middlewares.py

    class FirstScrapyDownloaderMiddleware(object):
        # ....等
        # 只修改这一个process_request函数参数
        def process_request(self, request, spider):
            # request参数表示的就是拦截到的请求对象,代理ip
            request.meta['proxy'] = "https://151.106.15.3:1080"
            return None

    开启中间件 settings.py557行

    DOWNLOADER_MIDDLEWARES = {
       'first_scrapy.middlewares.FirstScrapyDownloaderMiddleware': 543,
    }

    scrapy crawl daili --nolog   会保存daili.html   在刘拉你打输入ip显示美国的ip

    二、Scrapy的日志等级

    在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息。

    日志信息的种类:

      ERROR : 一般错误

      WARNING : 警告

      INFO : 一般的信息

      DEBUG : 调试信息

      默认的显示级别是DEBUG

    设置日志信息指定输出:

      在 settings.py配置文件中,加入 LOG_LEVEL = ‘指定日志信息种类’ 即可。LOG_FILE = 'log.txt' 则表示将日志信息写入到指定文件中进行存储。

    LOG_LEVEL = "DEBUG"
    LOG_FILE = "log.tx"

    三、请求传参

      在某些情况下,我们爬取的数据不在同一个页面中,例如,我们爬取一个电影网站,电影的名称,评分在一级页面,而要爬取的其他电影详情在其二级子页面中。这时我们就需要用到请求传参。

      案例展示:爬取 www.id97.com电影网,将一级页面中的电影名称,类型,评分一级二级页面中的上映时间,导演,片长进行爬取。

    爬取文件:

    # -*- coding: utf-8 -*-
    import scrapy
    from moviePro.items import MovieproItem
    
    class MovieSpider(scrapy.Spider):
        name = 'movie'
        allowed_domains = ['www.id97.com']
        start_urls = ['http://www.id97.com/']
    
        def parse(self, response):
            div_list = response.xpath('//div[@class="col-xs-1-5 movie-item"]')
    
            for div in div_list:
                item = MovieproItem()
                item['name'] = div.xpath('.//h1/a/text()').extract_first()
                item['score'] = div.xpath('.//h1/em/text()').extract_first()
                #xpath(string(.))表示提取当前节点下所有子节点中的数据值(.)表示当前节点
                item['kind'] = div.xpath('.//div[@class="otherinfo"]').xpath('string(.)').extract_first()
                item['detail_url'] = div.xpath('./div/a/@href').extract_first()
                #请求二级详情页面,解析二级页面中的相应内容,通过meta参数进行Request的数据传递
                yield scrapy.Request(url=item['detail_url'],callback=self.parse_detail,meta={'item':item})
    
        def parse_detail(self,response):
            #通过response获取item
            item = response.meta['item']
            item['actor'] = response.xpath('//div[@class="row"]//table/tr[1]/a/text()').extract_first()
            item['time'] = response.xpath('//div[@class="row"]//table/tr[7]/td[2]/text()').extract_first()
            item['long'] = response.xpath('//div[@class="row"]//table/tr[8]/td[2]/text()').extract_first()
            #提交item到管道
            yield item

    items文件:

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class MovieproItem(scrapy.Item):
        # define the fields for your item here like:
        name = scrapy.Field()
        score = scrapy.Field()
        time = scrapy.Field()
        long = scrapy.Field()
        actor = scrapy.Field()
        kind = scrapy.Field()
        detail_url = scrapy.Field()

    管道文件:

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    import json
    class MovieproPipeline(object):
        def __init__(self):
            self.fp = open('data.txt','w')
        def process_item(self, item, spider):
            dic = dict(item)
            print(dic)
            json.dump(dic,self.fp,ensure_ascii=False)
            return item
        def close_spider(self,spider):
            self.fp.close()
  • 相关阅读:
    微信小程序开发——修改小程序原生checkbox、radio默认样式
    微信小程序开发——微信小程序下拉刷新真机无法弹回
    转:slf4j-api、slf4j-log4j12、log4j之间关系
    MyBatis3 入门学习指南
    Java 多线程重排序的探究
    Kafka 生产者和消费者入门代码基础
    Java面试题
    刻苦读书的故事合集
    Win10 calc.exe 无法打开计算器的解决方法
    Redis(三):set/get 命令源码解析
  • 原文地址:https://www.cnblogs.com/edeny/p/9907357.html
Copyright © 2011-2022 走看看