2017-02-01 7 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 (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, но поскольку это не то, что сайт отправляет вам. Таким образом, вам нужно либо очистить то, что они отправляют (например, вы выяснили, что нужную ссылку можно определить из JSON, которую они отправляют {books: [{title: "Graphs of Wrath", code: "a88kyyedkgH"}]} ==>example.com/catalog?id=a88kyyedkgH. Или вы очищаете браузер (например, используя Selenium), позволяя .. браузер делать все запросы, застроить DOM, а затем вы скрести результат это медленнее, но это работает

Когда становится трудно, считают:

  1. сайт, вероятно, не хотят, чтобы вы чтобы делать это & (мы) У веб-мастеров есть столько же инструментов, чтобы сделать вашу жизнь все труднее и труднее.
  2. В качестве альтернативы может быть опубликован d API, разработанный для вас, чтобы получить большую часть информации (Amazon - отличный пример). (Я думаю, Amazon знает, что он не может победить всех веб-сканеров, поэтому им лучше предложить способ, который не потребляет столько ресурсов на их основных серверах.)
+0

Очень хорошо описан ответ. Благодаря тонну!!!! –

+0

В конце концов мне пришлось пойти с селеном.Я действительно не хотел, но это единственное, что я мог бы получить для работы. –

+0

Может ли что-то вроде входа в систему из селена и передачи файлов cookie [или что-то еще] в запросы, а затем списания с запросов? –

0

Это будет довольно сложно, и вы можете использовать более сложный инструмент, как Selenium, чтобы иметь возможность эмулировать браузер.

В противном случае вам необходимо будет выяснить, какие файлы cookie или другой тип аутентификации необходимы для входа на сайт. Обратите внимание на все файлы cookie, которые передаются за кулисами - это не так просто, как просто ввести имя пользователя/пароль, чтобы иметь возможность войти здесь. Вы можете увидеть, какая информация передается, просмотрев вкладку «Сеть» в вашем веб-браузере.

enter image description here

Наконец, если вы обеспокоены тем, что селен может быть «вялой» (это - в конце концов, он делает то же самое, пользователь будет делать при открытии браузера и нажав вещи), то вы можете попробовать что-то вроде CasperJS, хотя кривая обучения для реализации чего-то с этим довольно круче, чем Selenium - вы можете сначала попробовать Selenium.

+0

Делать все с запросами было слишком много для меня. Я думаю, что кто-то с честным знанием мог бы это сделать. Но в конце концов мне пришлось пойти с селеном. Благодаря! –