Когда блок кода перестаёт умещаться в половину экрана монитора - пора разбивать его на функции. Выберите то, что проще всего отщипнуть и поместите в отдельные функции. Также полезно разбивать и сами функции, когда в них становится слишком много строк.


Пример

В данном примере сложно понять, что происходит в функции. Куда проще, когда ключевые действия вынесены в отдельные функции. Так будет гораздо легче читать код.

Плохо:


def download_book(book_id, img_path="/path/to/img/", book_path="/path/to/file/"):
...
img_rel_path = soup.find('div', class_='bookimage').find('img')['src']
img_url = urljoin(book_page_url, img_rel_path)
response = requests.get(img_url)
...
with open(img_path, 'w') as img:
    img.write(response.content)
...
response = requests.get(book_url)
...
with open(book_path, 'w') as book:
    book.write(response.text)
...

Хорошо:


def download_text(url, book_path="/path/to/book/"):
    response = requests.get(url)
    ...
    with open(book_path, 'w') as book:
        book.write(response.text)


def download_image(url, img_path="/path/to/img/"):
    response = requests.get(url)
    ...
    with open(img_path, 'w') as img:
        img.write(response.content)


def get_image_url(soup, book_page_url):
    img_rel_path = soup.find('div', class_='bookimage').find('img')['src']
    img_url = urljoin(book_page_url, img_rel_path)
    return img_url


def download_book(book_id):
    ...
    img_url = get_image_url(soup, book_page_url)
    download_image(img_url, img_path)
    download_text(book_url, book_path)