Соскоб 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
ссылка вполне может вытащить что хочешь.
Для реализации:
- Вам нужно будет использовать
urllib2
(или жеrequests
) выполнить поиск через вызов Google API, используяurllib2.urlopen(url)
или жеrequests.get(url)
, ЗаменитьBarack%20Obama
с URL экранированной поисковой строкой, напримерBill%20Clinton
, - Разбор JSON с использованием Python
json
модуль для извлечения строки, которая дает вамhttp://www.biography.com/people
ссылка на сайт. Из этого извлеките часть этой ссылки интереса (какbarack-obama-12782369
выше). - использование
urllib2
или жеrequests
сделатьsaymedia-content
Замена запроса APIbarack-obama-12782369
после@by-slug/
с тем, что вы извлекаете из 2; то есть делать другоеurllib2.urlopen
по этому URL. - Извлеките JSON из ответа на этот второй запрос, чтобы извлечь нужный контент.
(Предостережение: при условии, что в этих двух вызовах API нет строк, основанных на сеансах, срок действия которых может истечь.)
Кроме того, вы можете использовать Selenium для посещения веб-сайта, поиска и извлечения содержимого.
Скорее всего, вам придется вручную копировать и вставлять, так как biography.com полностью основан на javascript-сайте, поэтому его нельзя отсканировать традиционными методами.
Вы можете найти URL-адрес API с помощью httpfox (аддон Firefox). Например, http://www.biography.com/.api/item/search?config=published&query=marx приносит вам json, который вы можете обработать в поиске / people / для получения ссылок на биографию. Или вы можете использовать сканер экрана, как селен