Scrape Google Books in Python

dmitryzub

Dmitriy Zub β˜€οΈ

Posted on March 16, 2022

Scrape Google Books in Python

What will be scraped

image

Prerequisites

Basic knowledge scraping with CSS selectors

CSS selectors declare which part of the markup a style applies to thus allowing to extract data from matching tags and attributes.

If you haven't scraped with CSS selectors, there's a dedicated blog post of mine about how to use CSS selectors when web-scraping that covers what it is, pros and cons, and why they're matter from a web-scraping perspective.

Separate virtual environment

In short, it's a thing that creates an independent set of installed libraries including different Python versions that can coexist with each other at the same system thus preventing libraries or Python version conflicts.

If you didn't work with a virtual environment before, have a look at the dedicated Python virtual environments tutorial using Virtualenv and Poetry blog post of mine to get familiar.

πŸ“ŒNote: this is not a strict requirement for this blog post.

Install libraries:

pip install requests parsel
Enter fullscreen mode Exit fullscreen mode

Reduce the chance of being blocked

There's a chance that a request might be blocked. Have a look at how to reduce the chance of being blocked while web-scraping, there are eleven methods to bypass blocks from most websites.


Full Code

from parsel import Selector
import requests, json, re

params = {
    "q": "richard branson",
    "tbm": "bks",
    "gl": "us",
    "hl": "en"
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
}

html = requests.get("https://www.google.com/search", params=params, headers=headers, timeout=30)
selector = Selector(text=html.text)

books_results = []

# https://regex101.com/r/mapBs4/1
book_thumbnails = re.findall(r"s=\\'data:image/jpg;base64,(.*?)\\'", str(selector.css("script").getall()), re.DOTALL)

for book_thumbnail, book_result in zip(book_thumbnails, selector.css(".Yr5TG")):
    title = book_result.css(".DKV0Md::text").get()
    link = book_result.css(".bHexk a::attr(href)").get()
    displayed_link = book_result.css(".tjvcx::text").get()
    snippet = book_result.css(".cmlJmd span::text").get()
    author = book_result.css(".fl span::text").get()
    author_link = f'https://www.google.com/search{book_result.css(".N96wpd .fl::attr(href)").get()}'
    date_published = book_result.css(".fl+ span::text").get()
    preview_link = book_result.css(".R1n8Q a.yKioRe:nth-child(1)::attr(href)").get()
    more_editions_link = book_result.css(".R1n8Q a.yKioRe:nth-child(2)::attr(href)").get()

    books_results.append({
        "title": title,
        "link": link,
        "displayed_link": displayed_link,
        "snippet": snippet,
        "author": author,
        "author_link": author_link,
        "date_published": date_published,
        "preview_link": preview_link,
        "more_editions_link": f"https://www.google.com{more_editions_link}" if more_editions_link is not None else None,
        "thumbnail": bytes(bytes(book_thumbnail, "ascii").decode("unicode-escape"), "ascii").decode("unicode-escape")
    })


print(json.dumps(books_results, indent=2))
Enter fullscreen mode Exit fullscreen mode

Import libraries:

from parsel import Selector
import requests, json
Enter fullscreen mode Exit fullscreen mode
  • parsel is a library to extract and remove data from HTML and XML using XPath and CSS selectors. It's similar to beautifulsoup4 except it supports full XPath and has its own CSS pseudo-elements support, for example ::text or ::attr(<attribute_name>).

Create search query parameters and request headers:

# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
params = {
    "q": "richard branson",  # search query
    "tbm": "bks",            # book results
    "gl": "us",              # country to search from
    "hl": "en"               # language
}

# https://requests.readthedocs.io/en/master/user/quickstart/#custom-headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.87 Safari/537.36",
}
Enter fullscreen mode Exit fullscreen mode
  • user-agent is used to act as a "real" user visit so website think it's a user, not the bot/script that sends a request. It's the most basic form of avoiding being blocked by a website.

Pass query params, request headers to the request and create a Selector object:

html = requests.get("https://www.google.com/search", params=params, headers=headers, timeout=30)
selector = Selector(text=html.text)
Enter fullscreen mode Exit fullscreen mode

Create a temporary list to store the data:

books_results = []
Enter fullscreen mode Exit fullscreen mode

Match thumbnails data using regular expression:

# https://regex101.com/r/mapBs4/1
book_thumbnails = re.findall(r"s=\\'data:image/jpg;base64,(.*?)\\'", str(selector.css("script").getall()), re.DOTALL)
Enter fullscreen mode Exit fullscreen mode

The reason why we need to parse the data from <script> tags is because if you parse book thumbnail from <img> ["src"] attribute you'll get a 1x1 placeholder instead of a thumbnail.

  • re.findall() return a list of all matches.
  • selector.css("script") return a list of all found <script> tags and getall() will get the data value from translated XPath returned by <class 'SelectorList'> or <class 'Selector'> instance.
  • re.DOTALL will match everything including new line. Note that you have to have . switch, otherwise it will match every charter except a new line.

Iterate over matched thumbnails and CSS container with all the needed data and extract it:

for book_thumbnail, book_result in zip(book_thumbnails, selector.css(".Yr5TG")):
    title = book_result.css(".DKV0Md::text").get()
    link = book_result.css(".bHexk a::attr(href)").get()
    displayed_link = book_result.css(".tjvcx::text").get()
    snippet = book_result.css(".cmlJmd span::text").get()
    author = book_result.css(".fl span::text").get()
    author_link = f'https://www.google.com/search{book_result.css(".N96wpd .fl::attr(href)").get()}'
    date_published = book_result.css(".fl+ span::text").get()
    preview_link = book_result.css(".R1n8Q a.yKioRe:nth-child(1)::attr(href)").get()
    more_editions_link = book_result.css(".R1n8Q a.yKioRe:nth-child(2)::attr(href)").get()
Enter fullscreen mode Exit fullscreen mode
  • zip() aggregates multiple iterables in parallel and returns a tuple with an item from each one.
  • css(".Yr5TG") is like calling soup.select(".Yr5TG") with bs4, which will return a list of matches.
  • css(".DKV0Md::text") where CSS3 pseudo-element ::text will get text, and get() will get the textual data value from translated XPath. If using without get() you'll get a translated XPath <class 'SelectorList'> or <class 'Selector'> instance from CSS selector.
  • ::attr(href) is also a pseudo-element to grab an attribute.

Append the data to temporary list as a dict:

books_results.append({
    "title": title,
    "link": link,
    "displayed_link": displayed_link,
    "snippet": snippet,
    "author": author,
    "author_link": author_link,
    "date_published": date_published,
    "preview_link": preview_link,
    # if URL is present, add "https://www.google.com" to the URL, instead to None: "Nonehttps://www.google.com"
    "more_editions_link": f"https://www.google.com{more_editions_link}" if more_editions_link is not None else None, 
    "thumbnail": bytes(bytes(book_thumbnail, "ascii").decode("unicode-escape"), "ascii").decode("unicode-escape")
})
Enter fullscreen mode Exit fullscreen mode
  • bytes().decode() will decode unicode escape characters. We have to do it twice, because after first decoding some unicode characters are still present for some reason.

Print the data:

print(json.dumps(books_results, indent=2))
Enter fullscreen mode Exit fullscreen mode

Part of the JSON output:

[
  {
    "title": "The Virgin Way: How to Listen, Learn, Laugh and Lead",
    "link": "https://books.google.com/books?id=Jkp1AgAAQBAJ&printsec=frontcover&dq=richard+branson&hl=en&newbks=1&newbks_redir=1&sa=X&ved=2ahUKEwin3IrX-_n1AhXclmoFHbMHDfIQ6AF6BAgIEAI",
    "displayed_link": "books.google.com",
    "snippet": "This is not a conventional book on leadership. There are no rules \u2013 but rather the secrets of leadership that he has learned along the way from his days at Virgin Records, to his recent work with The Elders.",
    "author": "Sir Richard Branson",
    "author_link": "https://www.google.com/search/search?gl=us&hl=en&tbm=bks&tbm=bks&q=inauthor:%22Sir+Richard+Branson%22&sa=X&ved=2ahUKEwin3IrX-_n1AhXclmoFHbMHDfIQ9Ah6BAgIEAU",
    "date_published": "2014",
    "preview_link": "https://books.google.com/books?id=Jkp1AgAAQBAJ&printsec=frontcover&dq=richard+branson&hl=en&newbks=1&newbks_redir=1&sa=X&ved=2ahUKEwin3IrX-_n1AhXclmoFHbMHDfIQuwV6BAgIEAc",
    "more_editions_link": "https://www.google.com/books/edition/The_Virgin_Way/Jkp1AgAAQBAJ?hl=en&gl=us&kptab=editions&sa=X&ved=2ahUKEwin3IrX-_n1AhXclmoFHbMHDfIQmBZ6BAgIEAg",
    "thumbnail": "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"
  }, ... other results
]
Enter fullscreen mode Exit fullscreen mode

Outro

If you have anything to share, any questions, suggestions, or something that isn't working correctly, reach out via Twitter at @dimitryzub, or @serp_api.

Yours,
Dmitriy, and the rest of SerpApi Team.


Join us on Reddit | Twitter | YouTube

Add a Feature RequestπŸ’« or a Bug🐞

πŸ’– πŸ’ͺ πŸ™… 🚩
dmitryzub
Dmitriy Zub β˜€οΈ

Posted on March 16, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related