2

以下に示すこれらのページをスクレイピングしたいのですが、認証が必要です。以下のコードを試してみましたが、スクレイピングされたページは 0 と表示されます。何が問題なのか理解できません。誰か助けてください..

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.spiders.init import InitSpider
from scrapy.http import Request, FormRequest
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import Rule
from kappaal.items import KappaalItem

class KappaalCrawler(InitSpider):
    name = "initkappaal"
    allowed_domains = ["http://www.kappaalphapsi1911.com/"]
    login_page = 'http://www.kappaalphapsi1911.com/login.aspx'
    #login_page = 'https://kap.site-ym.com/Login.aspx'
    start_urls = ["http://www.kappaalphapsi1911.com/search/newsearch.asp?cdlGroupID=102044"]

    rules = ( Rule(SgmlLinkExtractor(allow= r'-\w$'), callback='parseItems', follow=True), )
    #rules = ( Rule(SgmlLinkExtractor(allow=("*", ),restrict_xpaths=("//*[contains(@id, 'SearchResultsGrid')]",)) , callback="parseItems", follow= True), )

    def init_request(self):
        """This function is called before crawling starts."""
        return Request(url=self.login_page, callback=self.login)

    def login(self, response):
        """Generate a login request."""
        return FormRequest.from_response(response,
                    formdata={'u': 'username', 'p': 'password'},
                    callback=self.check_login_response)

    def check_login_response(self, response):
        """Check the response returned by a login request to see if we are
        successfully logged in.
        """
        if "Member Search Results" in response.body:
            self.log("Successfully logged in. Let's start crawling!")
            # Now the crawling can begin..
            self.initialized()
        else:
            self.log("Bad times :(")
            # Something went wrong, we couldn't log in, so nothing happens.

    def parseItems(self, response):
        hxs = HtmlXPathSelector(response)
        members = hxs.select('/html/body/form/div[3]/div/table/tbody/tr/td/div/table[2]/tbody')
        print members
        items = []
        for member in members:
            item = KappaalItem()
            item['Name'] = member.select("//a/text()").extract()
            item['MemberLink'] = member.select("//a/@href").extract()
            #item['EmailID'] = 
            #print item['Name'], item['MemberLink']
            items.append(item)
        return items

スクレーパーを実行した後、以下の応答を得ました

2013-01-23 07:08:23+0530 [scrapy] INFO: Scrapy 0.16.3 started (bot: kappaal)
2013-01-23 07:08:23+0530 [scrapy] DEBUG: Enabled extensions: FeedExporter, LogStats,      TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2013-01-23 07:08:23+0530 [scrapy] DEBUG: Enabled downloader middlewares:HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats
2013-01-23 07:08:23+0530 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2013-01-23 07:08:23+0530 [scrapy] DEBUG: Enabled item pipelines:
2013-01-23 07:08:23+0530 [initkappaal] INFO: Spider opened
2013-01-23 07:08:23+0530 [initkappaal] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2013-01-23 07:08:23+0530 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2013-01-23 07:08:23+0530 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2013-01-23 07:08:26+0530 [initkappaal] DEBUG: Crawled (200) <GET https://kap.site-ym.com/Login.aspx> (referer: None)
2013-01-23 07:08:26+0530 [initkappaal] DEBUG: Filtered offsite request to 'kap.site-ym.com': <GET https://kap.site-ym.com/search/all.asp?bst=Enter+search+criteria...&p=P%40ssw0rd&u=9900146>
2013-01-23 07:08:26+0530 [initkappaal] INFO: Closing spider (finished)
2013-01-23 07:08:26+0530 [initkappaal] INFO: Dumping Scrapy stats:
        {'downloader/request_bytes': 231,
         'downloader/request_count': 1,
         'downloader/request_method_count/GET': 1,
         'downloader/response_bytes': 23517,
         'downloader/response_count': 1,
         'downloader/response_status_count/200': 1,
         'finish_reason': 'finished',
         'finish_time': datetime.datetime(2013, 1, 23, 1, 38, 26, 194000),
         'log_count/DEBUG': 8,
     'log_count/INFO': 4,
     'request_depth_max': 1,
     'response_received_count': 1,
     'scheduler/dequeued': 1,
     'scheduler/dequeued/memory': 1,
     'scheduler/enqueued': 1,
     'scheduler/enqueued/memory': 1,
     'start_time': datetime.datetime(2013, 1, 23, 1, 38, 23, 542000)}
2013-01-23 07:08:26+0530 [initkappaal] INFO: Spider closed (finished)

前述のように開始 URL を認証および解析しない理由がわかりません。

4

4 に答える 4

1

また、ログイン時にセッションがログインしたままになるように、Cookieが有効になっていることを確認してください

COOKIES_ENABLED = True
COOKIES_DEBUG = True

あなたのsettings.pyファイルで

于 2013-01-24T12:21:19.060 に答える
1

私は次のように修正しました:

def start_requests(self):
    return self.init_request()

def init_request(self):
    return [Request(url=self.login_page, callback=self.login)]

def login(self, response):
    return FormRequest.from_response(response, formdata={'username': 'username', 'password': 'password'}, callback=self.check_login_response)

def check_login_response(self, response):
    if "Logout" in response.body:
        for url in self.start_urls:
            yield self.make_requests_from_url(url)
    else:
        self.log("Could not log in...")

start_requests をオーバーロードすることで、ログイン プロセスが正しく行われるようにしてから、スクレイピングを開始します。

私はこれで CrawlSpider を使用しており、完全に動作します! それが役に立てば幸い。

于 2013-01-24T13:10:59.927 に答える
0

これはあなたが求めている反応ではないかもしれませんが、私はあなたの痛みを感じています...

この同じ問題に遭遇し、Scrapy にはドキュメントが不十分だと感じました。ログインにmechanizeを使用することになりました.scrapyでそれを理解した場合、Mechanizeは非常に簡単です.

于 2013-01-23T21:57:24.183 に答える
0

さて、私が見ることができるいくつかの問題があります。ただし、ユーザー名とパスワードが原因でコードをテストできません。テスト目的で使用できるダミー アカウントはありますか?

  1. InitSpider はルールを実装していないため、問題にはなりませんが、削除する必要があります。
  2. check_login_response何かを返す必要があります。

ウィット:

def check_login_response(self, response):
    """Check the response returned by a login request to see if we are
    successfully logged in.
    """
    if "Member Search Results" in response.body:
        self.log("Successfully logged in. Let's start crawling!")
        # Now the crawling can begin..
        return self.initialized()
    else:
        self.log("Bad times :(")
        # Something went wrong, we couldn't log in, so nothing happens.
        return
于 2013-01-23T17:11:41.800 に答える