最初の爬虫類:恥をかく百科のジョーク

7506 ワード

前の列のヒント:
  • Python 3.5
  • 分散キューなし、重量チェックなし、Scrapy-Redisフレームワークなし、効率なし
  • 参考資料(前列拝礼);
  • ネットユーザー静捜
  • CSDNコラム
  • Jecvay Notes
  • 知乎大神、簡潔
  • 第一歩:登ればいい
    import urllib
    import urllib.request
    
    url = "http://news.dbanotes.net"
    html = urllib.request.urlopen(url)
    data = html.read().decode('UTF-8')
    print(data)

    このような数行のコードを通じて、私たちは1つのインタフェースをつかむことができて、htmlコードを返します.しかし、このような爬虫類は1つのインターフェースしか登れないので、連続的に登りたいならどうすればいいのでしょうか.
    ステップ2:連続して登る
    連続して登りたい場合は、登ったページに他のページにリンクされたURLを見つける必要があります.ここでは正規表現でマッチングする必要があります.一致したURLは1つのキューに格納する必要があります.そうすれば、アクセスを継続できます.大型爬虫類はScrapy-Redisフレームワークを採用している.同時に、重複しないように、どのURLがアクセスされたかを記録するためのキューも維持されます.この簡単な重量検査方法はset()容器で実現できる.しかしset要素が大きくなるにつれて消費は線形に増加する.大型爬虫類はBloom Filterを採用しています.
    import re
    from collections import deque
    
    queue = deque()
    queue.append('www.baidu.com')#     
    visited = set()
    
    while queue:
      url = queue.popleft()
      visited |= url
    
      linkre = re.compile(r'href="(.+?)"')
      for x in linkre.findall(data):
        if (len(queue) < 100 and x not in visited):
          queue.append(x)

    上記のコードのURLマッチングルールは粗末で、URLではない可能性があるので、この正規表現はもっと正確に書く必要があります.上記コードのdataは、最初のステップで得られたdataである.このdataはdecodeで処理しなければならないので、エラーが発生します.キューのURLを格納することで、爬虫類は絶えずURLを得ることができ、setの要素と比較することで、重複したURLへのアクセスを避けることができます.しかし、アクセスしたURLが無効だったり、サーバーが応答しなかったりしたら、どうすればいいですか?
    ステップ3:例外処理
    ブラウザを使用すると、ページにアクセスできない場合があります.最も一般的なのは404です.404はhttpのステータスコードで、アクセスするページが見つからないことを意味します.このとき、ブラウザからページを閉じるといいです.しかしpython爬虫類でこのようなエラーが発生すると、爬虫類全体がクラッシュし、作業が停止します.以下、エラー処理方式を示す.
    try:
      html = urllib.request.urlopen(url, timeout = 100)#    
      data = html.read().decode('UTF-8')
    except:
      continue

    コードの中の処理方法は暴力的で、直接アクセスできないURLを省略して、アクセスできない原因を知らない.アクセスできない理由の1つは、サーバが応答を拒否することです.現在、ほとんどのサイトでは爬虫類が這うことが禁止されているので、爬虫類がサーバーと対話している間に、サーバーが爬虫類であることに気づいたら、あなたのすべての要求を拒否します(例えば京東、宝を洗って、直接這うのはだめです).この時、爬虫類をブラウザに偽装する必要があります.
    ステップ4:ブラウザに偽装
    ブラウザに偽装するのは簡単に言えば、あなたのリクエストにヘッダ情報を追加することです.最も重要なのはUser-Agentパラメータです.ヘッダ情報とは?ブラウザが教えてくれます.ブラウザデバッグインタフェースを開く(Chromeです.F 12を直接押すと出てきます)、最上階のNetworksを選択し、ブラウザのアドレスバーにURLを出入りして、車に戻ると、デバッガにたくさんのリクエストが出てきます.jsとか、画像とか、cssとか、勝手にリクエストをクリックして、右側でheadersを選択します.headersの最後のアイテムはUser-Agentです.コピーして、辞書の形でheaderに保存します.sの中にあります.
    url = deque.popleft()
    request = urllib.request.Request(url, headers = {
     'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)\
                 Chrome/50.0.2657.3 Safari/537.36'
    })
    
    html = urllib.request.urlopen(request)

    以上の構成では、サーバはあなたがブラウザだと思ってリクエストを拒否しません.次に、静的なHTMLコードを正規にキャプチャすることができます.正規表現をうまく使えば、欲しいものを簡単に手に入れることができます.しかし、ダイナミックなものをつかむには、他の知識が必要です.
    に付随
    私の恥ずかしい百科事典のジョークを捕まえて保存した爬虫類.
    #    
    import re
    import urllib
    import urllib.request
    
    #        ,           、      ,    。
    def saveData(data, savePath):
        f = open(savePath, 'a')
        try:
            f.write(data)
        except:
            pass
        f.close()
    
    cnt = 1 
    #          
    rule_joke = r'
    ((?:.|[\r
    ])*?)
    '
    savePath = 'E:\qb_jokes.txt' url_header = 'http://www.qiushibaike.com/8hr/page/' url_tail = 1 while url_tail < 30:  # , url = url_header + str(url_tail) request = urllib.request.Request(url, headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)\ Chrome/50.0.2657.3 Safari/537.36' }) # , try: html = urllib.request.urlopen(request) data = html.read() except: print('Parser Html Error!') continue # jokes = re.compile(rule_joke) try: joke = jokes.findall(data.decode("UTF-8")) except: print("Find jokes error!
    "
    ) continue # for j in joke: print(str(cnt) + j + "
    "
    ) saveData(str(cnt) + j + "
    "
    , save_path) cnt += 1 # url_tail += 1

    読んだジョークのスクリーンショット第一个爬虫:爬糗事百科笑话_第1张图片