学習06.Pythonクローラクローラ要求モジュール(2)

学習06.Pythonクローラクローラ要求モジュール(2)

今日のコンテンツ

  • セッションCookie処理
  • IPパラメータ設定要求ブローカープロキシ
  • スレッドプールのクロールのデータに基づいて、

知識のレビュー

  • XPathの解決プロセス
  • BS4解決プロセス
  • 一般的なXPath式
  • 共通BS4分析法

クッキーとセッションを学びます

- ステートレスなHTTPプロトコル

IMG

  • 上記のように、HTTPプロトコルは、サーバーがコンテンツを返すのみページ要求を送信するステートレスプロトコル、サーバ上のユーザの閲覧コンテンツがあります。気にしないサーバーの場合、それはユーザの要求を知りません。Webページの一般的なブラウジングのために、何も問題はありません。
  • しかし、今多くのウェブサイトのユーザーのログインを必要とします。淘宝網は、例えば:HTTPプロトコルは淘宝網のために、それはユーザーの行動を把握していないこと、ステートレスであるため、例えば、ユーザは、あなたが「買いボタン」をクリックすると、製品を購入したいと考えています。
  • このユーザーマークを達成するために、サーバーは、特定のメカニズムのユーザーのアクセスを識別するために、このクッキーを使用しています。

クッキーを学びます

IMG

- 示されているように、上記のステートレスのHTTP要求に基づいて、ユーザーマークを達成するために、我々は(ユーザ名など、いくつかのユーザ情報と要求のように、情報がローカルサーバーブラウザに送信されますを運ぶ必要がありますが、サーバーではありませんこの情報を保存する)、これはクッキーのメカニズムがあります。

- ことを注意:クッキー情報がローカルブラウザの内部に格納され、サーバー上のないストレージ関連の情報。送信要求は、クッキーの内容は、HTTPプロトコルのヘッダフィールドで送信される場合。

- ほとんどすべてのサイトの今クッキー情報を含むユーザ要求は、サーバーが訪問したユーザーを知ることができますので、ログインアカウントとパスワードを使用する必要がないとき、オーバーいくつかのクッキー情報を送信します。

- しかし、今述べた、クッキーの情報を参照、送信用にヘッダのHTTPプロトコルの上に直接配置され、これは隠された危険があります!人々があなたのクッキー情報(傍受の要求、またはコンピュータを使用)を取得したら、その後、彼は簡単に自分のユーザー名とパスワードがクッキーから分析することができます。そのセッション機構が、このリスクに対処するために。

セッションを学びます

- 私はセッションのメカニズムを持って、危険なクッキーを述べました。単純な用語(各フレームは異なり、これは単に一般的な実装戦略である)において、プロセス全体にわたって、このようなものです。

  • サーバーへのユーザー名とパスワード、サーバのデータベースに保存されたセッションIDを生成します。
  • ユーザーがアクセスにログインしたときにセッションIDを対応するサーバは、ユーザ(ローカルブラウザ)に送信されます。
  • ブラウザがキー項目としてクッキーにセッションIDを格納します。
  • その後、それぞれの時間は、ブラウザ要求は、サーバーを一緒にセッションIDを含む情報を、クッキーます。
  • サーバがリクエストを受信した後、クッキーのセッションIDによって、クエリにデータベースに、対応するユーザ名を解析、ユーザーの要求であるかを知ります。

概要

- クライアント上のクッキー(ローカルブラウザ)、サーバー側のセッション。クッキーは、ブラウザのローカルストレージメカニズムです。地元のブラウザに保存され、サーバーは問題ではありません。すべてのリクエストはローカルのクッキーにユーザー情報をもたらすでしょう。クッキー情報がブラウザにサーバーの前に送信される、または使用者の前にいくつかの情報を埋めています。

- クッキー危険なメカニズム。あなたは非常に危険なことになる、他の人を盗むと、ユーザー名とパスワードを知っている、すべてのユーザー情報がローカルに存在置くことはできません。セッションメカニズムの導入ので。

- サーバーセッションIDの仕組みの導入を送るとき、それはそれは、ユーザー名とパスワードに基づいており、シンプルで、ランダムな文字列を生成する、この文字列は有効期限があります。

- *メモしておいてください:ローカルのクッキーで、セッションはサーバー、データベースやファイル・サーバによって生成され、その後、ユーザーストアにセッションIDを送信するユーザーストア。このセッションIDサーバを持参への要求は、クエリにデータベースにセッションIDに係るサーバは、そのユーザーを見つけるたびに、ユーザーがマークアップすることができます。

* - セッションが依存セッションIDを実行すると、セッションIDは、ブラウザのクッキーが無効になっている場合、そのセッションが同時に失敗している(しかし、このようなURLの転送セッションIDなどの他の手段によって達成することができ、クッキー、の存在であり、 )

* - ユーザー認証などの機会には、通常のセッションを使用しています。したがって、セッションのコアである維持するために、クライアントは一意にそのセッションIDを識別する

導入

時々、私たちは、あまり私たちが望むものよりも、時にモジュールリクエストの正常動作の前に使用した場合、(「すべてのネットワーク」のプロファイルデータをサンクロール)データの関連情報へのユーザーアクセスを登るためにクローラを使用する場合次のような目的で、

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
if __name__ == "__main__":

    #张三人人网个人信息页面的url
    url = 'http://www.renren.com/289676607/profile'

   #伪装UA
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    #发送请求,获取响应对象
    response = requests.get(url=url,headers=headers)
    #将响应内容写入文件
    with open('./renren.html','w',encoding='utf-8') as fp:
        fp.write(response.text)

IMG移動するにはクリックしてドラッグ

クッキー要求モジュールの動作に基づいて、A.

- それは、データをファイルではなく、ジョー・スミスの個人データページが、ホーム側人人網の着陸、なぜに書かれていることがわかりましたか?まずは、概念と次のクッキーの役割を見直してみましょう:

  • クッキーの概念:ブラウザを介してユーザーが最初にドメイン名を訪問し、アクセスのWebサーバーは、クライアントがこれらのデータを保持するために、Webサーバーとクライアント間の状態を維持するためにデータを送る与えるには、クッキーです。

    • クッキーの役割:ブラウザで私たちは、多くの場合、ログイン用メール、ログインページなどのデータの交換を伴います。私たちはしばしば私を覚えているか、この時点での自動ログインのオプションの30日以内に設定します。彼らはとても情報が記録されているか、答えはクッキーの今日のヒーローである、クッキーは、HTTPサーバによって設定されたブラウザに保存されている、HTTPプロトコルは、データ交換の完了、およびサーバーの後、ステートレスなプロトコルであるされていますクライアントが閉じリンク、各交換データは、新しいリンクを確立する必要があります。私たちはものを買うためにスーパーマーケットに行くと同じようにした後、スコアカードなしで、私たちは何かを購入した後、スーパーマーケットは、私たちが消費するすべての情報を持っていないが、我々はスコアカードか、我々は消費者情報のスーパーマーケットを持っています。クッキーは、スコアカードのようなものです、あなたは商品の統合プロセスを保存することができますスーパーマーケットのシステムは、バックグラウンド・サーバーのように、HTTPプロトコルが取引されている、私たちの情報です。

- 関連の発表がクッキーの後、実際には、すでに上記の場合は、ジョー・スミスは、個人情報ページにクロールできない理由を知っているが、ログインページ。どのように我々はそれのパーソナルページにジョー・スミスを取得する必要がありますか?

  アイデア:

    1.私たちは、クロールを行ってクッキーデータ要求を取得するために、すべてのネットワークログオン要求にクローラを使用する必要があります

    2.個人情報ページのURL要求を使用している場合、要求は指定されたページへのユーザデータのバックに応答する前に要求する前にユーザー情報を1枚のクッキーに持参する必要がある、とだけクッキーを運ぶ、サーバーを識別します

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
if __name__ == "__main__":

    #登录请求的url(通过抓包工具获取)
    post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471'
    #创建一个session对象,该对象会自动将请求中的cookie进行存储和携带
    session = requests.session()
   #伪装UA
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    }
    formdata = {
        'email': '17701256561',
        'icode': '',
        'origURL': 'http://www.renren.com/home',
        'domain': 'renren.com',
        'key_id': '1',
        'captcha_type': 'web_login',
        'password': '7b456e6c3eb6615b2e122a2942ef3845da1f91e3de075179079a3b84952508e4',
        'rkey': '44fd96c219c593f3c9612360c80310a3',
        'f': 'https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dm7m_NSUp5Ri_ZrK5eNIpn_dMs48UAcvT-N_kmysWgYW%26wd%3D%26eqid%3Dba95daf5000065ce000000035b120219',
    }
    #使用session发送请求,目的是为了将session保存该次请求中的cookie
    session.post(url=post_url,data=formdata,headers=headers)

    get_url = 'http://www.renren.com/960481378/profile'
    #再次使用session进行请求的发送,该次请求中已经携带了cookie
    response = session.get(url=get_url,headers=headers)
    #设置响应内容的编码格式
    response.encoding = 'utf-8'
    #将响应内容写入文件
    with open('./renren.html','w') as fp:
        fp.write(response.text)

IMG移動するにはクリックしてドラッグ

II。エージェントベースの操作モジュールリクエスト

  • プロキシは何ですか

    • 演技は、第三者の代わりに、関連事項のバルクハンドリングです。例:エージェントの生活:購買、証券会社、デリバティブ......
  • なぜあなたは爬虫類でプロキシを使用する必要があります

    • 一部のサイトでは、そのような多くのサイトへの訪問など、対応する対策の爬虫類は、時間IPの一定期間を検出し、速すぎて、アクセス頻度が通常の訪問者のように見えていない場合、それはこのIPへのアクセスを禁止する可能性があります。我々はIPが無効になっている場合でも、時間からプロキシIPのための時間に、いくつかのプロキシIPを設定する必要があるので、あなたはまだクロール続けるIPを変更することができます。
  • エージェントのカテゴリ:

    • フォワードプロキシ:データを取得するためのプロキシクライアント。保護クライアントへのフォワードプロキシが責任を保持しています。
    • リバースプロキシ:プロキシサーバーのデータ。リバースプロキシサーバーまたはロード・バランシングを保護するために責任があります。
  • 無料プロキシは、ウェブサイトを提供し、IP

    • http://www.goubanjia.com/
    • 西寺エージェント
    • 即効性の
  • コード

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import requests
    import random
    if __name__ == "__main__":
        #不同浏览器的UA
        header_list = [
            # 遨游
            {"user-agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)"},
            # 火狐
            {"user-agent": "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"},
            # 谷歌
            {
                "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"}
        ]
        #不同的代理IP
        proxy_list = [
            {"http": "112.115.57.20:3128"},
            {'http': '121.41.171.223:3128'}
        ]
        #随机获取UA和代理IP
        header = random.choice(header_list)
        proxy = random.choice(proxy_list)
    
        url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
        #参数3:设置代理
        response = requests.get(url=url,headers=header,proxies=proxy)
        response.encoding = 'utf-8'
    
        with open('daili.html', 'wb') as fp:
            fp.write(response.content)
        #切换成原来的IP
        requests.get(url, proxies={"http": ""})

    IMG移動するにはクリックしてドラッグ

III。データmultiprocessing.dummyスレッドプールクローリングに基づい

  • 要件:ビデオ情報の梨ビデオをクロールし、時間のかかるを計算するデータをクロール

    • 通常のクロール

      %%time
      import requests
      import random
      from lxml import etree
      import re
      from fake_useragent import UserAgent
      #安装fake-useragent库:pip install fake-useragent
      url = 'http://www.pearvideo.com/category_1'
      #随机产生UA,如果报错则可以添加如下参数:
      #ua = UserAgent(verify_ssl=False,use_cache_server=False).random
      #禁用服务器缓存:
      #ua = UserAgent(use_cache_server=False)
      #不缓存数据:
      #ua = UserAgent(cache=False)
      #忽略ssl验证:
      #ua = UserAgent(verify_ssl=False)
      
      ua = UserAgent().random
      headers = {
          'User-Agent':ua
      }
      #获取首页页面数据
      page_text = requests.get(url=url,headers=headers).text
      #对获取的首页页面数据中的相关视频详情链接进行解析
      tree = etree.HTML(page_text)
      li_list = tree.xpath('//div[@id="listvideoList"]/ul/li')
      detail_urls = []
      for li in li_list:
          detail_url = 'http://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]
          title = li.xpath('.//div[@class="vervideo-title"]/text()')[0]
          detail_urls.append(detail_url)
      for url in detail_urls:
          page_text = requests.get(url=url,headers=headers).text
          vedio_url = re.findall('srcUrl="(.*?)"',page_text,re.S)[0]
      
          data = requests.get(url=vedio_url,headers=headers).content
          fileName = str(random.randint(1,10000))+'.mp4' #随机生成视频文件名称
          with open(fileName,'wb') as fp:
              fp.write(data)
              print(fileName+' is over')

      IMG移動するにはクリックしてドラッグ

    • スレッドプールのクロールに基づいて、

      %%time
      import requests
      import random
      from lxml import etree
      import re
      from fake_useragent import UserAgent
      #安装fake-useragent库:pip install fake-useragent
      #导入线程池模块
      from multiprocessing.dummy import Pool
      #实例化线程池对象
      pool = Pool()
      url = 'http://www.pearvideo.com/category_1'
      #随机产生UA
      ua = UserAgent().random
      headers = {
          'User-Agent':ua
      }
      #获取首页页面数据
      page_text = requests.get(url=url,headers=headers).text
      #对获取的首页页面数据中的相关视频详情链接进行解析
      tree = etree.HTML(page_text)
      li_list = tree.xpath('//div[@id="listvideoList"]/ul/li')
      
      detail_urls = []#存储二级页面的url
      for li in li_list:
          detail_url = 'http://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]
          title = li.xpath('.//div[@class="vervideo-title"]/text()')[0]
          detail_urls.append(detail_url)
      
      vedio_urls = []#存储视频的url
      for url in detail_urls:
          page_text = requests.get(url=url,headers=headers).text
          vedio_url = re.findall('srcUrl="(.*?)"',page_text,re.S)[0]
          vedio_urls.append(vedio_url) 
      #使用线程池进行视频数据下载    
      func_request = lambda link:requests.get(url=link,headers=headers).content
      video_data_list = pool.map(func_request,vedio_urls)
      #使用线程池进行视频数据保存
      func_saveData = lambda data:save(data)
      pool.map(func_saveData,video_data_list)
      def save(data):
          fileName = str(random.randint(1,10000))+'.mp4'
          with open(fileName,'wb') as fp:
              fp.write(data)
              print(fileName+'已存储')
      
      pool.close()
      pool.join()

おすすめ

転載: www.cnblogs.com/bky20061005/p/12172937.html