証券スターの株価データをつかむ


python爬虫類の成長の道(一):証券の星の株のデータをつかむ
データの取得はデータ分析の不可欠な一部であり、ネットワーク爬虫類はデータの取得の重要なルートの一つである.これに鑑みて、Pythonという利器を拾って、ネット爬虫類の道を開いた.
本編で使用するバージョンはpython 3.5、証券の星の当日のすべてのA株のデータをつかむことを意図しています.プログラムは主に3つの部分に分けられる:ホームページのソースコードの取得、必要な内容の抽出、得られた結果の整理.
一、ウェブソースの取得
多くの人がpython爬虫類を好む理由の一つは、使いやすいことです.次の数行のコードだけで、ほとんどのWebページのソースコードをキャプチャできます.
import urllib.request
url='http://quote.stockstar.com/stock/ranklist_a_3_1_1.html'  #    headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)"}  #         request=urllib.request.Request(url=url,headers=headers)  #     response=urllib.request.urlopen(request)  #     content=response.read().decode('gbk')   #            print(content)  #      

1ページのソースコードをつかむのは簡単だが、1つのサイト内で大量にソースコードをつかむと、サーバーにブロックされ、すぐに世界が悪意に満ちていると感じた.そこで私は反爬虫類の制限を突破する功法を学び始めました.
      1.偽装放浪器ヘッダ
多くのサーバは、ブラウザから送信されたヘッダによって人間のユーザであるかどうかを確認するため、ブラウザの動作を模倣してリクエストヘッダを構築してサーバにリクエストを送信することができます.サーバーはその中のいくつかのパラメータを識別してあなたが人間のユーザーかどうかを識別し、多くのサイトはUser-Agentというパラメータを識別するので、リクエストヘッダは持って行ったほうがいいです.いくつかの警戒性の高いサイトでは、Accept-Languageを通じてあなたが人間のユーザーかどうかを識別したり、防犯チェーン機能のあるサイトではreferというパラメータを持っていなければならないなど、他のパラメータで識別する可能性があります.
      2.UAをランダムに生成
証券の星はUser-Agentというパラメータさえあればページ情報をキャプチャできるが、何ページもキャプチャし続けるとサーバーにブロックされる.そこで私はデータをキャプチャするたびに異なるブラウザが要求を送信するのをシミュレートし、サーバはUser-Agentによって異なるブラウザを識別することにしたので、ページを登るたびにランダムに異なるUA構造ヘッダを生成してサーバに要求することができ、
      3.這い出し速度を遅くする
異なるブラウザでデータを抽出するシミュレーションを行いましたが、時間帯によっては100ページ以上のデータを取得できる場合もありますが、10ページ以上しか取得できない場合もあります.サーバは、アクセスの頻度に応じて、人間のユーザーなのか、ネットワークの爬虫類なのかを識別するようです.だから私は1ページをつかむたびにランダムに数秒休ませて、このコードに参加した後、各時間帯に大量の株のデータを登ることができます.
      4.プロキシIPの使用
日は不測の風雲があって、プログラムは会社の時に順調にテストに成功して、寝室に帰った後にまた数ページしか捕まえられないことを発見してサーバーに阻止されました.慌てふためく私は急いで度娘に寻ねて、サーバーがあなたのIPを识别することができることを知って、そしてこのIPアクセスの回数を记录して、高匿の代理IPを使うことができて、そしてつかむ过程の中で绝えず交换して、サーバーに谁が真犯人なのかを探し出すことができません.この功はまだ修成されていないので、後のことを知りたいなら、次の分解を聞いてください.
      5.他の反爬虫類の制限を突破する方法
多くのサーバーはブラウザの要求を受け入れる時にクッキーファイルをブラウザに送信して、それからクッキーを通じてあなたのアクセス過程を追跡して、サーバーにあなたが爬虫類であることを認識させないために、クッキーを持って一緒にデータを登ることをお勧めします.模拟登录するサイトに遭遇した场合、自分のアカウントが黒くならないように、大量のアカウントを申请してからログインすることができます.ここでは模拟登录、検证コードの识别などの知识について、しばらくは深く研究しません.要するに、サイトのオーナーにとっては、確かに嫌な爬虫類がいるので、爬虫類の進入を制限する方法がたくさん考えられますので、強引に入った後もマナーに注意して、人のサイトを引きずらないようにしなければなりません.
二、必要な内容の抽出
Webソースを取得すると、必要なデータを抽出できます.ソースコードから必要な情報を取得する方法はたくさんありますが、正規表現を使用することは古典的な方法の一つです.まず、収集したページのソースコードの一部を見てみましょう.
干渉を減らすために、私はまず正規表現でページ全体のソースコードから以上のマスター部分をマッチングし、次にマスター部分から各株の情報をマッチングします.コードは以下の通りです.
pattern=re.compile('')  
body=re.findall(pattern,str(content))  #         pattern=re.compile('>(.*?)  
  

       compile ,findall , 。 , 。

.
* 0
0
\s :[\t\r
\f\v]
\S :[^\s]
[...]
(...)

      , 。 xpath , 。

      (.*?) >

stock_last=stock_total[:] #stock_total:        for data in stock_total:  #stock_last:        
    if data=='':
        stock_last.remove('')

に、いくつかのデータを して を ることができます.コードは の りです.
print('  ','\t','  ','   ','\t','   ','\t','   ','\t','   ','\t','5    ')for i in range(0,len(stock_last),13):        #     13   
    print(stock_last[i],'\t',stock_last[i+1],' ','\t',stock_last[i+2],'  ','\t',stock_last[i+3],'  ','\t',stock_last[i+4],'  ','\t',stock_last[i+5])

された の は のとおりです.
の の のすべてのA のデータをつかむ な は の りです.
import urllibimport urllib.requestimport reimport randomimport time#      user_agent = ["Mozilla/5.0 (Windows NT 10.0; WOW64)", 'Mozilla/5.0 (Windows NT 6.3; WOW64)',              'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',              'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',              'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36',              'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko)',              'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1',              'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3',              'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12',              'Opera/9.27 (Windows NT 5.2; U; zh-cn)',              'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0',              'Opera/8.0 (Macintosh; PPC Mac OS X; U; en)',              'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6',              'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)',              'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)',              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)',              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Maxthon/4.0.6.2000 Chrome/26.0.1410.43 Safari/537.1 ',              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; QQBrowser/7.3.9825.400)',              'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 ',              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.92 Safari/537.1 LBBROWSER',              'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; BIDUBrowser 2.x)',              'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/3.0 Safari/536.11']
stock_total=[]   #stock_total:            stock_page:       for page in range(1,8):
    url='http://quote.stockstar.com/stock/ranklist_a_3_1_'+str(page)+'.html'
    request=urllib.request.Request(url=url,headers={"User-Agent":random.choice(user_agent)})#   user_agent         
    try:       
        response=urllib.request.urlopen(request)    except urllib.error.HTTPError as e:            #    
        print('page=',page,'',e.code)    except urllib.error.URLError as e:        print('page=',page,'',e.reason)
    content=response.read().decode('gbk')       #      
    print('get page',page)                  #         
    pattern=re.compile('') 
    body=re.findall(pattern,str(content))
    pattern=re.compile('>(.*?)