2016-05-15 12 views
-4

Ich verstehe im Allgemeinen, wie man eine POST Anfrage mit urllib2 (Codierung der Daten, etc.), aber das Problem ist, alle Tutorials online verwenden völlig nutzlos erfunden Beispiel URLs zu zeigen, wie tun Sie es (someserver.com, coolsite.org, usw.), also kann ich das spezifische html nicht sehen, das dem Beispielcode entspricht, den sie benutzen. Selbst python.org eigene tutorial ist in dieser Hinsicht völlig nutzlos.Python urllib2 oder Anfragen Post-Methode

Ich brauche eine POST Anforderung an diese URL zu machen:

https://patentscope.wipo.int/search/en/search.jsf 

Der relevante Teil des Codes ist dies (glaube ich):

<form id="simpleSearchSearchForm" name="simpleSearchSearchForm" method="post" action="/search/en/search.jsf" enctype="application/x-www-form-urlencoded" style="display:inline"> 
<input type="hidden" name="simpleSearchSearchForm" value="simpleSearchSearchForm" /> 
<div class="rf-p " id="simpleSearchSearchForm:sSearchPanel" style="text-align:left;z-index:-1;"><div class="rf-p-hdr " id="simpleSearchSearchForm:sSearchPanel_header"> 

Oder vielleicht ist es das:

<input id="simpleSearchSearchForm:fpSearch" type="text" name="simpleSearchSearchForm:fpSearch" class="formInput" dir="ltr" style="width: 400px; height: 15px; text-align: left; background-image: url(&quot;https://patentscope.wipo.int/search/org.richfaces.resources/javax.faces.resource/org.richfaces.staticResource/4.5.5.Final/PackedCompressed/classic/org.richfaces.images/inputBackgroundImage.png&quot;); background-position: 1px 1px; background-repeat: no-repeat;"> 

Wenn ich als Suchbegriff JP2014084003 codieren möchte, was ist der entsprechende Wert im html zu verwenden? input id? name? value?

Addendum: this answer beantwortet meine Frage nicht, weil es nur die Informationen wiederholt, die ich bereits in der Python-Dokumentseite betrachtet habe.

UPDATE:

ich this gefunden und versuchte dort den Code aus, und zwar:

import requests 

headers = {'User-Agent': 'Mozilla/5.0'} 
payload = {'name':'simpleSearchSearchForm:fpSearch','value':'2014084003'} 
link = 'https://patentscope.wipo.int/search/en/search.jsf' 
session = requests.Session() 
resp = session.get(link,headers=headers) 
cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(session.cookies)) 
resp = session.post(link,headers=headers,data=payload,cookies =cookies) 

r = session.get(link) 

f = open('htmltext.txt','w') 

f.write(r.content) 

f.close() 

ich eine erfolgreiche Antwort erhalten (200), aber die Daten, ist wieder einmal einfach die Daten in die ursprüngliche Seite, also weiß ich nicht, ob ich auf dem Formular richtig poste und es gibt noch etwas, was ich tun muss, damit es die Daten von der Suchergebnisseite zurückgibt, oder wenn ich die Daten immer noch falsch poste .

Und ja, ich weiß, dass dies requests statt urllib2 verwendet, aber alles, was ich tun möchte, ist die Daten zu bekommen.

+0

Die Suche wird als Formulardaten gesendet, nicht als Teil der URL. Der Schlüssel für den Abfragetext ist 'simpleSearchSearchForm: fpSearch'. Beachten Sie, dass Sie dies mit den Entwicklertools in Ihrem Browser sehen können, wenn Sie eine Suche manuell durchführen. – jonrsharpe

+0

Okay. Was bedeutet das? Damit meine ich: Was soll ich tun, um die Daten zu posten und die benötigte Seite abzurufen? –

+0

https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Forms/Sending_and_retrieving_form_data – jonrsharpe

Antwort

3

Dies ist nicht der direkteste Anfrage ist, dass, wenn Sie in Entwicklertools oder Firebug sehen Sie die Formulardaten von einem erfolgreichen Browser Beitrag sehen können:

enter image description here

All das ist ziemlich geradlinig die Bar Tatsache, Sie sehen einige : in den Schlüsseln eingebettet, die ein wenig verwirrend sein können, simpleSearchSearchForm:commandSimpleFPSearch ist der Schlüssel und Search.

Das einzige, was man kann nicht hart Code ist javax.faces.ViewState, benötigen wir eine Anfrage an die Website zu machen und dann diesen Wert analysieren, die wir mit BeautifulSoup tun können:

import requests 
from bs4 import BeautifulSoup 

url = "https://patentscope.wipo.int/search/en/search.jsf" 

data = {"simpleSearchSearchForm": "simpleSearchSearchForm", 
     "simpleSearchSearchForm:j_idt341": "EN_ALLTXT", 
     "simpleSearchSearchForm:fpSearch": "automata", 
     "simpleSearchSearchForm:commandSimpleFPSearch": "Search", 
     "simpleSearchSearchForm:j_idt406": "workaround"} 
head = { 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36"} 

with requests.Session() as s: 
    # Get the cookies and the source to parse the Viewstate token 
    init = s.get(url) 
    soup = BeautifulSoup(init.text, "lxml") 
    val = soup.select_one("#j_id1:javax.faces.ViewState:0")["value"] 
    # update post data dict 
    data["javax.faces.ViewState"] = val 
    r = s.post(url, data=data, headers=head) 
    print(r.text) 

Wenn wir den Code oben ausgeführt:

In [13]: import requests 

In [14]: from bs4 import BeautifulSoup 

In [15]: url = "https://patentscope.wipo.int/search/en/search.jsf" 

In [16]: data = {"simpleSearchSearchForm": "simpleSearchSearchForm", 
    ....:   "simpleSearchSearchForm:j_idt341": "EN_ALLTXT", 
    ....:   "simpleSearchSearchForm:fpSearch": "automata", 
    ....:   "simpleSearchSearchForm:commandSimpleFPSearch": "Search", 
    ....:   "simpleSearchSearchForm:j_idt406": "workaround"} 

In [17]: head = { 
    ....:  "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36"} 

In [18]: with requests.Session() as s: 
    ....:   init = s.get(url) 
    ....:   soup = BeautifulSoup(init.text, "lxml") 
    ....:   val = soup.select_one("#j_id1:javax.faces.ViewState:0")["value"] 
    ....:   data["javax.faces.ViewState"] = val 
    ....:   r = s.post(url, data=data, headers=head) 
    ....:   print("\n".join([s.text.strip() for s in BeautifulSoup(r.text,"lxml").select("span.trans-section")])) 
    ....:  

Fuzzy genetic learning automata classifier 
Fuzzy genetic learning automata classifier 
FINITE AUTOMATA MANAGER 
CELLULAR AUTOMATA MUSIC GENERATOR 
CELLULAR AUTOMATA MUSIC GENERATOR 
ANALOG LOGIC AUTOMATA 
Incremental automata verification 
Cellular automata music generator 
Analog logic automata 
Symbolic finite automata 

Sie werden sehen, dass es mit der Webseite übereinstimmt. Wenn Sie Websites scrappen möchten, müssen Sie sich mit den Entwicklertools/Firebug usw. vertraut machen, um zu sehen, wie die Anfragen gestellt werden, und dann versuchen, sie nachzuahmen. Um den Firebug zu öffnen, klicken Sie mit der rechten Maustaste auf die Seite und wählen Sie inspect element, klicken Sie auf die Registerkarte network und senden Sie Ihre Anfrage.Sie müssen nur die Anfragen aus der Liste wählen und wählen Sie dann, was Registerkarte Sie Informationen für aus Post-Anforderung auf d.h params wollen:

enter image description here

Sie auch auf diese answer nützlich finden, wie man eine Website nähern veröffentlichen.

+0

Das war unglaublich hilfreich. Vielen Dank! –