2017-01-20 6 views
0

ウェブサイトからcsvファイルをダウンロードするウェブスクラップを構築しています。すべてのファイルをダウンロードするには、複数のユーザーアカウントにログインする必要があります。私はまた、各ユーザーアカウントのためにこれらのファイルに到達するためにいくつかの階層をナビゲートする必要があります。私はこの作業を完了するためにScrapyスパイダーを使用することに決めました。ここで私が持っているコードは、これまでのところです:スクレイピーを使用してHFSをナビゲートするベストプラクティス

私はその後、各応答内のすべてのhrefのリンクを見つけることによって、Webページをナビゲート

def start_requests(self): 
    yield scrapy.Request(url = "https://external.lacare.org/provportal/", callback = self.login) 

def login(self, response): 
    for uname, upass in login_info.items():  
     yield scrapy.FormRequest.from_response(
      response, 
      formdata = {'username': uname, 
         'password': upass, 
         }, 
      dont_filter = True, 
      callback = self.after_login 
      ) 

辞書にユーザー名とパスワードの情報を格納します。

次に、ページの各hrefをクロールし、応答を確認して続けることができるかどうかを確認します。コードのこの部分は私にとっては過度だと思われますが、私はそれにどのように接近すべきかわかりません。

def select_year(self, response): 
    if '>2017' in str(response.body): 
     hxs = scrapy.Selector(response) 
     all_links = hxs.xpath('*//a/@href').extract() 
     for link in all_links: 
      url_join = response.urljoin(link) 
      yield scrapy.Request(
       url = url_join, 
       dont_filter = True, 
       callback = self.select_elist 
       ) 
    return 

def select_elist(self, response): 
    if '>Elists' in str(response.body): 
     hxs = scrapy.Selector(response) 
     all_links = hxs.xpath('*//a/@href').extract() 
     for link in all_links: 
      url_join = response.urljoin(link) 
      yield scrapy.Request(
       url = url_join, 
       dont_filter = True, 
       callback = self.select_company 
       ) 

すべてがうまくいきますが、私が言ったように、ページ上の各hrefをクロールするのは過度に思われます。私はこのWebサイトのスクリプトをSeleniumに書いて、select_by_partial_link_text()メソッドを使って正しいHREFを選択することができました。私はscrapyのそれに匹敵する何かを探しましたが、xpathとcssの名前にscrip navigationがstricklyに基づいているようです。

Scrapyはこのシナリオでどのように使用されるのですか?掻き取り工程の冗長性を少なくするためにできることはありますか?

これは私の最初の作業用のスパイダーですので、簡単に私に行ってください!

答えて

1

あなたがリンクテキスト内の特定の部分文字列とのリンクのみを抽出する必要がある場合は、次のXPathでLinkExtractorを使用することができます。LinkExtractorとして

LinkExtractor(restrict_xpaths='//a[contains(text(), "substring to find")]').extract_links(response) 

はScrapy内のリンクを抽出して処理するための適切な方法です。

ドキュメント:https://doc.scrapy.org/en/latest/topics/link-extractors.html

+0

が、これは私が探していたまさにです、ありがとう –

関連する問題