irgit
Очень прошу указать на мелочи.
Мелочей много, даже не знал с чего начать, спасибо, PEHDOM объяснил многое. Но это ещё не всё.
PEHDOM
лишнее переобразование это плохо
# Пустой список и так вернет False, непустой True
#Плохо
if bool(i) == True:
….
# Хорошо:
if i :
В общем случае это правильно, но в данном случае нет надобности проверять содержимое списка, если он пустой, то
for ничего с ним не сделает и даже не заметит.
Функция
all_url() совсем не нужна, она вызывается у вас два раза, второй раз не понятно зачем. Эту функцию можно заменить одной строкой кода. Начало и конец периода, а так же URL сделать константами и переместить в начало модуля в блок констант под блоком импорта.
Функция
split() также не нужна, она вызывается аж целый один раз.
Функция
clear() реально нужна всего лишь два раза, к тому же она оставляет пробелы в начале и в конце предложения, которые нужно убирать методом
.strip().
Функцию
get_page(uri) нужно привести в порядок. Смотрите мой код и если что не ясно, спрашивайте.
Строка кода:
text_org_url = 'http://www.zakupki.gov.ru'+(two_columne.find('li').find("a").get('href'))
не используется, она нужна?
Нужно использовать контекстный менеджер
with:
with Pool(PROCESSES) as pool:
а не ждать пока “городские власти закроют сезон фонтанов”.
Документация модуля
multiprocessing говорит:
…необходимо защищать «точку входа» программы следующим образом: if __name__ == ‘__main__’Сообщение о том, сколько страниц обработано нужно давать не до обработки, а после.
irgit, приложите все усилия для изучения методов строк, это очень важно, иначе вы всю жизнь будете писать говнокод.
Вот мой вариант:
import requests
from bs4 import BeautifulSoup as bs
from datetime import date
from dateutil.rrule import rrule, DAILY
from multiprocessing import Pool
import re
#все константы здесь:
PROCESSES = 4 #число процессов
START_DATE = date(2019, 6, 7) #Начало периода
END_DATE = date(2019, 6, 11) #конец периода
OUTPUT_FILE = 'zakup.csv'
URL = 'http://www.zakupki.gov.ru/epz/order/extendedsearch/results.html?morphology=on&openMode=USE_DEFAULT_PARAMS&pageNumber=1&sortDirection=false&recordsPerPage=_100&showLotsInfoHidden=false&fz44=on&fz223=on&ppRf615=on&fz94=on&af=on&ca=on&pc=on&pa=on¤cyIdGeneral=-1&publishDateFrom={0}&publishDateTo={0}®ion_regions_5277386=region_regions_5277386®ions=5277386®ionDeleted=false&sortBy=UPDATE_DATE'
def get_page(uri):
'''Парсинг страницы'''
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
response = requests.get(uri, headers=headers).text
soup = bs(response, 'html.parser')
tag = soup.findAll("div", {"class": "registerBox"})
zakup_all = []
for i in tag:
try:
one_columne = i.find('td')
text_type = one_columne.find('strong').text.strip()
text_fz = one_columne.find('span', {"class": "orange"}).text
text_rub = (one_columne.find('span', {"class": "fractionNumber"}).parent).text
text_rub = re.sub('\s+', '', text_rub)
two_columne = i.find('td', {"class": "descriptTenderTd"})
text_num = two_columne.find('dt').text.strip()
text_num_url = f'http://www.zakupki.gov.ru{two_columne.find("dt").find("a").get("href")}'
text_org = two_columne.find('li').text.strip()
text_org_url = f'http://www.zakupki.gov.ru{two_columne.find("li").find("a").get("href")}' #не используется?
text_main = two_columne.findAll('dd')[1].text
text_main = re.sub('\s+', ' ', text_main).strip()
tree_columne = i.find('td', {"class": "amountTenderTd"})
text_date = (tree_columne.findAll('li')[0].text)[11:]
text_update = (tree_columne.findAll('li')[1].text)[11:]
zakup_all.append((text_type, text_fz, text_rub, text_num, text_org,
text_main, text_date, text_update, text_num_url))
except Exception as e:
print(e)
return zakup_all
'''Парсим мультипотоком и сохраняем'''
if __name__ == '__main__':
all_url = [URL.format(dt.strftime("%d.%m.%Y")) for dt in rrule(DAILY, dtstart=START_DATE, until=END_DATE)]
page_count = []
all_rows = []
with open(OUTPUT_FILE, 'w') as f:
print('Начали. Ждите завершение...')
n = len(all_url) // PROCESSES
for part in [all_url[i::n] for i in range(n)]:
page_count.append(len(part))
with Pool(PROCESSES) as pool:
for row in pool.map(get_page, part):
for item in row:
all_rows.append('|'.join(item))
print(f'Страниц обработано: {sum(page_count)} из {len(all_url)}')
f.write('\n'.join(all_rows)) #Запись в файл одним массивом если данных не очень много
print('Завершили обработку')