蟒蛇 :如何在抓取时保持登录状态?



只是为了从一开始就澄清一下:我是一个完全的初学者(我今天第一次用Python写了一些东西)。这更多地适用于指南,并试图记住我 7 年前尝试学习 Java 时所做的事情,而不是其他任何事情。 我想从网站上抓取图像标签(稍后绘制它们),但必须保持登录状态才能查看所有图像。在我完成抓取后,我注意到有一些标签被阻止,所以出现了登录问题。我现在设法登录,但它在会话本身之外不起作用,这使得我的其余代码无用。我可以让它工作还是我必须放弃? 这是工作登录:

import requests
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
login_data = {
'user' : 'theusername',
'pass' : 'thepassword',
'op' : 'Log in'
}
with requests.Session() as s:
url = "https://thatwebsite.com/index.php?page=account&s=login&code=00"
r = s.get(url)
r = s.post(url, data=login_data)

以及我之前的工作来抓取网站但缺少登录名:

filename = "taglist.txt"
f = open(filename, "w", encoding="utf-8")
headers = "tagsn"
f.write(headers)
pid = 0
actual_page = 1
while pid < 150:
url = "https://thatwebsite.com/index.php?page=post&s=list&tags=absurdres&pid=" + str(pid)
print(url)
client = urlopen(url)
page_html = client.read()
client.close()
page_soup = soup(page_html, "html.parser")
containers = page_soup.findAll("div",{"class":"thumbnail-preview"})
print("Current pid: " + str(pid))
for container in containers:
tags = container.span.a.img["title"]
f.write(tags.replace(" ", "n") + "n")
pid = pid + 42
print("Current page: " + str(actual_page))
actual_page += 1
print("Done.")
f.close()

出现高分辨率图像使用的每个标签的列表。 我希望我不会因此冒犯任何人。

编辑:代码现在可以工作,有一个cookie错别字:

import requests
from bs4 import BeautifulSoup as soup
login_data = {
'user' : 'myusername',
'pass' : 'mypassword',
'op' : 'Log in'
}
s = requests.Session()    
print("nnnnn")
filename = "taglist.txt"
f = open(filename, "w", encoding="utf-8")
headers = "tagsn"
f.write(headers)
pid = 0
actual_page = 1
while pid < 42:
url2 = "https://thiswebsite.com/index.php?page=post&s=list&tags=rating:questionable&pid=" + str(pid)
r = s.get(url2, cookies={'duid' : 'somehash', 'user_id' : 'my userid', 'pass_hash' : 'somehash'})
page_html = str(r.content)
page_soup = soup(page_html, "html.parser")
containers = page_soup.findAll("div",{"class":"thumbnail-preview"})
for container in containers:
tags = container.span.a.img["title"]
f.write(tags.replace(" ", "n") + "n")

print("nCurrent page: " + str(actual_page) + " Current pid: " + str(pid) + "nDone.")
actual_page += 1
pid = pid + 42
f.close()

您现在使用两个不同的库来执行 Web 请求。requestsurllib.我会选择仅使用请求。

也不要使用 Session()上下文管理器。上下文管理器用于在离开缩进块后执行一些清理,并具有您在请求上使用的with ... as x语法。会话() 对象。在请求的上下文中,这将在您离开会话时清除 Cookie。(我假设登录由本网站的 cookie 管理)。

将会话保留在变量中,以便您可以将其用于后续请求,因为这会在登录时存储您的 cookie。后续请求需要它们。

s = requests.Session() 
url = "https://thatwebsite.com/index.php?page=account&s=login&code=00"
r = s.get(url)  # do you need this request?
r = s.post(url, data=login_data)

还要在循环中使用请求进行后续调用:

client = s.get(url)

最新更新