2017-02-01 6 views
0

私の前の質問(logging in to website using requests)はすばらしい答えを生み出し、私は多くのサイトを削ることができました。しかし、私が今作業しているサイトは難しいです。私はそれがウェブサイトのバグか意図的に行われたものかどうかはわかりませんが、私はそれを掻き取ることはできません。リクエストを使用してウェブサイトにログインする

heres私のコードの一部です。

import requests 
import re 
from lxml import html 
from multiprocessing.dummy import Pool as ThreadPool 
from fake_useragent import UserAgent 
import time 
import ctypes 

global FileName 

now = time.strftime('%d.%m.%Y_%H%M%S_') 
FileName=str(now + "Scraped data.txt") 
fileW = open(FileName, "w") 
url = open('URL.txt', 'r').read().splitlines() 
fileW.write("URL Name SKU Dimensions Availability MSRP NetPrice") 
fileW.write(chr(10)) 
count=0 
no_of_pools=14 
r = requests.session() 

payload = { 
    "email":"I cant give them out in public", 
    "password":"maybe I can share it privately if anyone can help me with it :)", 
    "redirect":"true" 
    } 
rs = r.get("https://checkout.reginaandrew.com/store/checkout.ssp?fragment=login&is=login&lang=en_US&login=T#login-register") 
rs = r.post("https://checkout.reginaandrew.com/store/checkout.ssp?fragment=login&is=login&lang=en_US&login=T#login-register",data=payload,headers={'Referer':"https://checkout.reginaandrew.com/store/my_account.ssp"}) 
rs = r.get("https://checkout.reginaandrew.com/store/my_account.ssp") 
tree = html.fromstring(rs.content) 
print(str(tree.xpath("//*[@id='site-header']/div[3]/nav/div[2]/div/div/a/@href"))) 

問題は、私は手動でログインしてアドレスバーに入力することで、製品のURLを開いた場合でも、ブラウザはそれがログインしていますことを認識していないということである。

周りの唯一の方法つまり、リンクをクリックすると、ログイン後にリダイレクトされます。ブラウザがログインしたことを認識すると、特定のURLを開いてすべての情報を表示できます。

私が遭遇した障害は、のリンクが変更されたことです。コード内のprintステートメント

print(str(tree.xpath( "// * [@ id = 'site-header']/div [3]/nav/div [2]/div/div/a/@ href "))))

これはリンクを抽出したはずですが、何も返しません。

EDIT(ホワイトスペースを取り去る)rs.contentは次のとおりです。

<!DOCTYPE html><html lang="en-US"><head><meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <link rel="shortcut icon" href="https://checkout.reginaandrew.com/c.1283670/store/img/favicon.ico" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> 
    <title></title> 
    <!--[if !IE]><!--> 
    <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css/checkout.css?t=1484321730904"> 
    <!--<![endif]--> 
    <!--[if lte IE 9]> 
    <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css_ie/checkout_2.css?t=1484321730904"> 
    <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css_ie/checkout_1.css?t=1484321730904"> 
    <link rel="stylesheet" href="https://checkout.reginaandrew.com/c.1283670/store/css_ie/checkout.css?t=1484321730904"> 
    <![endif]--> 
    <!--[if lt IE 9]> 
    <script src="/c.1283670/store/javascript/html5shiv.min.js"></script> 
    <script src="/c.1283670/store/javascript/respond.min.js"></script> 
    <![endif]--> 
    <script>var SC=window.SC={ENVIRONMENT:{jsEnvironment:typeof nsglobal==='undefined'?'browser':'server'},isCrossOrigin:function(){return 'checkout.reginaandrew.com'!==document.location.hostname},isPageGenerator:function(){return typeof nsglobal!=='undefined'},getSessionInfo:function(key){var session=SC.SESSION||SC.DEFAULT_SESSION||{};return key?session[key]:session},getPublishedObject:function(key){return SC.ENVIRONMENT&&SC.ENVIRONMENT.published&&SC.ENVIRONMENT.published[key]?SC.ENVIRONMENT.published[key]:null}};function loadScript(data){'use strict';var element;if(data.url){element='<script src="'+data.url+'"></'+'script>'}else{element='<script>'+data.code+'</'+'script>'}if(data.seo_remove){document.write(element)}else{document.write('</div>'+element+'<div class="seo-remove">')}} 
</script> 
</head> 
    <body> 
    <noscript> 
     <div class="checkout-layout-no-javascript-msg"> 
     <strong>Javascript is disabled on your browser.</strong><br> 
     To view this site, you must enable JavaScript or upgrade to a JavaScript-capable browser. 
     </div> 
    </noscript> 
    <div id="main" class="main"></div> 
    <script>loadScript({url: '/c.1283670/store/checkout.environment.ssp?lang=en_US&cur=USD&t=' + (new Date().getTime())}); 
    </script> 
    <script>if (!~window.location.hash.indexOf('login-register') && !~window.location.hash.indexOf('forgot-password') && 'login-register'){window.location.hash = 'login-register';} 
    </script> 
    <script src="/c.1283670/store/javascript/checkout.js?t=1484321730904"> </script> 
    <script src="/cms/2/assets/js/postframe.js"></script> 
    <script src="/cms/2/cms.js"></script> 
    <script>SCM['SC.Checkout'].Configuration.currentTouchpoint = 'login';</script> 
</body> 
</html> 
+1

値を印刷してデバッグします'rs.content'の結果として得られるツリーは、あなたが思うものではないかもしれません。次に、あなたのxpathの部分が一致するかどうか試してみましょう: '' // * [@ id = 'site-header'] ''、 '' // * [@ id = 'site-header']/div [3] "、等、あなたのxpathが一致しないところを見てください。 – pbuck

+0

@Peter私はそれをしました。質問を編集して結果を投稿します。私が期待したことは結果にありません。クイック返信をしてくれてありがとう! –

+0

@Peter Javascriptがないので動作しませんか? –

答えて

1

擦り傷部位は硬くてもかまいません。

サイトによっては整形式のHTMLを送信するものがあります。必要なのは、その中でデータ/リンクを検索することです。

サイトによっては、不適切な形式のHTMLが送信されることがあります。ブラウザは、長年にわたり、「悪い」HTMLを除いてかなり美しくなり、HTMLが何をしようとしているのかを解釈するために最善を尽くす。欠点は、HTMLを解読するために厳密なパーサを使用している場合に失敗する可能性があることです。ファジーデータで作業できるものが必要です。または、正規表現を使用して無差別な力。 xpathの使用は、生成されたHTMLが整形式のXML文書を作成する場合にのみ機能します。

一部のサイト(最近はますます)は、HTML、JavaScript、JSON、XMLなど、ブラウザに何かを送信します。ブラウザは最終的なHTML(DOM)を構築し、それをユーザに表示します。それがここにあります。

あなたは最終的なDOMを掻き出そうとしますが、それはサイトがあなたに送るものではありません。 (例えば、あなたが望むリンクは、{books: [{title: "Graphs of Wrath", code: "a88kyyedkgH"}]} ==>example.com/catalog?id=a88kyyedkgHを送信するJSONから決めることができます)、またはブラウザー(例えば、Seleniumを使用して)をスクラップして、ブラウザ、すべての要求を行うDOMを構築して、あなたは結果をこすりそれは遅くなりますが、それは動作します

それはハードを取得、検討してください。。

  1. サイトは、おそらくあなたを望んでいませんこれを行うには&(私たち)ウェブマスターには、あなたの人生をもっと難しくて難しくする多くのツールがあります。
  2. また、 d APIはあなたが情報の大部分を得るために設計されています(Amazonは素晴らしい例です)。 (私の推測では、Amazonはそれがすべてのウェブスクレイパーに勝つことはできないと知っているので、メインサーバー上で多くのリソースを消費しない方法を提供する方が良いです。)
+0

非常によく説明された答えです。ありがとうトーン!!!! –

+0

結局、私はセレンと一緒に行かなければならなかった。私は本当にしたくなかったが、それは私が働くことができる唯一のものだ。 –

+0

セレンからログインし、クッキー[または何か他のもの]をリクエストに渡してからリクエストからスクラップすることができますか? –

0

これはかなりトリッキーになるだろうし、あなたがエミュレートできるようにするSeleniumのような、より洗練されたツールを使用する場合がありますブラウザ。

それ以外の場合は、サイトにログインするために必要なCookieやその他のタイプの認証を調べる必要があります。舞台裏で渡されているすべてのクッキーに注意してください。ここにログインできるようにユーザー名とパスワードを入力するだけでは簡単ではありません。 Webブラウザで[ネットワーク]タブを表示すると、どの情報が渡されているかを確認できます。

enter image description here

最後に、あなたはセレンは「低迷」かもしれないと心配している場合(それがある - 結局、それはブラウザを開いて、物事をクリックすると、ユーザーがやっているのと同じことをやっています)、 CasperJSのようなものを試すことができますが、これを使って何かを実装する学習曲線は、Seleniumよりもはるかに厳しいです。まず、Seleniumを試してみてください。

+0

リクエストですべてをやることは、私にはあまりにも大きかった。私はかなりの知識を持った人がそれを達成できると思います。しかし結局私はセレンと一緒に行かなければならなかった。ありがとう! –

関連する問題