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

    一.Scrapy的日志等级

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

      - 日志信息的种类:

            ERROR : 一般错误

            WARNING : 警告

            INFO : 一般的信息

            DEBUG : 调试信息

           

      - 设置日志信息指定输出:

        在settings.py配置文件中,加入

                        LOG_LEVEL = ‘指定日志信息种类’即可。

                        LOG_FILE = 'log.txt'则表示将日志信息写入到指定文件中进行存储。

    二.请求传参

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

      - 案例展示:爬取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()
    

    三、cookie

    豆瓣网个人登录,获取该用户个人主页这个二级页面的页面数据。

    如何发起post请求?

    一定要对start_requests方法进行重写。

    1. Request()方法中给method属性赋值成post
    2. FormRequest()进行post请求的发送
    # -*- coding: utf-8 -*-
    import scrapy
    
    
    class DoubanSpider(scrapy.Spider):
        name = 'douban'
        allowed_domains = ['www.douban.com']
        start_urls = ['https://accounts.douban.com/j/mobile/login/basic']
    
        # 重写start_requests方法
        def start_requests(self):
            # 将请求参数封装到字典
            data = {
                'ck': '',
                'name': 'username',
                'password': 'passwd',
                'remember': 'false',
                'ticket': '',
            }
            for url in self.start_urls:
                yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse)
    
        # 针对个人主页页面数据进行解析操作
        def parseBySecondPage(self, response):
            fp = open('second.html', 'w', encoding='utf-8')
            fp.write(response.text)
    
            # 可以对当前用户的个人主页页面数据进行指定解析操作
    
        def parse(self, response):
            # 登录成功后的页面数据进行存储
            fp = open('main.html', 'w', encoding='utf-8')
            fp.write(response.text)
    
            # 获取当前用户的个人主页
            url = 'https://www.douban.com/people/1xxxxxxxxx/'
            yield scrapy.Request(url=url, callback=self.parseBySecondPage)
    

    四、 代理:

    下载中间件作用:拦截请求,可以将请求的ip进行更换。

    流程:

    1. 下载中间件类的自制定

    a) object

    b) 重写process_request(self,request,spider)的方法

    1. 配置文件中进行下载中间价的开启。

     daili.py

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

     middlewares.py

    from scrapy import signals
    
    class MyProxy(object):
        def process_request(self, request, spider):
            # 请求ip的更换
            request.meta['proxy'] = "http://201.245.172.157:80"
    

     settings.py

    DOWNLOADER_MIDDLEWARES = {
       'proxyDemo.middlewares.MyProxy': 543,
    }
    
  • 相关阅读:
    Cordova-conifg.xml配置
    Cordova插件开发
    android shape的使用
    Cordova
    性能优化
    ionic默认样式android和ios差异
    在IIS中部署ASP.NET 5应用程序遭遇的问题
    Ionic命令大全
    IOS开发
    Cordova 8 架构使用sqlite
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/10141630.html
Copyright © 2011-2022 走看看