Ребят, всем привет.
Создаю парсер в рамках django.
Логика:
Через форму я передаю нужные переменные, их подхватывает функция parse_one - сканирует нужный мне элементы, задает в глобальную переменную ссылку на следующий элемент, выдает данные. Ссылку на следующий элемент подхватывает функция parse_two и так в цикле.
Если мы пихаем все в один файлик и запускает данный файл, то все отрабатывает. Если мы вот так вставляем во view, то при попытке запуска получается ошибка:
UnboundLocalError at /parse
local variable 'agent_client' referenced before assignment
Request Method: POST
Request URL:
127.0.0.1:8000/parse
Django Version: 1.9.2
Exception Type: UnboundLocalError
Exception Value:
local variable 'agent_client1' referenced before assignment
Exception Location: E:\jivofolder\marketing\views.py in parse_two, line 90
Python Executable: C:\python35\python.exe
Python Version: 3.5.1
E:\jivofolder\marketing\views.py in parse_two
"agent_client" : agent_client,
Т.е. система ругается на news.append в parse_two
#Константы
LOGIN_URL = "Ссылка логина"
URL = "Ссылка сайта"
#Парсер первой странички
def parse_one(USERNAME, PASSWORD, dialogue_url):
session_requests = requests.session()
# Create payload
payload = {
"email": USERNAME,
"password": PASSWORD
}
# Perform login
result = session_requests.post(LOGIN_URL, data = payload, headers = dict(referer = LOGIN_URL))
# Scrape journal_url
result = session_requests.get(URL, headers = dict(referer = URL))
soup = BeautifulSoup(result.content)
g_data = soup.find_all('a', class_ = 'icon note')[0].get('href')
journal_url = "Ссылка элемента" + g_data
# Scrape journal
result2 = session_requests.get(dialogue_url, headers = dict(referer = dialogue_url))
soup2 = BeautifulSoup(result2.content)
try:
agent_client = soup2.find_all('h2')[0].text
except:
pass
try:
information = soup2.find_all('div', class_ = "content block")[0].text
except:
pass
try:
dialogue_log = soup2.find_all('table', class_ = "table zeropadding transparent")[0].text
except:
pass
news = []
news.append({
"agent_client" : agent_client,
"information" : information,
"dialogue_log" : dialogue_log,
})
next_dialogue_clear = soup2.find_all('a', id ="next")[0].get('href')
global next_dialogue
next_dialogue = "Ссылка следуюдешо элемента" + next_dialogue_clear
return news
#Парсер следующих страничек
def parse_two(USERNAME, PASSWORD):
session_requests = requests.session()
# Create payload
payload = {
"email": USERNAME,
"password": PASSWORD
}
result2 = session_requests.get(next_dialogue, headers = dict(referer = next_dialogue))
soup2 = BeautifulSoup(result2.content)
try:
agent_client = soup2.find_all('h2')[0].text
except:
pass
try:
information = soup2.find_all('div', class_ = "content block")[0].text
except:
pass
try:
dialogue_log = soup2.find_all('table', class_ = "table zeropadding transparent")[0].text
except:
pass
news = []
news.append({
"agent_client" : agent_client,
"information" : information,
# "dialogue_log" : dialogue_log,
})
next_dialogue_clear = soup2.find_all('a', id ="next")[0].get('href')
next_dialogue = "Ссылка следуюдщего элемента" + next_dialogue_clear
global next_dialogue
return news
######################################
#Функция, которая вызывается в django
def parse(request):
done = csrf(request)
if request.POST:
USERNAME = request.POST.get('logins', '')
PASSWORD = request.POST.get('password', '')
dialogue_url = request.POST.get('links', '')
total_pages = int(request.POST.get('numbers', ''))
news = []
news.extend(parse_one(USERNAME, PASSWORD, dialogue_url))
for page in range(2, total_pages + 1): # вот с этим проблема, если закоментить, то parse_one отрабатывает на ура.
news.extend(parse_two(USERNAME, PASSWORD))
contex = {
"news" : news,
}
done.update(contex)
return render(request, 'marketing/parser.html', done)
P.s. не пинайтесь за копи-паст, пока нужно получить функционал, а потом уже допиливать.