scrapyノート【3】[栗を挙げる]

3331 ワード

————挙栗:ケース:テンセント招聘网自动ページめくり采集————

  • 新しい爬虫類を作成:
  • #scrapy startproject xxx( )
    scrapy startproject tcent
    #scrapy genspider mytianya( ) "bbs.tianya.cn"( )
    scrapy genspider tencent "tencent.com"
  • itemsを記述する.py

  • 職階名、詳細、
    class TencentItem(scrapy.Item):
        # define the fields for your item here like:
        jobTitle = scrapy.Field()
        jobCategories = scrapy.Field()
        number = scrapy.Field()
        location = scrapy.Field()
        releasetime = scrapy.Field()
  • tencent.を記述する.py
  • # -*- coding: utf-8 -*-
    import re
    
    import scrapy
    from Tencent import items
    
    class MytencentSpider(scrapy.Spider):
        name = 'myTencent'
        allowed_domains = ['hr.tencent.com']
        start_urls = ['https://hr.tencent.com/position.php?lid=2218&start=0#a']
    
        def parse(self, response):
            for data in response.xpath("//tr[@class=\"even\"] | //tr[@class=\"odd\"]"):
    
                item = items.TencentItem()
                item["jobTitle"] = data.xpath("./td[1]/a/text()")[0].extract()
                item["jobLink"] = data.xpath("./td[1]/a/@href")[0].extract()
                item["jobCategories"] = data.xpath("./td[1]/a/text()")[0].extract()
                item["number"] = data.xpath("./td[2]/text()")[0].extract()
                item["location"] = data.xpath("./td[3]/text()")[0].extract()
                item["releasetime"] = data.xpath("./td[4]/text()")[0].extract()
                yield item
    
                for i in range(1, 200):
                    newurl = "https://hr.tencent.com/position.php?lid=2218&start=%d#a" % (i*10)
                    yield scrapy.Request(newurl, callback=self.parse)

     
  • pipelineを記述する.pyファイル
  • class TencentPipeline(object):
        def __init__(self):
            self.file = open("tencent.txt", "w", encoding="utf-8")
    
        def process_item(self, item, spider):
            line = str(item) + "\r
    " self.file.write(line) self.file.flush() return item def __del__(self): self.file.close()

     
  • はsetting.pyにITEMを設定するPIPELINES
  • ITEM_PIPELINES = {
    "mySpider.pipelines.TencentJsonPipeline":300
    }
  • 実行爬虫類:
  • scrapy crawl tencent

     
    8、parse()の方法を考える仕事のメカニズム:
  • 1. returnではなくyieldを使用しているからです.parse関数はジェネレータとして使用されます.scrapyはparseメソッドで生成された結果を1つずつ取得し、その結果がどのようなタイプであるかを判断します.
  • 2. リクエストの場合は爬取キューに参加し、itemタイプの場合はpipeline処理を使用し、他のタイプの場合はエラー情報を返します.
  • 3. scrapyが第1部に取り出したrequestはすぐにこのrequestを送信するのではなく、このrequestをキューに入れてジェネレータから取得するだけです.
  • 4. 第1部のrequestを全部取って、それから第2部のitemを取得して、itemに取って、対応するpipelineの中で処理します;
  • 5. parse()メソッドはコールバック関数としてRequestに付与、parse()メソッドを指定してこれらの要求scrapyを処理する.Request(url, callback=self.parse)
  • 6. Requestオブジェクトはスケジューリングするscrapyを生成する.http.response()の応答オブジェクトは、スケジューラにRequest(再帰的な考え方)
  • がないまでparse()メソッドに戻される.
  • 7. 取り出した後、parse()作業が終了し、エンジンはキューとpipelinesの内容に基づいて対応する操作を実行します.
  • 8. プログラムは,各ページのitemsを取得する前に,以前のすべてのrequestキュー内のリクエストを処理してからitemsを抽出する.
  • 7. このすべては、Scrapyエンジンとスケジューラが最後まで責任を負います.