Pull to refresh

Comments 8

Жесть. Это просто какая-то мешанина из объяснений синтаксиса питона, отвратительного кода, избыточности комментариев и издевательств над языком. Не надо так писать, даже для себя, а уж тем более учить такому других.

Очень хороший пример как не надо писать комментарии.

Нормальные комментарии, малех избыточны, но лучше чем никаких, а для обучения -самое то. )))
В заключении хорошо бы выдавать готовый скрипт, для тех, кто хотел бы опробовать результат.
Крайне рекомендую автору ознакомиться с 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()                     #запуск приложения 
Sign up to leave a comment.

Articles