Python爬虫類実践(一)--ソーシャルサイトユーザー情報爬虫類

5297 ワード

目次
爬虫類プロジェクトの目標
プロセス原理分析
ファイナルインプリメンテーションコード
爬虫類プロジェクトの目標
FBのユーザーIDに、このユーザーのすべての内容を登ります.
例えば投稿状況、投稿転送状況、誰に褒められたか、褒められた人の名前、評価コメント、彼の友达、彼の個人情報.
プロセス原理分析
原理:fqは使わず、理論レベルの研究にすぎない.
簡単な爬虫スクリプト:seleniumでいいです.
爬虫フレームワーク:FBでは非同期ロードが大量に採用されており、単純なパケットの送受信では解析できないことが多いため、selenium+chrome(handless)を使用できるJavaScriptレンダリングエンジンが必要です.
開発言語:python 3,pythonは爬虫類の開発に独特の優位性がある.
開発ツール:pycharm,JBのpycharmはほとんどPython IDEの第一選択です.
プログラムの具体的な手順:ユーザーがログインします.爬虫類を登録状態に保つ.ユーザーのホームページを取得します.タイムライン情報を取得します.パブリックホームページの投稿情報を取得します.友達情報を取得します.反爬虫類の関連操作.
封印を防ぐための措置:
1、コンカレント数を減らし、発注遅延時間を設定する
2、プロキシプールの設定
3、UAの設定
4、マルチユーザログインを設定し、ユーザのログインクッキープールから要求としてのクッキーをランダムに選択し、爬虫類の開始位置に複数のユーザのユーザ名とパスワード情報を導入し、順次ログインし、ログインに成功した後、ユーザクッキーをリストに保存し、その後、発注前にランダムにクッキーを選択する
5、Reuqests関数の待ち時間を設定し、爬虫類の運行速度を遅くし、発注が速すぎるためアカウントが閉鎖されることを防止する
ファイナルインプリメンテーションコード
最終的にseleniumを使用して簡単に登ることを選択しました.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time


class FBSpider(object):

    def __init__(self):
        print("==============================")
        #      
        self.browser = webdriver.Chrome()
        # browser.implicitly_wait(10)
        # browser.set_window_size(0,0)
        #   facebook   #       
        self.browser.get('  ')
        time.sleep(1)
        #            
        self.browser.find_element_by_id('email').clear()
        self.browser.find_element_by_id('email').send_keys('******')
        self.browser.find_element_by_id('pass').clear()
        self.browser.find_element_by_id('pass').send_keys('******')
        time.sleep(1)
        #         ,         
        try:
            self.browser.find_element_by_xpath('//button[@id="loginbutton"]').send_keys(Keys.ENTER)
        except:
            self.browser.find_element_by_xpath('//input[@tabindex="4"]').send_keys(Keys.ENTER)


        uid = '******'   #   id
        

        time.sleep(1)
        #     
        # self.browser.get('  ' + uid)  #   id
        self.browser.get('  ' + uid)   

        print('      :')
        time.sleep(1)
        div1 = self.browser.find_element_by_class_name('timestampContent') #    F12      
        print('  :' + div1.text)

        time.sleep(1)
        div2 = self.browser.find_element_by_class_name('_4vn1') #    F12      
        print('   :' + div2.text)

        time.sleep(1)
        div3 = self.browser.find_element_by_class_name('_6qw4') #    F12      
        div4 = self.browser.find_element_by_class_name('_3l3x') #    F12      
        print('     :' + div3.text + ':' + div4.text)

        
        time.sleep(1)
        div5 = self.browser.find_element_by_class_name('_81hb')
        print('   :' + div5.text)
        #self.browser.find_element_by_class_name('_66lg').click()
        #divs1 = self.browser.find_elements_by_class_name('_6a _6b') #    F12      
        #count = 0
        #for div in divs1:
        #    print(div.text) #             
        #    count += 1
        #    if(count == 5):
        #        break
            
        print('          (  ):')
        # self.browser.find_element_by_link_text('  ').click()
        # time.sleep(1)
        self.browser.get('  ' + uid + '  ')
        time.sleep(1)
        divs2 = self.browser.find_elements_by_class_name('_50f8 _2iem') #      F12      _c24 _50f4
        for div in divs2:
            print(div.text) #          、  、   、    
        divs22 = self.browser.find_elements_by_class_name('_42ef') #  
        for div in divs22:
            print(div.text) #          、  、   、    

        print('          (    ):')
        # self.browser.find_element_by_link_text('  ').click()
        # time.sleep(1)
        self.browser.get('  ' + uid + '  ') 
        time.sleep(1)
        #divs3 = self.browser.find_elements_by_class_name('_6a _6b') #    F12      fsl fwb fcb
        tx = '//*[@id="pagelet_timeline_app_collection_100025583942713:2356318349:2"]/ul[1]/li[1]/div/div/div/div[2]/div'
        divs3 = self.browser.find_elements_by_xpath(tx)
        count = 0
        for div in divs3:
            print(div.text) #          
            #count += 1
            #if(count == 5):
              #  break
        

    def main(self):
        print("==============================")


if __name__ == '__main__':
    spider = FBSpider()
    spider.main()

質問:
テストでは、各ラベル要素の位置決めの問題が重要であり、classnameの位置決めは常に有効ではありません.
個人のホームページにはデジタルidと英語idがあります.
公共のホームページと個人のホームページの違いも大きい.
データが多すぎる場合、たとえば友達リストやコメントリストでは、AJAXと非同期でロードされたパケットをドロップダウンしてリフレッシュする必要があります.
また、ネットワークの問題でページロードの問題が発生し、データ取得に失敗することもあります.
 
参考記事:
https://www.cnblogs.com/hanmk/p/8997786.html
https://www.cnblogs.com/LXP-Never/p/11386933.html
https://www.jianshu.com/p/5dd0208f87be
https://www.cnblogs.com/lanuage/p/9125586.html
https://blog.csdn.net/chinwuforwork/article/details/77725959
https://www.jianshu.com/p/fe7329619edd