Die Anforderungsbibliothek meldet sich bei der Website an, der Unterschied zwischen Session() und session() ist sehr schrecklich

Der Autor hat kürzlich eine Website mit Python gecrawlt, und die Startseite muss einen Benutzernamen und ein Passwort eingeben. Da die Website keinen Bestätigungscode erfordert, sind die Anmeldeschritte relativ einfach. Verwenden Sie den Webdriver von Selenium, um den Chrome-Browser zu öffnen, um die Anmeldung zu automatisieren, der Code ist nicht schwer zu schreiben und die Anmeldung ist sehr reibungslos. Denken Sie später darüber nach, Selen öffnet den Browser nur langsam und nimmt viel Speicherplatz in Anspruch.Da die Website, die ich crawlen möchte, keine umständliche Verifizierung wie Verifizierungscodes erfordert, kann ich mich nur mit der Anforderungsbibliothek auf der Website anmelden ?

Analysieren Sie zuerst den Quellcode der Homepage der Website und verstehen Sie, dass die Post-Aktion erforderlich ist, um sich auf der Website anzumelden, und einige Formulardaten wie Benutzername, Passwort usw. erforderlich sind, und auch ein Hash-Wert Dieser Hash-Wert ist jedes Mal anders, wenn die Webseite aktualisiert wird, also in der Quelle der Webseite Verwenden Sie im Code re.search() der re-Bibliothek, um ihn zu erhalten. Verwenden Sie dann urlencode(), um die Formulardaten für die Anmeldung in die URL zu kompilieren, und posten Sie dann.

import requests
from urllib.parse import urlencode

headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}

res=requests.get('https://。。。。。。.com',headers=headers)
if res.status_code==200:
    res=res.text
else:
    print('打开网页失败。')
    exit()

# 查找网页源代码中的hash值
try:
    hash_value=re.search('name="hash" value="(.*?)"',res)[1]
except Exception:
    print('找不到hash值')
    exit()

# 登录用的表单数据
data={'username':'这里填你的用户名',
      'password':'你的密码',
      'hash': hash_value,
      }

# 用urlencode把登录表单数据编译成url
posturl='https://。。。。。。.com/login?'+urlencode(data)

res=requests.post(posturl,headers=headers,timeout=10)

if res.status_code!=200:
    print(f'登录失败!错误代码:{str(res.status_code)}')
else:
    print(res.text)

Schlägt immer wieder beim Anmeldeversuch fehl. Später habe ich auf anderen Websites folgende Lösungen gefunden:

Wenn Sie in Anfragen direkt Methoden wie get() oder post() verwenden, können Sie die Schnittstellenanfrage der Webseite simulieren, aber sie endet nach jeder initiierten Anfrage und speichert keine relevanten Authentifizierungsinformationen wie Cookies/ Token; wenn Sie sich beispielsweise zum ersten Mal mit einer post()-Anfrage auf einer Website anmelden und nach erfolgreicher Anmeldung zum zweiten Mal die persönlichen Daten des Benutzers erhalten möchten. Wenn Sie erneut eine post()-Anfrage initiieren, wird dies der Fall sein Sie werden aufgefordert, sich zuerst anzumelden. Wenn ich mich zum ersten Mal bei der Anfrage bereits angemeldet habe, warum werde ich beim zweiten Mal aufgefordert, mich zuerst anzumelden? Tatsächlich entsprechen die beiden Anforderungen der Verwendung von zwei Browsern für den Zugriff, bei denen es sich um zwei völlig unabhängige Sitzungen handelt, sodass die zweite Anforderung keine Benutzerinformationen abrufen kann. Das session()-Objekt in Requests ermöglicht es uns, bestimmte Parameter über HTTP-Requests hinweg beizubehalten, d. h. den von demselben Session-Objekt gesendeten Request-Header einen bestimmten Parameter tragen zu lassen. Die häufigste Anwendung ist natürlich, dass Cookies in einer Reihe von nachfolgenden Anfragen gespeichert werden können.

Kurz gesagt lautet diese Passage: Jedes Mal, wenn Sie "requests.get" oder "post" verwenden, stellt dies das Öffnen eines Links mit einem anderen Browser dar. Wenn Sie möchten, dass derselbe Browser verschiedene Links öffnet, müssen Sie eine Sitzung verwenden.

Also habe ich die Anfrage im obigen Code geändert in:

import requests
from urllib.parse import urlencode

headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}

# 使用session
se=requests.session()

res=se.get('https://。。。。。。.com',headers=headers)
if res.status_code==200:
    res=res.text
else:
    print('打开网页失败。')
    exit()

# 查找网页源代码中的hash值
try:
    hash_value=re.search('name="hash" value="(.*?)"',res)[1]
except Exception:
    print('找不到hash值')
    exit()

# 登录用的表单数据
data={'username':'这里填你的用户名',
      'password':'你的密码',
      'hash': hash_value,
      }

# 用urlencode把登录表单数据编译成url
posturl='https://。。。。。。.com/login?'+urlencode(data)

res=se.post(posturl,headers=headers,timeout=10)

if res.status_code!=200:
    print(f'登录失败!错误代码:{str(res.status_code)}')
else:
    print(res.text)

Ein weiterer Fehlschlag! Aber es ist eindeutig gemäß dem Tutorial geschrieben. Ist auf der Website ein JS-Code-Abfangen eingerichtet?

Sehen Sie sich dann andere Tutorials an und ändern Sie den Code in debug.. Unerwarteterweise liegt der ursprüngliche Fehler in der Art und Weise, wie die Sitzung geschrieben wird:

Falsche Schreibweise: se = Requests.session()

Korrekte Schreibweise: se = Anfragen.Session()

Das S am Anfang von Session() muss groß geschrieben werden! Dies ist ein Fehler auf niedriger Ebene, den viele Leute machen, wenn sie anfangen. Obwohl die Kleinbuchstaben den Code passieren können, spielen sie keine wesentliche Rolle und führen nicht dazu, dass die Anmeldung fehlschlägt. Denken Sie also daran, dass dies als Session() geschrieben werden muss.

Supongo que te gusta

Origin blog.csdn.net/Scott0902/article/details/128899017
Recomendado
Clasificación