scrapyインクリメンタルトレース

6305 ワード

爬虫類に触れ始めたときはPythonを初めて習ったので、request、bs 4、pandasを使って、後でscrapyに触れて1、2つの爬虫類を作って、フレームワークがいいと思っていましたが、残念ながら記録も忘れてしまいました.今、推薦システムをするには一定の文章を登る必要があるので、またscrapyを拾いました.この機会に記録を作る.
ディレクトリは次のとおりです.
  • 環境
  • ローカルウィンドウデバッグコマンド
  • 工事目録
  • xpathセレクタ
  • 簡単な増分爬虫例
  • 構成紹介
  • 環境
    自分の環境でscrapyをインストールするには必ずanaconda(anacondaの優位性を再強調
    ローカルウィンドウのデバッグと実行
    開発時にscrapyが持参したデバッグ機能を利用してシミュレーションリクエストを行うことができ、request、responseは後のコードと同じになります.
    #        
    scrapy shell URL
    #      
    scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"  URL
    
    #             (json、csv 
    scrapy crawl SPIDER_NAME -o FILE_NAME.csv
    
    #       
    scrapy startproject  articles #          scrapy  

    新しいエンジニアリング構造の紹介
    # spiders         ,item.py       
    # middlewares.py       (      ),pipelines.py        ,       item      
    # settings.py          (    
    ├── articles
    │   ├── articles
    │   │   ├── __init__.py
    │   │   ├── items.py
    │   │   ├── middlewares.py
    │   │   ├── pipelines.py
    │   │   ├── settings.py
    │   │   └── spiders
    │   │       ├── healthy_living.py
    │   │       ├── __init__.py
    │   │       └── people_health.py
    │   └── scrapy.cfg
    ├── README.en.md
    └── README.md

    ページ解析神器——Xpathセレクタ
    scrapyはxpathセレクタを持っていて、とても便利で、簡単にいくつかのよく使うことを紹介します
    #       --LinkExtractor,             url text(            
    from scrapy.linkextractors import LinkExtractor
    le = LinkExtractor(restrict_xpaths="//ul[@class='nav2_UL_1 clearFix']")#        ,    (for i in le),   url(i.url)  (i.text)
    
    #     class   aa div        
    response.xpath("//div[@class='aa']/text()").extract()       # '//'      ,'/'       ,         ul     
    
    #       “   ”   a        (         
    response.xpath("//a[contains(text(),'   ')]/@href").extract()

    単純なインクリメンタル・登りの例
    ここでインクリメンタル・ロールアップの考え方は簡単です.ターゲット・サイトのデータは時間通りに並べられているので、ある接続をrequestする前に、データベースにこのデータがあるかどうかを調べ、ある場合は爬虫類を停止し、リクエストが開始されていない場合は
    class HealthyLiving(scrapy.Spider):
        #               ,               
        name = "healthy_living"
        #       ,scrapy     ,     lis  
        start_urls = ['http://www.jkb.com.cn/healthyLiving/']
    
        '''
                
        '''
        def parse(self, response):
            le = LinkExtractor(restrict_xpaths="//ul[@class='nav2_UL_1 clearFix']")
            for link in le.extract_links(response)[1:-1]:
                tag = link.text
                #           ,           (           
                meta = {"tag": tag}
                #          ,             
                yield scrapy.Request(link.url, callback=self.parse_articles, meta=meta)
    
        '''
                        
        '''
        def parse_articles(self, response):
            #           
            meta = response.meta
            article_links = response.xpath("//div[@class='txt']/h4/a/@href").extract()
            for link in article_links:
                res = self.collection.find_one({"article_url": link}, {"article_url": 1})
                full_meta = dict(meta)
                #           
                full_meta.update({"article_url": link})
                if res is None:
                    yield scrapy.Request(link, callback=self.parse_article, meta=full_meta)
                else:
                    return
            next_page = response.xpath("//div[@class='page']//a[contains(text(),'»')]/@href").extract()[0]
            if next_page:
                yield scrapy.Request(next_page, callback=self.parse_articles, meta=meta)
    
    #       ,   
        def parse_article(self, response):
         #  item.py         
            article_item = ArticlesItem()
            meta = response.meta
            #   xpath          item
            try:
                article_item["tag"] = ""
                #  ...   
            finally:
                yield article_item
    

    エンジニアリング構成の概要
    要求ヘッダの設定、データベースの構成
    #      , middlewares.py   , settings.py   
    class RandomUA(object):
        user_agents = [
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit"
                "/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
                "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit"
                "/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
            ]
    
        def process_request(self, request, spider):
            request.headers["User-Agent"] = random.choice(self.user_agents)
    
    
    #         , pipeline.py    , settings.py    
    class MongoPipeline(object):
        def __init__(self, mongo_uri, mongo_db):
            self.mongo_uri = mongo_uri
            self.mongo_db = mongo_db
    
        @classmethod
        def from_crawler(cls, crawler):
            return cls(
                mongo_uri=crawler.settings.get('MONGO_URI'),
                mongo_db=crawler.settings.get('MONGO_DB')
            )
    
        def open_spider(self, spider):
            print("    ", datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
            self.client = pymongo.MongoClient(self.mongo_uri)
            self.db = self.client[self.mongo_db]
    
        def process_item(self, item, spider):
            data = self.db[item.collection].find_one({"title": item["title"], "date": item["date"]})
    
            if data is None:
                self.db[item.collection].insert(dict(item))
            # else:
            #     self.close_spider(self, spider)
            return item
    
        def close_spider(self, spider):
            print("    ", datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
            self.client.close()
    #  settings.py  :      ,      
    DOWNLOADER_MIDDLEWARES = {
       # 'articles.middlewares.ArticlesDownloaderMiddleware': 543,
       'articles.middlewares.RandomUA': 543,# 543     ,         
    }
    
    ITEM_PIPELINES = {
       'articles.pipelines.MongoPipeline': 300,
    }
    
    
    #       
    ROBOTSTXT_OBEY = True #        robot  
    FEED_EXPORT_ENCODING = 'utf-8' #            
    ##      
    MONGO_URI = ''
    MONGO_DB = ''
    MONGO_PORT = 27017
    MONGO_COLLECTION = ''