Pythonクローラーフレームワークのスクレイプスタディノート


スクレイピープロジェクトxxxxスクレイピーゲンスパイダーxxxxx "http://www.xx.com"

items.pyを書き込んで、抽出するデータを指定します。spiders
/ xxx.pyを書き込んで、クローラーファイルを書き込んで、要求と応答を処理します。pipelines.py
を書き込んで、パイプラインファイルを書き込み、スパイダーを処理して、アイテムデータを返します。settings.pyを書き込んで
、有効にしますパイプラインの形成およびその他の関連設定

クローラーを実行する

hr.tencent.com

スパイダーテンプレート
scrapygenspider tencent "tencent.com"を作成する

クローラーコマンド
scrapycrawltencentを実行します

++++++++++++++++++++++++++++++++++++


scrapy startprojectのDouyu
scrapy genspider douyu "douyucdn.cn"

item.py

nickname = scrapy.Field()
imagelink = scrapy.Field()

douyucdn.cn

baseUrl = "http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset="
offset = 0
start_urls = [baseUrl + str(offset)]

spider.py

def parse(self、response):
    data = json.loads(response.body)
    #print(data)
    if len(data)== 0:
        return
    for dat in data:
        print(dat ["nickname"])
        print(dat ["avatar_mid"])
        item = DouyuItem()
        item ['nickname'] = dat ['nickname']
        item ['avatar_mid'] = dat ['avatar_mid']
        yield item
    
    self.offset + = 20
    yield scarp.Request(self .baseUrl + str(self.offset)、callback = self.parse)

ピップライン

ImagesPipeline

def get_media_requests(self、item、info):
    image_link = item ['imagelink']
    収量scrapy.Request(image_link)
def process_item(self、item、spider):
    アイテムを返す

def item_complete(self、results、item、info):
    #print(relust)
    #print(***)
    image_path = [x ["path"] for ok、x in
    resluts if ok] os.rename(images_store + image_path [ 0]、images_store + item ["nickname"] + "。jpg")
    
    return item
    
    
settings.py

IMAGES_STORE = ""


Mozilla / 5.0(Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build / HUAWEIBLA-AL00)AppleWebKit / 537.36(KHTML、Geckoなど)バージョン/4.0Chrome/57.0.2987.132 MQQBrowser /8.9モバイルSafari / 537.36
Mozilla / 5.0(iPhone; U; MacOSXのようなCPUiPhone OS 2_0; en-us)AppleWebKit / 525.18.1(GeckoのようなKHTML)バージョン/3.1.1Mobile/5A347Safari/525.200

TOBOTSTXT_OBEY = False    

path = [x ["path"] for ok、x in resluts if ok]


cddouyueスクレイプ
クロールDouyu

 


スクレイプノート

Scrapyをインストールする 

scrapyピップインストール
ピップはpypiwin32をインストール

1.テキスト検索用のTF-IDFアルゴリズム
2.リンク配信ウェイト用のリンクアルゴリズム:ページランク
3.リンク再計算用:HITSアルゴリズム
4.リンク関連性用:ヒルトップアルゴリズム
5.リンク計算をより柔軟にする:SALSAアルゴリズム
6、より完全なページランクアルゴリズム
7、ユーザーのクリック動作に基づく結果の並べ替え

インポートscrapy
qsbk.itemsからはQsbkItemインポート
:クラスQsbkSpiderSpider(scrapy.Spider)
    NAME = 'qsbk_spider'
    allowed_domains = [ 'qiushibaike.com']
    start_urls = [ 'https://www.qiushibaike.com/text/page/1'を]
    
    def parse(self、response):
        duanzidivs = response.xpth( "// div [@ id = 'content-left'] / div")
        for duanzidivs in duanzidivs:
            author = duanzidiv.xpath( ".// h2 / text() ")
            。get ()。strip()content = duanzidiv.xpath(" .// div [@ class = 'content'] // text() ")。getall()
            content =" " 。join ( content).strip()
            item = QsbkItem(author = author、content = content)
            #duanzi = {"著者 ":author、" content ":content}
            アイテム#duanziを生成します


pipes.py

import json
class QsbkPipeline(object):
    def __init __(self):
        self.fp = open( "duanzi.join"、 "w"、encoding = "utf-8")
    def open_spider(self、spider):
        print( "乾燥虫開始 ")
        pass
    def process_item(self、item、spider):
        item_json = json.dumps(item)
        item_json = json.dumps(dict(item)、ensure_ascii = False)
        self.fp.write(item_json + '\ n')
        return item
        
    def close_spider(self、spider):
        self.fp.close()
        print( "ぶ虫する束")

    
        
settings.py

コメントを開きます
ITEM_PIPELINES = {     'qsbk.pipelines.QsbkPipeline':300 }

items.py

スクレイピーをインポートする

クラスQsbkItem(scrapy.Item):
    author = scrapy.Field()
    content = scrapy.Field()

恥ずかしさ百科事典爬虫類ノート

1.responseはscrapy.http.response.html.HtmlResponseオブジェクトであり、xpathとcssを使用してデータを抽出できます
。2。抽出されたデータはSelectorまたはSelectListオブジェクトであり、文字列を取得する場合は、getallまたはgetメソッドを実行する必要があります。
3.getallメソッド:セレクター内のすべてのテキストを取得し、リストを返します
4.getメソッド:セレクター内の最初のテキストを取得し、strタイプを返します
5.データを解析する場合は、パイプライン処理に渡す必要があります、次に、yieldを使用して返品するか、すべてのアイテムを収集して、最後にreturnを使用して返品できます
。6.item:「item.py」でモデルを定義することをお勧めします。今後、辞書は使用されません
。7 .pipline:これはデータの保存専用です。次の3つのメソッドが頻繁に使用されます
    。open_spider(self、spider)
    process_item(self、item、spider)
    close_spider(slef、spider)
    パイプラインをアクティブにするには、「settings.py」で「ITEM_PIPELINES」を設定する必要があります。
    ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・··························
    ITEM_PIPELINES = {         「qsbk.pipelines.QsbkPipeline」:300     }


    ··············································· ············

パイプラインをjson行の形式で書き直します

scarp.exportersからインポートJsonLinesItemExporter

クラスQsbkPipeline(object):
    def __init __(self):
        self.fp = open( "duanzi.json"、 'wb')
        self.exporter = JsonLinesItemExporter(self.fp、ensure_ascii = False、encoding = 'utf-8')
    def open_spider(self、spider):
        print( "爬虫開創。。。")
    def process_item(self、item、spider):
        self.exporter.export_item(item)
        return item
    def close_spider(self、spider):
        self.fp。 close()
        print( '輸出虫結束了。。。')

        
        
        
        
パイプラインをjsonファイルの形式で書き直します    

からscrapy.exportersインポートJonsItemExporter

クラスQsbkPipeline(object):
    def __init __(self):
        self.fp = open( "duanzi.json"、 'wb')
        self.exporter = JsonItemExporter(self.fp、ensure_ascii = False、encoding = 'utf-8')
        self.exporter.start_exporting()
        
    def open_spider(self、spider):
        print( "クローラーが開始しました")
    
    def process_item(self、item、spider):
        self.exporters.export_item(item)
        return item
    def close_spider(self、spider) :
        self.exporter.finish_exporting()
        self.fp.close()
        print( 'クローラーが終了しました...')
        
        
スパイダーがデータの次のページを継続的にクロールできるようにスパイダーを書き直します

····································
クラスqsbk_spider
名前
start_urls
ドメイン

def parse(self、response):
    //リストセットを     抽出し
    ます
//各アイテムをトラバースします//必要なデータを抽出します
    //歩留まりを返し
    ます
    //次のページへのリンクを抽出します //ある場合はリクエストを開始します
    // ifエンドスパイダー
········································· ····
    
クラスQsbkSpiderSpider(scrapy.Spider):
    name = 'qsbk_spider'
    allowed_domains = ['qiushibaike.com']
    start_urls = ['https://www.qiushibaike.com/text/page/1/']
    base_domain = "https://www.qiushibaike.com"
    
    def parse(self、response):
        duanzidivs = response.xpath( "// div [@ id = 'content-left'] / div")
        for duanzidiv in duanzidivs:
            author = duanzidiv .xpath( ".// h2 / text()")。get()。strip()
            content = duanzidiv.xpath( ".// div [@ class = 'content'] // text()")。getall()
            content = ""。join(content).strip()
            item = QsbkItem(author = author 、content = content)
            yield item
        next_url = response.xpath( "// ul [@ class = 'pagination'] / li / [last()/ a / @ href]")。get()
        if not next_url:
            return
        else利回りscrapy.Request(self.base_domain + next_url、callback = slef.parse)


スクレイピーgenspider-cクロール[クローラー名] [ドメイン名]


##### CrawlSpider:
LinkExtractorとRuleを使用する必要があります。これら2つのことにより、クローラーの特定の方向が決まります。
1.ルールを設定する方法を許可します:必要なURLに制限できるようにします。他のur1と同じ
正規表現を生成しないでください
2.どのような状況でフォローするか:ページをクロールするときに現在の条件を満たすURLをフォローアップする必要がある
場合は、Trueに設定します。それ以外の場合は、Fasleに設定します。3。
どのような状況でコールバックを指定する必要がありますか。この場合、URLに対応するページは、より多くのURLを取得するためのもので
あり、内部のデータを必要としないため、コールバックを指定する必要ありませ。URLに対応するページのデータを取得する場合は、
コールバックを指定する必要があります。

非身体アドレスScrapyシェル:
I
1.私たちは、いくつかのデータ抽出テストコードを実行することが便利です。
2. scarpコマンドを実行する場合は、最初にscrapyが配置されている環境に入る必要があることは間違いありません。
3.プロジェクトの構成情報を読みたい場合は、最初にプロジェクトを入力する必要があります。次に、scrapyshell
"コマンドを実行します。


データはmysqlに保存されます


class JianshuSpiderPipeline(object):
    def
        __init __ dbparam = {             'host': '127.0.0.1'、             'port': '3306'、             'user': 'root'、             'password': 'root'、             'database': 'jianshu2''charset'             : 'utf-8'         }         self.conn = pymysql.connect(** dbparams)         self.cursor = self.conn.cursor()         self._sql = None         def process_item(self、item、spider) :             self.cursor.execute(self.sql、(item ['title']、item ['content']、item ['author']))             self.conn。commit()             return item         @property         def sql(self):










        






            self._sqlでない場合:
                self.sql:= "" "
                article(id、title、content)に挿入values(null、%s、%s、$ s、$ s)
                " ""
                return self._sql returnself
                
            。 _sql


非同期エントリ

クラスJianshuTwistedPipeline(object):
    def __init __(self):
        dbparam = {             'host': ''、             'port': ''、             'user': ''、             'password': ''、             'database': ''、             'charset': 'utf8'、             'cursorclass':cursors.DictCursor         }         self.dbpool = adapi.ConnectionPool( 'pymysql'、** dbparams)         self._sql = None         @property         def sql(self):             if not self._sql :                 self._sql = "" "                 insert into()values(null、%s、%s、%s、%s、%s)                 "" "                 return self._sql










        







            return self._sql
        def process_item(self、item、spider):
            defer = self.dbpool.runInteraction(self.insert_item、item)
            defer.addErrback(self.handle_error、item、spider)
        def insert_item(self、cursor、item):
            cursor.execute(self.sql、(item ['title']、item ['content']、item ['author']、item ['avatar']))
            
        def handle_error(self、error、item、spider):
            print( '=' * 10 + "error"、item、spider):
            print(error)

start.py 


スクレイピーインポートコマンドラインからcmdline.execute( "scrapy craw swf" .split())


どこでもPython仮想環境の依存性

pipフリーズ> requirements.txt

rzコマンドは、ローカルファイルのアップロードダイアログを開くことができます

pip install -r required.txt

仮想環境のインストール

pip install virtualenvwrapper

どのpython3

mkvirtualenv -p / usr / bin / python3クローラー-envhttp
        
//capi.douyucdn.cn/api/v1/getVerticalRoom?limit = 20&offset = 100
https://www.bilibili.com/video/av57909837/?p= 2


 

おすすめ

転載: blog.csdn.net/taotaobaobei/article/details/102178661