Форум сайта python.su
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()
Отредактировано sasholy (Июнь 29, 2020 20:38:58)
Офлайн
sasholyПервый код более грамотно написан, чем второй код. Второй код довольно сильно загрязнён, что будет приводить к ошибкам, которые не только всплывут во время работы уже, так ещё и исправить их будет проблематично даже самому автору кода, не говоря уже о вообще другом программисте, который после автора должен будет исправлять за ним этот код.
1. Какой код лучше или как его улучшить?
sasholyНужно обратиться к интерфейсу, который поставляет нужную строку. То есть в питоне нужно вызвать функцию, которая вернёт строку, а уж где она эту строку возьмёт, запрашивающий эту строку код не должно волновать. Обращаешься к функции и говоришь “дай мне user-agent”, она тебе говорит “на, вот тебе user-agent”. А вот внутри интерфейсной функции уже происходит какой-то процесс добывания этой строки. Её можно создать из воздуха, взять их файла, запросить в базе данных, прочитать из сокета или спросить у другого интерфейса, который там, например, сидит и из смсок по телефону эти строки читает. Главное, что самый первоначальный код, где эта строка используется, это всё не должно заботить.
2.Как вставить в улучшенный код useragent, как это лучше реализовать в файле прописать в скрипте или питоновскими функциями.
sasholyТочно так же, как user-agent, описанный выше. Ты должен обратиться к интерфейсу за прокси, а где он его возьмёт и как, это не твоё дело. Тебе нужен прокси, он тебе должен его дать.
3. Как подключить proxy лист с проверками if, els или try, except - что лучше?
sasholyТочно так же, как user-agent, описанный выше. Ты должен обратиться к интерфейсу за ip, а где он его возьмёт и как, это не твоё дело. Тебе нужен ip, он тебе должен его дать. Если ip нерабочий, ты просишь у интерфейса новый ip. Соответственно, если ты получаешь нерабочие ip всё время, ты должен задаться вопросом “а почему интерфейс мне выдаёт всё время нерабочие ip? нафиг они мне нужны”. И так ты придёшь к тому, что где-то там внутри нужно добавить проверку ip на рабочесть и только после неё их выдавать запрашивающей стороне.
4. Если ip нерабочий что бы брало следующий?
Отредактировано py.user.next (Июнь 30, 2020 00:10:39)
Офлайн
за 0гр на карту приватбанка кто то сделает мне код с комментами? или валить на фриланс?
Отредактировано sasholy (Июль 3, 2020 17:27:31)
Офлайн
50 грн стоит ответ на форуме. Один;
Офлайн