2016-07-27 10 views
0

私は掻き出して解析する方法を見つけようとしています。ページでログインしてください。 これらの例のリンクは、私が解析したい署名付きのものからアクセス可能です。ログイン後にページを削る方法

#http://example.com/seller/demand/?id=305554 
#http://example.com/seller/demand/?id=305553 
#http://example.com/seller/demand/?id=305552 
#.... 

これらのリンクのそれぞれを開いて解析できるスパイダーを作成したいとします。 私はのいずれか1つだけを開いて解析できる別のクモを作成しました

他のリンクでより多くのリクエストを呼び出すために「for」または「while」を作成しようとしたとき、を返すことができないためではなく、エラーに戻ります。私もリンク抽出を試みたが、それは私のためにはうまくいかなかった。

はここに私のコードです:条件「が」私が最初にここに入れて、なぜそれが「STAT」を含むURLのページを返すに

#!c:/server/www/scrapy 
    # -*- coding: utf-8 -*- 
    from scrapy import Spider 
    from scrapy.selector import Selector 
    from scrapy.http import FormRequest 
    from scrapy.http.request import Request 
    from scrapy.spiders import CrawlSpider, Rule 
    from array import * 
    from stack.items import StackItem 
    from scrapy.linkextractors import LinkExtractor 

    class Spider3(Spider): 
     name = "Spider3" 
     allowed_domains = ["example.com"] 
     start_urls = ["http://example.com/login"] #this link lead to login page 

私が署名しています、それはです。 私がサインインしているとき、私はの1つのリンクを要求し、関数parse_itemsを呼び出します。

 def parse(self, response): 
       #when "stat" is in url it means that I just signed in 
       if "stat" in response.url:    
        return Request("http://example.com/seller/demand/?id=305554", callback = self.parse_items) 

      else: 
       #this succesful login turns me to page, it's url contains "stat" 
       return [FormRequest.from_response(response, 
         formdata={'ctl00$ContentPlaceHolder1$lMain$tbLogin': 'my_login', 'ctl00$ContentPlaceHolder1$lMain$tbPass': 'my_password'},callback=self.parse)] 

機能parse_itemsは、単に一つの所望のページから所望のコンテンツを解析:

 def parse_items(self,response): 
       questions = Selector(response).xpath('//*[@id="ctl00_ContentPlaceHolder1_cRequest_divAll"]/table/tr') 
       for question in questions: 
        item = StackItem() 
        item['name'] = question.xpath('th/text()').extract()[0] 
        item['value'] = question.xpath('td/text()').extract()[0] 
        yield item 

をあなたは私が各セッションで複数ページを開き、解析するために、このコードを更新するために助けてくださいことはできますか? リクエストごとに何度もサインインする必要はありません。

+0

こんにちはとStackOverflowのために歓迎!より良い質問や良いタイトル、悪いタイトルなどの例については、このチュートリアルを読んでください。stackoverflow.com/help/how-to-ask - 他のすべてのものはよく見えます。 – Jurik

+0

あなたがここで行う必要があるのは、次のページのURLを見つけて、あなたの 'parse_items'メソッドで要求します。例えば'yield Request(next_page、callback = self.parse_items)'です。セッションは、おそらくクッキーに依存しており、その治療は単独でそれを管理しています。あなたが掻き集めているもののURLを提供していない場合は、それ以外には本当にお手伝いできません。 – Granitosaurus

+0

ログインが成功しましたか? –

答えて

0

セッションは、Cookieに依存している可能性が高く、それ自体で管理しています。私は:

def parse_items(self,response): 
    questions = Selector(response).xpath('//*[@id="ctl00_ContentPlaceHolder1_cRequest_divAll"]/table/tr') 
    for question in questions: 
     item = StackItem() 
     item['name'] = question.xpath('th/text()').extract()[0] 
     item['value'] = question.xpath('td/text()').extract()[0] 
     yield item 
    next_url = '' # find url to next page in the current page 
    if next_url: 
     yield Request(next_url, self.parse_items) 
     # scrapy will retain the session for the next page if it's managed by cookies 
0

私は現在同じ問題に取り組んでいます。私はInitSpiderを使用しているので、__init__init_requestを上書きすることができます。最初はただのカスタムものの初期化のためであり、実際のマジックは私のinit_requestで起こる:

def init_request(self): 
    """This function is called before crawling starts.""" 

    # Do not start a request on error, 
    # simply return nothing and quit scrapy 
    if self.abort: 
     return 

    # Do a login 
    if self.login_required: 
     # Start with login first 
     return Request(url=self.login_page, callback=self.login) 
    else: 
     # Start with pase function 
     return Request(url=self.base_url, callback=self.parse) 

私のログインはポスト値とdictあるこの

def login(self, response): 
    """Generate a login request.""" 

    self.log('Login called') 
    return FormRequest.from_response(
     response, 
     formdata=self.login_data, 
     method=self.login_method, 
     callback=self.check_login_response 
    ) 

self.login_dataのように見えます。

私はまだpythonとscrapyの初心者ですので、間違った方法でやっているかもしれません。とにかく、これまでのところ私はgithubで見ることができる働くバージョンを作りました。

HTH:

https://github.com/cytopia/crawlpy

関連する問題