Python: Как оставаться в системе во время соскоба? - PullRequest
0 голосов
/ 19 марта 2020

Просто чтобы уточнить с самого начала: я абсолютный новичок (сегодня я написал что-то в Python впервые). Это было больше применимо от гида и пыталось вспомнить, что я делал 7 лет go, когда пытался учить 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 = "tags\n"
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()

Выходит список всех тегов, используемых high Res изображения. Я надеюсь, что никого не оскорбляю этим.

Редактировать: Код работает сейчас, был повар ie опечатка:

import requests
from bs4 import BeautifulSoup as soup

login_data = {
    'user' : 'myusername',
    'pass' : 'mypassword',
    'op' : 'Log in'
}

s = requests.Session()    

print("\n\n\n\n\n")

filename = "taglist.txt"
f = open(filename, "w", encoding="utf-8")
headers = "tags\n"
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()

1 Ответ

0 голосов
/ 19 марта 2020

Вы используете две разные библиотеки для выполнения веб-запросов прямо сейчас. requests и urllib. Я бы выбрал использование только запросов.

Также не используйте Session () менеджер контекста . Диспетчер контекста используется для некоторой очистки после выхода из блока с отступом и имеет тот синтаксис with ... as x, который вы используете в объекте request.Session (). В контексте запросов это удалит куки, когда вы покидаете сеанс. (Я предполагаю, что вход в систему управляется с помощью файлов 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)

Также сделайте последующий вызов в l oop с запросами:

client = s.get(url)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...