Найти - Пользователи
Полная версия: Help! Парсер
Начало » Python для новичков » Help! Парсер
1
sasholy
 import requests
from bs4 import BeautifulSoup
from random import choice, uniform
from time import sleep
import csv
def get_html(url, useragent=None, proxy=None):
    r = requests.get(url, headers=useragent, proxies=proxy)
    return r.text
def write_csv(data):
    with open('cmc.csv', 'a') as f:
        writer = csv.writer(f)
        writer.writerow([data['name'],
                         data['price']])
def get_page_data(html):
    soup = BeautifulSoup(html, 'lxml')
    trs = soup.find('table', id='currencies').find('tbody').find_all('tr')
    for tr in trs:
        tds = tr.find_all('td')
        name = tds[1].find('a', class_='currency-name-container').text
        price = tds[3].find('a',class_='price').text
        data = {'name': name,
                'price': price}
        write_csv(data)
def main():
    url = 'mysite'
    useragent = open('useragent.txt').read().split('\n')
    proxies = open('proxies.txt').read().split('\n')
    for i in range(2):
        sleep(uniform(3, 4))
        proxy = {'http': 'http://' + choice(proxies)}
        useragent = {'User-Agent': choice(useragent)}
        try:
            html = get_html(url, useragent, proxy)
        except:
            continue
        get_page_data(get_html(url))
if __name__ == '__main__':
    main()

 import requests
from bs4 import BeautifulSoup
import csv
import os
URL = 'https:......'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0', 'accept': '*/*'}
HOST = 'https://zzzzzzz'
FILE = 'zzs.csv'
def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r
def get_pages_count(html):
    soup = BeautifulSoup(html, 'html.parser')
    pagination = soup.find_all('span', class_='hide')
    if pagination:
        return int(pagination[-1].get_text())
    else:
        return 1
def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('a', class_='item')
    cars = []
    for item in items:
        uah_price = item.find('span', class_='size15')
        if uah_price:
            uah_price = uah_price_text().replace(' • ', '')
        else:
            uah_price = 'Цену уточняйте'
        cars.append({
            'title': item.find('div', class_='na-card-name').get_text(strip=True),
            'link': HOST + item.find('span', class_='link').get('href'),
            'usd_price': item.find('strong', class_='green').get_text(),
            'uah_price': uah_price,
            'city': item.find('svg', class_='svg_i16_pin').find_next('span').get_text(),
        })
    return cars
def save_file(items, path):
    with open(path, 'w', newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['Марка', 'Ссылка', 'Цена в $', 'Цена в UAH', 'Город'])
        for item in items:
            writer.writerow([item['title'], item['link'], item['usd_price'], item['uah_price'], item['city']])
def parse():
    URL = input('Введите URL: ')
    URL = URL.strip()
    html = get_html(URL)
    if html.status_code == 200:
        cars = []
        pages_count = get_pages_count(html.text)
        for page in range(1, pages_count + 1):
            print(f'Парсинг страницы {page} из {pages_count}...')
            html = get_html(URL, params={'page': page})
            cars.extend(get_content(html.text))
        save_file(cars, FILE)
        print(f'Получено {len(cars)} автомобилей')
        os.startfile(FILE)
    else:
        print('Error')
parse()


Суть просьбы: 1. Какой код лучше или как его улучшить? 2.Как вставить в улучшенный код useragent, как это лучше реализовать в файле прописать в скрипте или питоновскими функциями. 3. Как подключить proxy лист с проверками if, els или try, except - что лучше? 4. Если ip нерабочий что бы брало следующий?(с подробными комментами pleas)

Или где почитать на эти темы с примерами, что бы я догнал, а то на старости тяжко Заранее благодарю!
py.user.next
sasholy
1. Какой код лучше или как его улучшить?
Первый код более грамотно написан, чем второй код. Второй код довольно сильно загрязнён, что будет приводить к ошибкам, которые не только всплывут во время работы уже, так ещё и исправить их будет проблематично даже самому автору кода, не говоря уже о вообще другом программисте, который после автора должен будет исправлять за ним этот код.
Первый код тоже далеко не идеальный. Чтобы улучшить первый код, автору нужно прочитать книжку по питону, чтобы сам язык изучить, так как видно, что он его не знает.

sasholy
2.Как вставить в улучшенный код useragent, как это лучше реализовать в файле прописать в скрипте или питоновскими функциями.
Нужно обратиться к интерфейсу, который поставляет нужную строку. То есть в питоне нужно вызвать функцию, которая вернёт строку, а уж где она эту строку возьмёт, запрашивающий эту строку код не должно волновать. Обращаешься к функции и говоришь “дай мне user-agent”, она тебе говорит “на, вот тебе user-agent”. А вот внутри интерфейсной функции уже происходит какой-то процесс добывания этой строки. Её можно создать из воздуха, взять их файла, запросить в базе данных, прочитать из сокета или спросить у другого интерфейса, который там, например, сидит и из смсок по телефону эти строки читает. Главное, что самый первоначальный код, где эта строка используется, это всё не должно заботить.

sasholy
3. Как подключить proxy лист с проверками if, els или try, except - что лучше?
Точно так же, как user-agent, описанный выше. Ты должен обратиться к интерфейсу за прокси, а где он его возьмёт и как, это не твоё дело. Тебе нужен прокси, он тебе должен его дать.
По общей архитектуре кода смотришь, какая она - структурная парадигма это или объектно-ориентированная. Если у тебя простенькая парадигма (нет классов, всё на функциях), то там, скорее всего, везде будут использоваться коды возврата. Если у тебя умная такая парадигма (там везде классы, которые сами всё знают везде), то там, скорее всего, везде будут использоваться исключения.
Первый код, например, он структурный, поэтому никакой потребности в исключениях у него нет. Если ты заменишь там try на if, то ты никакой разницы не почувствуешь. Тебе нужно будет везде просто дописать коды возврата.
Другое дело, когда есть классы, которые порождают специальные исключения через raise и там от вида исключения зависит последующее поведение стороны, получившей исключение. К тому же само исключение является объектом, у которого внутри хранится полезная информация. То есть это всё проектируется, продумывается, а не пишется наскоряк.

sasholy
4. Если ip нерабочий что бы брало следующий?
Точно так же, как user-agent, описанный выше. Ты должен обратиться к интерфейсу за ip, а где он его возьмёт и как, это не твоё дело. Тебе нужен ip, он тебе должен его дать. Если ip нерабочий, ты просишь у интерфейса новый ip. Соответственно, если ты получаешь нерабочие ip всё время, ты должен задаться вопросом “а почему интерфейс мне выдаёт всё время нерабочие ip? нафиг они мне нужны”. И так ты придёшь к тому, что где-то там внутри нужно добавить проверку ip на рабочесть и только после неё их выдавать запрашивающей стороне.
sasholy
за 0гр на карту приватбанка кто то сделает мне код с комментами? или валить на фриланс?
ZerG
50 грн стоит ответ на форуме. Один;
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB