Соскоб Biography.com с использованием urllib2

Так что раньше я просматривал сайты, но на этот раз я в тупике. Я пытаюсь найти человека на Biography.com и получить его / ее биографию. Но всякий раз, когда я ищу сайт, используя urllib2 и запросить URL: http://www.biography.com/search/ Я получаю пустую страницу без данных в ней.

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

Я попытался изменить пользовательский агент, добавить рефереры, использовать куки в Python, но безрезультатно. Если бы кто-то мог помочь мне с этой задачей, это было бы очень полезно.

Я планирую использовать этот текст для моего проекта НЛП, и в худшем случае мне придется вручную скопировать и вставить текст. Но я надеюсь, что это не доходит до этого.

3 ответа

Решение

Chrome/Chromium Developer Tools (или Firebug) определенно ваш друг здесь. Я вижу, что первоначальный поиск на сайте биографии осуществляется с помощью вызова API Google, например,

https://www.googleapis.com/customsearch/v1?q=Barack%20Obama&key=AIzaSyCMGfdDaSfjqv5zYoS0mTJnOT3e9MURWkU&cx=011223861749738482324%3Aijiqp2ioyxw&num=8&callback=angular.callbacks._0

Я использовал поисковый термин в q= часть строки запроса: q=Barack%20Obama,

Это возвращает JSON, внутри которого есть ключ link со значением URL интересующей статьи.

"link": "http://www.biography.com/people/barack-obama-12782369"

Посещение этой страницы показывает мне, что это генерируется запросом к:

http://api.saymedia-content.com/:apiproxy-anon/content-sites/cs01a33b78d5c5860e/content-customs/@published/@by-custom-type/ContentPerson/@by-slug/barack-obama-12782369

который возвращает JSON, содержащий HTML.

Итак, заменив последнюю часть ссылки barack-obama-12782369 с соответствующей информацией для заинтересованного лица в saymedia-content ссылка вполне может вытащить что хочешь.

Для реализации:

  1. Вам нужно будет использовать urllib2 (или же requests) выполнить поиск через вызов Google API, используя urllib2.urlopen(url) или же requests.get(url), Заменить Barack%20Obama с URL экранированной поисковой строкой, например Bill%20Clinton,
  2. Разбор JSON с использованием Python json модуль для извлечения строки, которая дает вам http://www.biography.com/people ссылка на сайт. Из этого извлеките часть этой ссылки интереса (как barack-obama-12782369 выше).
  3. использование urllib2 или же requests сделать saymedia-content Замена запроса API barack-obama-12782369 после @by-slug/ с тем, что вы извлекаете из 2; то есть делать другое urllib2.urlopen по этому URL.
  4. Извлеките JSON из ответа на этот второй запрос, чтобы извлечь нужный контент.

(Предостережение: при условии, что в этих двух вызовах API нет строк, основанных на сеансах, срок действия которых может истечь.)

Кроме того, вы можете использовать Selenium для посещения веб-сайта, поиска и извлечения содержимого.

Скорее всего, вам придется вручную копировать и вставлять, так как biography.com полностью основан на javascript-сайте, поэтому его нельзя отсканировать традиционными методами.

Вы можете найти URL-адрес API с помощью httpfox (аддон Firefox). Например, http://www.biography.com/.api/item/search?config=published&query=marx приносит вам json, который вы можете обработать в поиске / people / для получения ссылок на биографию. Или вы можете использовать сканер экрана, как селен

Другие вопросы по тегам