Let's read a random Goodreads book in an optimal way
After I've gone through your code, I decided to rewrite it because using regex to parse html isn't a good idea at all.
When you're parsing html, is recommended to use BeautifulSoup, so I'll rewrite your code using it.

First, I'll start from the imports:
from bs4 import BeautifulSoup as bs
import requests

Nothing too fancy so far, we're importing the modules we need in order to have our work done.

You had in your code a magic number (30), which we can define at the top of our program, just below the imports:
MIN_RATING_COUNT = 30 

You had other numbers in your code which didn't make sense to me, so I removed them. Just let me know what their purpose was (if any) if there's any difference between my proposed solution and yours.

Moving on, we can now build a function which returns a bs object on which we can later work.
def get_html_source():
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    html_source = requests.get(URL).text
    return bs(html_source, 'html.parser')

Now, let's build another four functions which will get us the rating count, title, pages and rating of a random book.
def get_book_rating_count(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('span', attrs={'class', 'value-title'}).get_text()


def get_book_title(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('h1', attrs={'class': 'bookTitle'}).get_text()


def get_book_pages(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('span', attrs={'itemprop': 'numberOfPages'}).get_text()


def get_book_rating(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('span', attrs={'itemprop': 'ratingValue'}).get_text()


As I was testing this out, I've noticed that book_rating_count might have different value formats so let's build another function to treat each case:
def to_float(rating_count):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    rating = rating_count.split()[0]
    return float(rating.replace(',', '.'))


Regarding the title, we can build another function to nicely format it: remove the newlines in it and replace &amp;amp; with &amp;:
def format_title(book_title):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return ' '.join(book_title.split()).replace('&amp;amp;', '&amp;')


Last, but not least, let's build our main function:
def main():
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    while True:
        soup = get_html_source()
        book_rating_count = get_book_rating_count(soup)
    
        if to_float(book_rating_count) &gt; MIN_RATING_COUNT:
            book_pages = get_book_pages(soup)
            book_title = format_title(get_book_title(soup))
            book_rating = get_book_rating(soup)
    
            print('Title: {}\n'
                  'Pages: {}\n'
                  'Rating: {}\n\n'.format(book_title, book_pages, book_rating))


If you're also going to terminate the program using CTRL + C, I suggest you put your main function into a try/except block.
try:
    main()
except KeyboardInterrupt:
    print(&quot;You've decided to close the program&quot;)


The final code:
from bs4 import BeautifulSoup as bs
import requests

URL = &quot;https://www.goodreads.com/book/random&quot;
MIN_RATING_COUNT = 30


def to_float(rating_count):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    rating = rating_count.split()[0]
    if ',' in rating:
        return float(rating.replace(',', '.'))
    return float(rating)


def format_title(book_title):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return ' '.join(book_title.split()).replace('&amp;amp;', '&amp;')


def get_html_source():
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    html_source = requests.get(URL).text
    return bs(html_source, 'html.parser')


def get_book_rating_count(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('span', attrs={'class', 'value-title'}).get_text()


def get_book_title(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('h1', attrs={'class': 'bookTitle'}).get_text()


def get_book_pages(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('span', attrs={'itemprop': 'numberOfPages'}).get_text()


def get_book_rating(soup):
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    return soup.find('span', attrs={'itemprop': 'ratingValue'}).get_text()


def main():
    &quot;&quot;&quot;Docstring here.&quot;&quot;&quot;
    while True:
        soup = get_html_source()
        book_rating_count = get_book_rating_count(soup)

        if to_float(book_rating_count) &gt; MIN_RATING_COUNT:
            try:
                book_pages = get_book_pages(soup)
            except AttributeError:
                book_pages = 'No pages available'
            book_title = format_title(get_book_title(soup))
            book_rating = get_book_rating(soup)

            print('Title: {}\n'
                  'Pages: {}\n'
                  'Rating: {}\n\n'.format(book_title, book_pages, book_rating))

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print(&quot;You've decided to close the program&quot;)


If you let the above run for several minutes, you'll eventually get an AttributeError for the simple fact that some books don't have the number of pages, so I also added that into a try/except block.
Other changes that I've done:

I've added if __name__ == '__main__'
I've split the code in several functions so that each of them does its own job


Recommendations regarding your code-style:

in comments, there should be only one space after #;
there should be only one space before and after = operator;
instead of randomly using comments inside your code, just add docstrings to your functions (see PEP257 for more info);
instead of name = &quot;He called me \&quot;Bla\&quot; again!&quot; you can do name = 'He called me &quot;Bla&quot; again!' and vice-versa.

You can also read more about Python's style-guide, here.

Performance:
If you'll have many &lt;30 books one ofter another, you don't have what to do but wait. As for your question regarding multithreading, threads only actually speed up I/O operations - because of the GIL.
CPU-bound operations (like the parsing/searching BeautifulSoup is doing) can't actually be done in parallel via threads, because only one thread can do CPU-based operations at a time. So you still may not see the speed up you were hoping for with this approach.
When you need to speed up CPU-bound operations in Python, you need to use multiple processes instead of threads. Luckily, you can easily do this using the multiprocessing module.