Business & Legal 14 min read

Scraping for Journalists: Book Review

Scraping for Journalists reviewed in 2026: the shipping edition dates from June 2017, ScraperWiki Classic is defunct, morph.io and OpenRefine still work, and the Python half needs porting.

ST
Scraping.Pro Team
Data collection for business needs
Published: 6 September 2025

Scraper #1 in Paul Bradshaw's book gets a reporter a dataset in five minutes using a spreadsheet formula, and in August 2026 it still does. Scraper #12 opens with a section called The ScraperWiki Classic Archive, and that archive now answers with a single line: "https://classic.scraperwiki.com is now defunct". Same book, same purchase, a few chapters apart.

Measuring that gap is the whole job of reviewing this book now. Everything below was read from the book's Leanpub page, from the vendor pages and release histories of the tools it teaches, and from the author's own blog on 13 August 2026.

Start with what arrives when you pay. The listing reads "Scraping for Journalists (2nd edition)": 272 pages, 89,066 words, PDF and EPUB, minimum price $15.10, suggested price $20.01, 2,047 readers to date.

The edition question, which most reviews skip

Older write-ups, this review's own earlier version included, describe the book as a 2012 Leanpub title updated iteratively ever since. The first half of that is right and the second half needs a date attached.

The second edition went live on 19 June 2017. Bradshaw announced it on the Online Journalism Blog: "I decided to go through it from cover to cover and update everything", adding new scrapers for different websites and "a new chapter on scraping APIs and handling JSON". Anyone who had bought the first edition got the second one free. He signed off with a promise: "As always, I'll be continuing to update the book, including any examples from readers."

Nine years on, the page still reads 272 pages and 89,066 words, and the platforms named inside are the ones that existed in 2017. Leanpub's own sales pitch carries the catch in its last clause: you get free updates "for as long as the author updates the book". The author bio on the same page dates it further. It presents Bradshaw as a Visiting Professor at City University's School of Journalism in London, a post his own About page puts at 2010 to 2015, and it names the MA in Online Journalism rather than the data journalism teaching he does now.

The blog is a different story. Its most recent post when we checked was dated 10 August 2026, three days before this review. The author is working. The book is parked.

One number to know before you buy: 60 days. The Leanpub terms shown on the page state that a full refund takes two clicks inside that window, which is a better safety net than any review can offer.

Eighteen of the twenty-nine rungs are Python

The book is organised as twenty-nine numbered scrapers, each ending with a Recap and a set of Tests, wrapped in an introduction, a closing chapter and a glossary. The pitch is a gradient rather than a cliff, and the chapter titles are the honest map:

  • Scrapers #1 to #6 are spreadsheet and point-and-click work. Start scraping in 5 minutes. What happens when the data isn't in a table. Looking for structure in HTML. Then XPath, multiple pages with Google Drive, and structure in URLs using Open Refine. No code, and a real dataset at the end of each.
  • Scrapers #7 to #11 add a desktop tool and a habit. Three chapters on OutWit Hub, covering next links, badly formatted pages and regular expressions inside a visual scraper. Then the two chapters that have aged best in the entire book: scraping hidden and invisible data on a webpage. Reading what the server sent rather than what the browser painted is the skill that survived every tool change since.
  • Scraper #12 is the hinge. An introduction to Python: adapting scraper code.
  • Scrapers #13 to #29 are a Python course. Libraries and functions, loops, unique keys and databases, def and if, lists and indexes, form and cookie handling with Mechanize, four chapters on PDFs including one built entirely on regular expressions, CSV, four on Excel down to date handling, and finally JSON and APIs.

Count the rungs and eighteen of the twenty-nine are code. That is the fact a buyer most needs and the one every summary of this book, including ours, has blurred. It is not a spreadsheet book with a coda about programming. It is a Python primer with a gentle six-chapter approach, and the gentleness is the pedagogy rather than the destination.

The teaching itself holds up. Scraping tip #2 is to read code from right to left. Tip #4 is to follow the functions, tip #5 to read from bottom to top, and one chapter offers a checklist for understanding someone else's code. Nothing about that expires.

What we checked, and what still runs

Every tool named in the book got looked up on its own site on 13 August 2026.

Google Sheets. IMPORTXML and IMPORTHTML are documented, supported and unchanged in shape: a URL, an XPath query, and a table in your sheet. Chapters #1 to #5 run today with no edits beyond the fact that Google Drive spreadsheets have been called Google Sheets for a decade.

OpenRefine. The tool the book calls Google Refine has been OpenRefine since Google handed it over, and the current release is 3.10.1, published 4 March 2025. The feature chapter #6 depends on is still in the manual: Add column by fetching URLs, with a default throttle of "5 seconds per row in your dataset (5000 milliseconds)", a store error option, and settable User-Agent, Accept and Authorization headers. Seventeen months without a release is a slow project, not a dead one.

OutWit Hub. Alive and commercial. OutWit states that "OutWit Hub v9.0, the old faithful, is still available on Windows and Linux", alongside a rewritten OutWit Rover v1.0 for Windows, Linux and macOS on both Intel and ARM. Light editions remain free and, in the vendor's words, "limited but will allow you to do basic extractions". Paid tiers as advertised on 13 August 2026: Pro from €69, Expert €275, Enterprise from €590. Prices are in euros, and there is no free full version, which older reviews of this book tend to imply.

morph.io. The hosted platform chapter #12 sends you to is running, maintained by the OpenAustralia Foundation, and the counters on its front page were still moving when we looked. Its documentation covers Ruby, PHP, Python, Perl and Node.js, and every scraper writes to a SQLite file called data.sqlite via scraperwiki.sql.save.

The scraperwiki library. The Python package the book's listings import is on PyPI, and its history is the single strangest thing we found. Version 0.5.1 shipped on 7 July 2015. The next release, 1.0.0, arrived on 12 January 2026, ten and a half years later, declaring support for Python 3.10 through 3.14. Its description is blunt: "Warning: This library is now in maintenance mode. The library has been updated to work with Python 3.14 but there are no guarantees on future maintenance." Mechanize, used in chapter #20, is in similar shape: version 0.4.10 from 26 April 2024, still shipping a wheel that covers both Python 2 and 3.

What actually died, and what only changed its name

"ScraperWiki is gone" is the line every roundup uses, including ours. It is close enough to be repeated and wrong enough to mislead.

Here is the chain. scraperwiki.com still resolves, and what it serves is a rebranding notice: the product became QuickCode and the company became The Sensible Code Company. Follow QuickCode today and sensiblecode.io redirects to Cantabular, whose about page states that Cantabular Ltd is the new name of The Sensible Code Company Ltd. It now sells privacy-protected publishing tools for census and statistical agencies. The company outlived its scraper by two renamings.

What died is the specific thing the book needs. classic.scraperwiki.com answers "is now defunct" and bounces you to the parent domain. Chapter #12 asks you to browse that archive, find a scraper to clone and fork it, and that path is closed. The same chapter offers two hosts for the code you adapt, morph.io and QuickCode. One survived. Chapters #13 and #15 teach you to read ScraperWiki's own tutorial scrapers and to understand why scraperwiki.datastore throws an error, which is archaeology performed on an archive you can no longer open.

Two more deaths sit outside the book's control. The era of point-and-click browser extensions that it draws on ended when Chrome finished switching off Manifest V2: by Google's own deprecation timeline, "Manifest V2 is disabled everywhere" as of July 2025, and the last MV2 items leave the Chrome Web Store this year. Firefox got there earlier, dropping legacy add-ons with version 57 in November 2017, which is why OutWit ships desktop applications instead of the add-on the book's screenshots show.

The boundary of what we can verify. The listings inside the book are behind the paywall, so whether they are Python 2 or Python 3 is not knowable from the sales page. The surrounding evidence points one way. The book's Python chapters grew out of ScraperWiki Classic, a Python 2 platform, and its section titles walk through a Unicode error and a UnicodeDecodeError in the way Python 2 code does. Budget for a port, and be pleased if you do not need one.

Where the ladder stops

The book's gentle techniques still work on plenty of pages. They stop at three walls, and none of the three existed in their current form in 2017.

JavaScript. IMPORTXML fetches a page from Google's servers and parses the HTML that came back. It does not run scripts, so a table assembled in the browser is invisible to it, and the cell fills with an error you cannot debug from inside a spreadsheet. That is the moment the book cannot help and dynamic content techniques take over. The two chapters on hidden and invisible data are the bridge: often the values are sitting in a JSON blob inside a script tag, and a beginner who learned to read source can still get them.

Bot defenses that now default to closed. On 1 July 2025 Cloudflare announced it was changing the default "to block AI crawlers unless they pay creators for their content", with a pay-per-crawl marketplace alongside it. The specific target is AI training, and the practical effect is broader: a growing share of the web now treats an unfamiliar automated client as something to challenge rather than serve. A spreadsheet formula has nowhere to put a CAPTCHA. Site owners have been reaching for the same defenses at small scale too, as anyone who has met an anti-scraping plugin on a council website knows.

Logins and rate limits. Chapter #20 handles forms and cookies with Mechanize, which covers a 2017 database search. It does not cover a session behind a modern login, a token that rotates, or an API that used to be free and is not. Twitter closed free API access in February 2023 and Reddit followed in June 2023, and between them they removed the two datasets that a decade of journalism-school scraping exercises were built on.

The book names this limit itself. The closing chapter is called "The map is not the territory".

What breaks when a story needs 10,000 pages

The book teaches a scraper you run, watch and use. A newsroom project that runs unattended is a different animal, and the difference shows up in arithmetic before it shows up in code.

Take OpenRefine's documented default of 5,000 milliseconds between rows. Ten thousand URLs at that rate is close to 14 hours. Drop to the 1,000 milliseconds the manual recommends as a floor and it is 2 hours 46 minutes, which fits inside an evening but not inside a deadline you discover at 4pm. Now add the parts the book leaves out because they are out of scope: retries for the pages that time out, deduplication when a paginated list shifts under you mid-crawl, a place to put the data that is not a spreadsheet with 40,000 rows, and a record of when each row was fetched.

That last one is journalism-specific. A scrape is evidence. If a story says a council raised charges at 43 of its 61 car parks, someone will ask when the pages were read and what they said, and a folder of dated raw HTML is the difference between answering that in ten minutes and issuing a correction. Provenance is cheap while you scrape and impossible to reconstruct afterwards.

The failure that costs most is quiet. A selector that matches on 9,900 pages and silently returns nothing on the other 100 produces a table that looks complete, and the missing rows are usually the unusual ones, which in a newsroom means the story. Count what you expected to get and compare it to what you got, every run.

None of this is a criticism of the book. It is the line where a reporting technique becomes an engineering problem: a standing feed that has to be right every morning is a different product from a one-off story, and that is where a data-as-a-service pipeline or an outsourced extraction stack takes over from a laptop and a book.

The law moved after the book was printed

A 2017 primer cannot warn you about rulings that came later, and journalists inherit the consequences directly.

hiQ v. LinkedIn is not the green light it is quoted as. The Ninth Circuit's 2022 decision held that scraping public pages is unlikely to be unauthorized access under the US Computer Fraud and Abuse Act, and that is the sentence everyone repeats. The case did not end there. A district court then found hiQ had breached LinkedIn's user agreement, and the parties settled in December 2022 with a $500,000 judgment against hiQ and a permanent injunction. Public does not mean unconditional, and terms of service can bind you where criminal law does not.

Data protection applies to public data. UK and EU reporters scraping names, addresses or anything else identifying are processing personal data whatever the source, and the Data Protection Act 2018 gives journalism a broad exemption for the special purposes rather than a blanket pass. It has to be claimed, and it applies to publication in the public interest, not to a hard drive of scraped records kept indefinitely because it might be useful.

Access controls change the question. Reading a page a server hands you is not the same act as getting past a login you were not given, which in the UK is where the Computer Misuse Act 1990 begins. robots.txt is not law either, and after two years of AI-crawler disputes it is read as a clear statement of intent, which is exactly what gets quoted back at you.

Our reading list of web scraping books goes further into how fast the law outruns a print run, and it will not be repeated here.

What to pair it with in 2026

The Data Journalism Handbook remains the natural companion, and the first edition covers the ground Bradshaw deliberately does not: what to do with the data once you have it. It was launched at MozFest in 2011 by the European Journalism Centre and the Open Knowledge Foundation, went to print with O'Reilly, and is still free to read. The fully rewritten second Handbook, subtitled "Towards a Critical Data Practice" and produced with the Google News Initiative, is free as well, in English, Portuguese, Greek and Japanese.

For the four PDF chapters, add current tools. Tabula is still the fastest way to pull a table out of a text-based PDF, and still stuck at version 1.2.1 from June 2018, which is fine for a stable job and worth knowing before you file a bug. It cannot read scans. When Tabula gives up, pdfplumber is the maintained option, at 0.11.10 as of 15 June 2026, with character-level coordinates for tables no visual tool can find.

For anything you want to watch over time, look up git scraping: commit a scraped file to a repository on a schedule and let the commit history become your record of what changed. The GitHub topic carries 462 public repositories, and the pattern answers the provenance problem above with almost no infrastructure. Bradshaw's own Finding Stories in Spreadsheets, also on Leanpub, is the better next purchase for most reporters, because the analysis after the scrape is where the stories are.

Who should read it in 2026

Reporters and researchers who have never scraped anything are the audience this book was written for, and it still serves them better than any free tutorial chain. You get a usable dataset in chapter one, and the ladder is built so that the next step is always small. Buy it, work chapters #1 to #11 with the tool names updated as you go, and stop when it stops being fun.

Anyone who wants to learn Python through scraping should know they are buying an eighteen-chapter course written against a platform that no longer exists, and should read it on morph.io with the current library.

Students on journalism courses get the vocabulary cheaply, which matters most at the moment a developer asks what you actually need.

Skip it if you scrape for a living, or if the job is scheduled extraction at volume. Neither is what the book set out to do.

Verdict

The philosophy has not dated. Data journalism is still mostly the problem of getting a table out of somebody's website, and the idea that a reporter can climb that in small steps was right in 2012, right in 2017, and right now. What has dated is a specific, checkable list: one archive that says defunct, one platform renamed twice into a census-tools company, one browser extension model switched off in July 2025, and a Python library that sat still for ten and a half years before waking up in January 2026.

At $15.10 that trade is easy. You are buying a method, an on-ramp and 89,066 words of patient explanation, not a working toolchain. Read the first eleven scrapers as written. Port the rest.