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)
Или где почитать на эти темы с примерами, что бы я догнал, а то на старости тяжко Заранее благодарю!