Комментарии 8
Жесть. Это просто какая-то мешанина из объяснений синтаксиса питона, отвратительного кода, избыточности комментариев и издевательств над языком. Не надо так писать, даже для себя, а уж тем более учить такому других.
Очень хороший пример как не надо писать комментарии.
Нормальные комментарии, малех избыточны, но лучше чем никаких, а для обучения -самое то. )))
https://www.ozon.ru/context/detail/id/21916535/
Строго рекомендую.
Строго рекомендую.
В заключении хорошо бы выдавать готовый скрипт, для тех, кто хотел бы опробовать результат.
Крайне рекомендую автору ознакомиться с PEP8.
Интересная постановка задачи, но код требует доработки в плане оптимизации.
Не знаю, работало ли это раньше, но предположу, что нет, т.к. есть глобальные ошибки наподобие "str = html.fromstring(r.content)".Кроме того, много лишних нагромождений.
Однако, чтобы "телега поехала", а пост не умер, вот работающий код(правда там "занулены" прокси и много других углов, вылезающих из приведенного кода). Однако сам парсер работает.
код
import requests #осуществляет работу с HTTP-запросами
import urllib.request #библиотека HTTP
from lxml import html #библиотека для обработки разметки xml и html, импортируем только для работы с html
import re #осуществляет работу с регулярными выражениями
from bs4 import BeautifulSoup #осуществляет синтаксический разбор документов HTML
import csv #осуществляет запись файла в формате CSV
import tkinter #создание интерфейса
from tkinter.filedialog import * #диалоговые окна
global proxy1 #объвляем глобальную переменную для запоминания прокси на следующий проход цикла
proxy1 = '' #и приравниваем к пустому тексту
BASE_URL = 'https://www.weblancer.net/jobs/' #адрес сайта для парсинга
massiv = [] #массив для хранения прокси
#https://www.weblancer.net/jobs/?page=2
def main(event):
page_count = get_page_count(get_html(BASE_URL))
#print(page_count)
lbl3.config(text='Всего найдено страниц: '+str(page_count))
page = 1
projects = []
while page_count != page:
proxy = Proxy()
proxy = proxy.get_proxy()
#print(proxy)
lbl4.config(text='Прокси: '+proxy)
global proxy1
proxy1 = proxy
try:
for i in range(1,10):
page += 1
lbl2.update()
lbl2.config(text='Парсинг %d%%'%(page / page_count * 100))
#r = requests.get(BASE_URL + '?page=%d' % page, proxies={'https': proxy})
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
r = requests.get(BASE_URL + '?page=%d' % page,headers=headers)
#print(BASE_URL,r.raise_for_status)
parsing = BeautifulSoup(r.content, "lxml")
projects.extend(parse(BASE_URL + '?page=%d' % page, parsing))
save(projects, 'proj.csv')
except requests.exceptions.ProxyError:
print('proxy error')
pass
except requests.exceptions.ConnectionError:
print('connecting error')
pass
except requests.exceptions.ChunkedEncodingError:
pass
def get_html(url):
response = urllib.request.urlopen(url)
return response.read()
def get_page_count(html):
soup = BeautifulSoup(html, 'html.parser')
paggination = soup('ul')[3:4]
#print(paggination)
lis = [li for ul in paggination for li in ul.findAll('li')][-1]
for link in lis.find_all('a'):
var1 = (link.get('href'))
var2 = var1[-3:-1]
#print(var2)
return int(var2)
class Proxy:
proxy_url = 'https://www.ip-adress.com/proxy-list'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
#proxy_list = []
def __init__(self):
proxy_list = []
r = requests.get(self.proxy_url,headers=self.headers)
#print(r.raise_for_status)
#strr = html.fromstring(r.content)
soup = BeautifulSoup(r.content, 'lxml')
quotes = soup.find('tbody').find_all('td')
for i in quotes:
if i.find('a')==None:
pass
else:
#print(i.find('a').text)
#proxy_list.append(i.find('a').text)
proxy_list.append(i.text)
#print(strr)
#result = strr.xpath("//tr[@class='odd']/td[1]/text()")
#for i in result:
#if i in massiv:
#yy = result.index(i)
#del result[yy]
#self.list = result
#print(proxy_list)
self.list = proxy_list
def get_proxy(self):
for proxy in self.list:
if 'https://'+proxy == proxy1:
global massiv
massiv = massiv + [proxy]
url = 'https://'+ proxy #'https://'+proxy
return url
#возвращаем данные
#хранящую название, категорию, цену, количество заявок, краткое описание
def parse(html,parsing):
projects = []
table = parsing.find('div' , {'class' : 'cols_table divided_rows'})
for row in table.find_all('div' , {'class' : 'row click_container-link set_href'}):
try:
title=row.find('div' , {'class' : 'title'}).text
except:
title=''
try:
category=row.find('div' , {'class' : 'text-muted'}).text
except:
category=''
try:
price=row.find('div' , {'class' : 'float-right float-sm-none title amount indent-xs-b0'}).text
except:
price=''
try:
zayavki=row.find('div' , {'class' : 'float-left float-sm-none text_field'}).text.text.strip()
except:
zayavki=''
#try:
#description=row.find('div' , {'class' : 'text_field text-inline'}).text
#except:
#description=''
try:
time_ago=row.find('span' , {'class' : 'text-muted'}).text.strip()
except:
time_ago=''
projects.append({'title': title, 'category' : category, 'price' : price,\
'zayavki' : zayavki,'time_ago' : time_ago}) #'description' : description
return projects
def delete(event): #запуск функции
txt1.delete(1.0, END) #удаляет текст с вводимыми данными
txt2.delete(1.0, END) #удаляет текст с выведенными данными
def poisk(event):
file = open("proj.csv", "r")
rdr = csv.DictReader(file, fieldnames = ['title', 'category', 'price', 'zayavki', 'time_ago'])
poisk = txt1.get(1.0, END)
poisk = poisk[0:len(r)-1]
for rec in rdr:
data = rec['title'].split(';')
data1 = rec['category'].split(';')
data = ('').join(data)
data1 = ('').join(data1)
w = re.findall(poisk, data)
if w != []:
if data1 == '':
data1 = 'Договорная'
txt2.insert(END, data+'--'+data1+'\n'+'---------------'+'\n')
#соединяем краткое описание заказа, его цену, переход на новую строку, символы, разделяющие заказы и снова переход на новую строку
def save(projects, path):
with open(path, 'a') as csvfile:
writer = csv.writer(csvfile,delimiter ='\t')
#writer.writerow(('Проект', 'Категории', 'Цена' , 'Заявки' , 'Когда'))#'Описание'
for project in projects:
writer.writerow((project['title'], project['category'], project['price'], project['zayavki'], project['time_ago']))
#каждому параметру присваиваем данные
root = Tk() #главное окно
root.geometry('850x500') #ширина и высота главного окна в пикселях
txt1 = Text(root, width = 18, heigh = 2) #текстовое поле для ввода поисковых слов
txt2 = Text(root, width = 60, heigh = 22) #текстовое поле для вывода данных
lbl4 = Label(root, text = '') #надпись для вывода прокси
btn1 = Button(root, text = 'Отпарсить сайт') #кнопка для парсинга
btn2 = Button(root, text = 'Найти по слову') #кнопка для поиска
btn3 = Button(root, text = 'Очистить поля') #кнопка для очистки полей
lbl1 = Label(root, text = 'Впишите ключевые слова для поиска') #надпись для поиска
lbl2 = Label(root, text = '') #надпись для вывода процента парсинга
lbl3 = Label(root, text = '') #надпись для вывода количества страниц
btn1.bind('<Button-1>', main) #при нажатии клавиши вызывает основную функцию
btn2.bind('<Button-1>', poisk) #вызывает функцию поиска нужных заказов
btn3.bind('<Button-1>', delete) #вызывает функцию очистки полей
lbl2.grid(row = 4, column = 1)
lbl4.grid(row = 5, column = 1)
lbl3.grid(row = 3, column = 1)
btn1.grid(row = 1, column = 1)
btn3.grid(row = 2, column = 1)
btn2.grid(row = 1, column = 2)
lbl1.grid(row = 2, column = 2)
txt1.grid(row = 3, column = 2)
txt2.grid(row = 6, column = 3)
root.mainloop() #запуск приложения
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Парсим weblancer используя PROXY