• scrapy框架详解


    Scrapy框架

    • Scrapy Engine:主要负责控制系统各个部件之间的data flow,以及当特定事件发生的时候触发的事件

    • Scheduler:接受engine发来的request放入队列中,当engine要求的时候再提供给engine

    • Downloader:负责拉取page并返给engine,engine之后再传递给Spiders

    • Spider:用户自行编写的代码类,这部分的用户代码主要完成解析response并提取item,或者是跟进页面中获取额外的link url

    • litem Pipeline:清晰、验证和存储数据

    • Downloader Middlewares:位于Scrapy引擎和下载器之间的框架,主要处理Scrapy引擎与下载器的请求及响应

    • Spider Middlewares:主要处理响应的输入和请求输出

    • Scheduler Middewares:介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应

      流程

      1、引擎从调度器中取出一个链接(url)用于接下来的抓取

      2、引擎把url封装成一个请求(Request)传给下载器

      3、下载器把资源下载下来,并封装成应答包(Response)

      4、爬虫解析Response

      5、解析出实体(ltem),则交给实体管道进行进一步的处理

      6、解析出的是链接(url),则把url交给调度器等待抓取

    1、工程建立

    scrapy startproject hellospider  
    

    • scrapy.cfg:项目的配置文件

    • myxiaopapa:该项目的python模块,在这里面写代码

    • myxiaopapa/items.py:需要提取的数据结构定义文件

    • myxiaopapa/middlewares.py:是和Scrapy的请求/响应处理相关联的框架

    • myxiaopapa/pipelines.py:用来对items里面提取的数据做进一步处理,如保存等

    • myxiaopapa/settings.py:项目的配置文件

    • myxiaopapa/spiders:放置spider代码的目录

    2、实现过程

    • 在items.py中定义自己要抓取的数据
    import scrapy
    class MyxiaopapaItem(scrapy.Item):
        ##抓取商品的标题、价格、状态
        title=scrapy.Field()
        price=scrapy.Field()
        status=scrapy.Fied()
    
    • 在spiders目录下编辑自己爬虫文件(我的文叫tamall.py)
    import scrapy
    from urllib.parse import urlencode
    from myxiaopapa import items
    
    class TamllSpider(scrapy.Spider):
       '''
       name:scrapy唯一定位实例的属性,必须唯一
       allowed_domains:允许爬取的域名列表,不设置表示允许爬取所有
       start_requests:从start_urls中读取链接,使用make_requests_from_url生成Request,我们可以再start_requests方法中根据自己的需求写入自定义的规律链接
       parse:回调函数,处理response并返回处理后的数据跟需要跟进的url
       log:打印日志信息
       closed:关闭spider
       '''
        name='tamall'
        allowed_domains=['www.tmall.com']
        start_urls=['http://httpbin.org/get']
    	def start_request(self):
            for q in self.qs:
                self.param={
                    "自己拼接的路径"
                }
            url=self.api+urlencode(self.param)
            yied scrapy.Request(
                url=url,callback=self.gettotalpage,dont_filter=True)
        def gettotalpage(self,response):
            totalpage = response.css(
                '[name="totalPage"]::attr(value)').extract_first()
            self.param['totalPage']=int(totalpage)
            for i in range(1,self.param['totalPage']+1)
            	self.param['jumpto']=i
                url=self.api+urlencode(self.param)
                yield scrapy.Request(
                    url=url,callback=self.get_info,dont_filter=True)
                
         def get_info(self,response):
            product_list=response.css('.product')
            for product in product_list:
                title=product.css('筛选条件').extract_first()
                price=product.css('筛选条件').extract_first()
                status=product.css('筛选条件').extract_first()
                
                item=items.MyxiaopapaItem()
                item['title']=title
                item['price']=price
                item['status']=status
                yeid item
    
    • 在pipelines.py中进行数据库存储
    import pymongo
    
    class MyxiaopapaPiepeline(object):
        def __init(self,host,port,db,table):
            self.host=host
            self.port=port
            self.db=db
            self.table=table
            
        @classmethod
        def from_crawler(cls,crawl):
            port=crawl.settings.get('PORT')
            host=crawl.settings.get('HOST')
            db=crawl.settings.get('DB')
            table=crawl.settings.get('TABLE')
            return cls(host,port,db,table)
        
        def open_spider(self,crawl):
            self.client=pymongo.MongoClient(port=self.port,host=self.host)
            db_obj=self.client[self.db]
            self.table_obj=db_obj[self.table]
            
        def close_spider(self,crawl):
            self.client.close()
            
        def process_item(self,item,spider):
            self.table_obj.insert(dict(item))
            print('存储成功')
            return item
    
    
    • 在settings.py 中对相关配置进行设置
      BOT_NAME='myxiaopapa'
        
      SPIDER_MODULES=['myxiaopapa.spiders']
      
       NEWSPIDER_MODULE='myxiaopapa.spiders'
    
       HOST='ip地址'
       PORT='端口号'
       DB='数据库名'
       TABLE='表名'
    
       ROBOTSTXT_OBEY=False
        
     DEFAULT_REQUEST_HEADERS = {		    'Accept':'text/html,application/xhtml+xml,application/xml;
                                q=0.9,*/*;q=0.8',
      'Accept-Language': 'en',
       "User-Agent": "请求头"
    }
      DOWNLOADER_MIDDLEWARES = {
       'myxiaopapa.middlewares.MyxiaopapaDownloaderMiddleware': 300, # 数值越小,优先级越高
    }
    

  • 相关阅读:
    给TextView底部添加横线
    app支付宝授权登录获取用户信息
    java 面试题整理
    mybatis中app的查询语句
    mybatis 存储过程的写法
    mybatis中存储过程的调用
    字符串替换
    网站收藏
    liunx+mysql数据库管理
    缓存的介绍
  • 原文地址:https://www.cnblogs.com/lzss/p/12158498.html
Copyright © 2020-2023  润新知