2017-06-13 3 views
0

私は反復的に '次のページ'のクロールのためのスクリーニングクローラーを作成しています。 私のコードは次のようである:予期せずいくつかのページをスキップしました

def parse(self, response): 

    while self.current_page<=self.total_page: 

     self.current_page = int(self.selector.css("something").extract()[-1]) 

     for post_node in self.selector.css("div.info-column"): 
      yield { 
       "location": post_node.css("something").extract(), 
      } 
     logging.info("************** now page is %d **************", self.current_page) 
     logging.info("********** one page done,Going to next **********") 

     try: 

      self.next.send_keys('\n') 

私はコードは各ページの情報をクロールし、次のページをクリックすると予想しました。しかし、印刷されたデバッグ情報は、いくつかのページを非常に頻繁にスキップしたことを示しています。

何か理由が考えられますか?

答えて

0

(謝罪...十分な担当者がいないため、あなたの質問にはまだコメントを投稿できません) コードやログを投稿してください。設定に基づいて相違点が非常に多くあり、診断するためにはより多くの情報が必要です。ここではあまり相互作用していない他のコードがたくさんあります。

あなたのlogging.infoステートメントが実行されると、self.current_pageが間違っているか誤解を招く可能性があります。自己はスパイダーオブジェクトです。他のコードがparse()によって処理されるリンクを生成すると、ロギングステートメントの実行時にcurrent_pageが失効/再割り当てされます。

私はあなたのプリントが収率の後であることに気付きました。 yieldは、その機能を一時停止し、再びその繰り返しを繰り返した後にその場所から再開します。おそらく、あなたはあなたのlogging.infoがページの実際の処理とは別に起こっているために誤解されているかもしれません。

治療用ダウンローダーキューは、LIFO(Last In First Out)です。したがって、最初のparse()呼び出しを反復しようとする前に、新しいものを処理します。

私はまた、あなたが送信は「\ n」はボンネットの下に新しい「ページの」ロードAJAXyのウェブページ上で動作しようとしている推測していますか?

最初のページを読み込み、current_pageを設定し、新しいアイテムを生成し、新しいアイテムを処理し、新しいリンクを表示されていない他のルールやメカニズムで作成し、それらのリンクでparseを呼び出し、current_pageを設定するそれらの新しいページ番号、...たくさんの他のものに...、最終的に、元のparse()呼び出しは次の項目であることを要求され、yield文から再開し、 "now page is%d" 。

私の答えは、おそらく理由は情報の欠如は必ずしも真実ではない事を想定し...しかし、少なくともあなたにかむに何かを与えた場合にされます。

+0

ご協力いただきありがとうございます。数時間のデバッグの後。私は最終的に私がxpathロケータに切り替えるときにそれを動作させる。私はselector.css関数のコメントを読むとき。 cssセレクターがxpathへの翻訳者であると言われました。私はそれがCSSセレクターの安定性に起因するのかどうかは本当に分かりません。しかし、xpathは常に安定して動作します。 – Jimmy

関連する問題