導入
- データはscrapyフレームワークを通じてクロール特定のウェブサイトを作るためにすると、多くの場合、彼らの要求は直接scrapy URLを送信している場合、動的データは起こるページがロードされたときに発生した、絶対にデータ値の動的ロードのうち、その一部を取得していません。しかし、我々はその観測を発見し、それがブラウザのURLを介して実行される動的ロードに対応するリクエストデータをロードされます。我々はまた、動的scrapyにアウトロードされたデータを取得したいのであれば、あなたは動的にロードからのデータ値を、その要求がブラウザオブジェクトによって送信されたブラウザオブジェクトを作成、取得するために、セレンを使用する必要があります。
詳細は本日
1.ケーススタディ:
国内、国際的、軍事の網易のニュースの下でクロールニュースデータ、無人航空機部門:需要 -
- 需要分析:あなたは国内の国内対応するページを入力して、ハイパーリンクをクリックすると、プログラムで直接URLに対する要求は、ニュースデータの動的ロード未満を得ることであるならば、ニュースのデータを動的にロードされている表示するには、現在のページを検索しますA。私たちは、あなたが動的にロードされたニュースデータを、そのオブジェクトにURLを要求し、ブラウザオブジェクトをインスタンス取得する必要があり、セレンを使用します。
解析に用いた2.selenium scrapy原理:
ときエンジンは、エンジンに提出されたパッケージ、サブスパイダーにエンジンレスポンスに応じて、ダウンロードするためのダウンロードページデータをダウンロードし、ページデータにダウンロードするための要求に対応するURL国内部門を提出しました。オブジェクトスパイダーに格納されたページ応答データは、データが動的にロードされた場合の一切知らせを受けていません。動的にロードされたデータのニュースを取得するには、動的ロードデータの中からニュースを運ぶために変更され内部に格納されているそのページのデータを、カット改ざん、ダウンロードのミドルウェアでダウンロードするためにエンジンの応答に応じて、オブジェクトを迎撃するために提出する必要があります、オブジェクトは、クモ解析操作に最終応答改ざんされています。
scrapyのプロセスで3.seleniumの使用:
- コンストラクタクローラオーバーライドファイル、セレン(ブラウザは、一度だけのオブジェクトをインスタンス化されるため)プロセスでインスタンス化するブラウザ・オブジェクトを使用して
- 爬虫類のファイルは(自己、クモ)メソッドを閉じて書き直し、その内部オブジェクトでブラウザを閉じます。この方法は、爬虫類の最後に呼び出されます
- process_responseミドルウェアをダウンロードする方法、そのページに保存された応答データを傍受して改ざんするレスポンスオブジェクトのメソッドを書き換え
- 設定ファイルでダウンロードしたミドルウェアを開きます。
例4:
#1 1.spiderは、ファイル のインポートScrapyを から wangyiPro.items インポートWangyiproItem からセレンインポートwebdriverをする クラスWangyiSpider(scrapy.Spider): 名前を = ' wangyi ' #allowed_domains = [ 'www.xxx.con'] start_urls = [ " HTTP:// www.xxx.con / 「] #は、ブラウザが一度だけ実行されるオペレーティング・インスタンス化 (ブロ= webdriver.Chrome executable_path = 」chromedriver.exe ' ) のURL = [] #最終板5は、対応するURLに格納されている DEFパース(自己、応答): li_list = response.xpath(" [1] // * [@ ID = "index2016_wrap"] /のdiv / divの[2] / DIV [2] / DIV [2] / DIV [2] / DIV / UL /リチウム' ) のためのインデックスで、[3,4,6,7,8 ] のLi = li_list [インデックス] NEW_URL = li.xpath(' ./a/@herf ' ).extract_first() 自己。 urls.append(NEW_URL) #送信要求URLに対応する5つのセクションの 収率を scrapy.Request(URL = NEW_URL、コールバック= self.parse_news) #ニュースに対応する情報データセクションを解析するためにのみ[解析タイトル] DEF = response.xpath( parse_news(セルフ、応答): div_list ' // divの[クラス@ = "ndi_main"] / DIV ' ) のためのdiv でdiv_list: タイトル = div.xpath(' [1] ./div/divの/ H3 / A /テキスト()' ().extract_first ) news_detail_url = div.xpath(「./div/div[1]/h3/a/@href 」).extract_first() #インスタンス化された項目オブジェクト、オブジェクトに格納されているタイトルとコンテンツアイテムに解決される アイテム= WangyiproItem () 項目[ 「タイトル」 ] = タイトル #情報ページのURLを手動でニュースコンテンツへのアクセス要求 利回りをscrapy.Request(URL = news_detail_url、コールバック= self.parse_detail、メタ= { ' アイテム' :アイテム}) デフparse_detail(自己、応答): アイテム = response.meta [ ' アイテム' ] #1 通过応答解析出新闻内容 のコンテンツ= response.xpath(' // // divのテキスト()[ID = "endText" @] ' ).extract() コンテンツ = '' .join(コンテンツ) アイテム[ ' コンテンツ' ] = コンテンツ 収率項目 DEF 近いです(自己、クモ): #爬虫類の終了後、閉じブラウザは、メソッドの呼び出し、 印刷を(「爬虫類全体的なエンド~~~~~~~~~~~~~~~~~~~ 」) self.bro.quit() ------ -------------------------------------------------- -------------------------------- #2.itemsファイル のインポートscrapyの クラスWangyiproItem(scrapy.Item): #インクルードがでDEFINEここ壁紙あなたのようなフィールドのアイテム: #1 名= scrapy.Field() タイトル= scrapy.Field() コンテンツ = scrapy.Field() --------------------- -------------------------------------------------- ----------------- #3.middlewaresファイル から scrapyインポート信号 から scrapy.http インポートHtmlResponse から時間をインポートSLEEPの クラスWangyiproDownloaderMiddleware(オブジェクト): DEF process一(セルフ、リクエスト、スパイダー): 返すなし DEFのprocess_response(セルフ、要求、応答、スパイダーを): #は応答性でどのオブジェクトを決定5プレート、被処理物に応答する場合 IF response.url でspider.urls: #1 取得ブラウザ爬虫類で定義された 仲間= spider.bro bro.get(response.url) bro.execute_script('window.scrollToは(0、document.body.scrollHeight)' ) SLEEP( 1 ) bro.execute_script(' window.scrollToは(0、document.body.scrollHeight)' ) SLEEP( 1 ) bro.execute_script(' window.scrollToは( 0、document.body.scrollHeight)' ) SLEEP( 1 ) bro.execute_script(' window.scrollToは(0、document.body.scrollHeight)" ) SLEEP( 1 ) #は、ページがデータのニュースソースのデータを運ぶ取得 page_text =bro.page_source #实例化一个新的响应对象 new_response = HtmlResponse(URL = response.url、ボディ= page_text、エンコード= ' UTF-8 '、要求= 要求) 戻りnew_response 他: 戻り応答 デフにprocess_exception(自己、要求、例外、クモ): パス -------------------------------------------- -------------------------------------------- #4.pipelines文件クラスWangyiproPipeline(オブジェクト): DEF process_item(自己、アイテム、クモ): プリント(アイテム) 返す項目を ------------------------------------------------ ---------------------------------------- #5.setting文件 BOT_NAME = ' wangyiPro ' SPIDER_MODULES = [ ' wangyiPro.spiders ' ] NEWSPIDER_MODULE = ' wangyiPro.spiders ' USER_AGENT = ' のMozilla / 5.0(Windows NTの10.0; Win64の、のx64)のAppleWebKit / 537.36(ヤモリ様KHTML)クローム/ 76.0.3809.132サファリ/ 537.36 ' ROBOTSTXT_OBEY = Falseの DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMiddleware ':543 、 } ITEM_PIPELINES = { ' wangyiPro.pipelines.WangyiproPipeline ':300 、 } 、LOG_LEVEL、 = ' ERROR '