Python urllib2 или запрашивает метод post

В общем, я понимаю, как сделать запрос POST с использованием urllib2 (кодирование данных и т.д.), Но проблема заключается в том, что все онлайн-учебники используют абсолютно бесполезные составленные примеры URL-адресов, чтобы показать, как это сделать (someserver.com, coolsite.org и т.д.), поэтому я не вижу конкретного html, который соответствует используемому ими примеру кода. Даже собственный учебник python.org совершенно бесполезен в этом отношении.

Мне нужно сделать запрос POST на этот URL:

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

Соответствующая часть кода - это (я думаю):

<form id="simpleSearchSearchForm" name="simpleSearchSearchForm" method="post" action="/search/en/search.jsf" enctype="application/x-www-form-urlencoded"><div id="simpleSearchSearchForm:sSearchPanel"><div id="simpleSearchSearchForm:sSearchPanel_header"> <p> Или, может быть, это:</p>  <p> Если я хочу кодировать <code>JP2014084003</code> качестве <code>JP2014084003</code> поиска, каково соответствующее значение в html для использования? <code>input id</code>? <code>name</code>? <code>value</code>?</p> <p> Добавление: <a href="https://qa-help.ru/questions/otpravka-veb-formy-s-ispolzovaniem-python" target="_blank">этот ответ</a> не отвечает на мой вопрос, потому что он просто повторяет информацию, которую я уже рассмотрел на странице документов python.</p> <p> ОБНОВИТЬ:</p> <p> Я нашел <a href="https://qa-help.ru/questions/python-popytka-ispolzovaniya-formy-post-s-ispolzovaniem-zaprosov" target="_blank">это</a> и попробовал код там, в частности:</p> <pre class="prettyprint linenums">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()

Я получаю успешный ответ (200), но данные - это просто данные на исходной странице, поэтому я не знаю, правильно ли я отправляю их в форму, и мне нужно что-то еще сделать, чтобы верните данные со страницы результатов поиска или если я все еще неправильно размещаю данные.

И да, я понимаю, что это использует requests вместо urllib2, но все, что я хочу сделать, это получить данные.

1 ответ

Это не самый прямой запрос на отправку по почте, если вы посмотрите в инструментах разработчика или firebug, вы можете увидеть formdata из успешной почты в браузере:

Все, что довольно прямолинейно, simpleSearchSearchForm:commandSimpleFPSearch на то, что вы видите некоторые : встроенные в ключи, которые могут быть немного запутанными, simpleSearchSearchForm:commandSimpleFPSearch - это ключ и Search.

Единственное, что вы не можете жестко кодировать: javax.faces.ViewState, нам нужно сделать запрос на сайт, а затем проанализировать это значение, которое мы можем сделать с BeautifulSoup:

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)

Если мы запустим код выше:

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

Вы увидите, что он соответствует веб-странице. Если вы хотите очистить сайты, вам нужно ознакомиться с инструментами разработчика /firebug и т.д., Чтобы посмотреть, как делаются запросы, а затем попытаться имитировать. Чтобы открыть firebug, щелкните правой кнопкой мыши на странице и выберите элемент проверки, щелкните вкладку сети и отправьте запрос. Вам просто нужно выбрать запросы из списка, а затем выбрать любую вкладку, которую вы хотите проинформировать, т.е. параметры для исходящего запроса:

Вы также можете найти этот ответ полезным для подхода к публикации на сайте.

licensed under cc by-sa 3.0 with attribution.