Source code for AutomateTheBoringStuff.Ch11.Projects.P2_imageDownloader

"""Image downloader

Write a program that goes to a photo-sharing site like Flickr or Imgur,
searches for a category of photos, and then downloads all the resulting images.
You could write a program that works with any photo site that has a search feature.

Note:
    Many photo-sharing sites do not want direct download links easily accessible.
    Therefore, it is likely this script will not work in the future.

"""


[docs]def main(): import requests, os, bs4 from selenium import webdriver, common # Open Browser to photo-sharing site url = "https://www.flickr.com/search/?text=" # starting url os.makedirs("images", exist_ok=True) # store images in ./images browser = webdriver.Firefox() browser.implicitly_wait(10) # seconds # Search for category of photos browser.get(url + "Cats") # Download all images try: imageElems = browser.find_elements_by_css_selector("a.overlay") for element in imageElems: downloadUrl = element.get_attribute("href") + "sizes/o/" res = requests.get(downloadUrl) res.raise_for_status() soup = bs4.BeautifulSoup(res.text, "lxml") imageElem = soup.select("img") # FIXME: Last few images are not of the category if not imageElem: print("Could not find image.") else: imageUrl = imageElem[2].get("src") # Save image to ./images res = requests.get(imageUrl) res.raise_for_status() imageFile = open(os.path.join("images", os.path.basename(imageUrl)), "wb") for chunk in res.iter_content(100000): imageFile.write(chunk) imageFile.close() except common.exceptions.NoSuchElementException as err: print("Unable to locate element: %s" % err) browser.close()
if __name__ == '__main__': main()