Почему urllib.urlopen.read() не соответствует исходному коду?
Я пытаюсь найти следующую веб-страницу:
import urllib
urllib.urlopen("http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1").read()
Результат не соответствует тому, что я вижу при проверке исходного кода веб-страницы с помощью Google Chrome, например.
Не могли бы вы рассказать мне, почему это происходит и как я могу улучшить свой код, чтобы решить эту проблему?
Благодарим вас за помощь.
Ответы
Ответ 1
То, что вы получаете от urlopen
, - это необработанная веб-страница, означающая, что javascript не выполняется. css не используется; где то, что вы получаете от Chrome (или других браузеров), является окончательной веб-страницей, которая включает исполняемый javascript (который может изменить HTML), рендеринг css и т.д., все из которых не происходит в urlopen
...
Отсюда разница, надеюсь, что это ясно.
Ответ 2
вы можете использовать python Selenium для решения вашей проблемы. Вот пример кода.
from selenium import webdriverr
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1"
browser = webdriver.Firefox()
browser.get(url)
sleep(10)
all_body_id_html = browser.find_element_by_id('body') # you can also get all html
Затем, благодаря вашей работе по вашему выбору
еще один пример с экземпляром браузера
def login(user='ssdf', password="cisin123"):
content = browser.find_element_by_id('content')
content.find_element_by_xpath('.//tbody/tr[2]//input[contains(@class,"textbox")]').send_keys(user)
content.find_element_by_xpath('.//tbody/tr[3]//input[contains(@class,"textbox")]').send_keys(password)
content.find_element_by_css_selector(".button").click()
Ответ 3
Вы можете использовать Selenium с Firefox для решения проблемы, но во многих случаях она может не подходить, поскольку браузер появляется каждый раз, когда вы запускаете код. Другая идея - использовать безголовый брейзер, такой как PhantomJS.
Лучший способ для этого - использовать библиотеку механизации. Установите механизацию по трубопроводу.
pip install mechanize
Затем вы можете использовать следующий код:
import mechanize
mb = mechanize.Browser()
mb.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
mb.set_handle_robots(False)
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1"
response = mb.open(url).read()
print response
Он также предоставляет возможность для сна и выполнения сценариев. Вы можете прочитать их в документации .
Ответ 4
Кроме того, на некоторых веб-сайтах есть так называемый переключатель браузера, который может привести к тому, что при использовании разных браузеров будет отображаться другой источник (например, показать легкую версию для мобильных браузеров).
Посмотрите http://www.diveintopython.net/http_web_services/user_agent.html на то, как изменить User-Agent на что-то вроде "Mozilla/5.0 (Windows NT 6.1; WOW64 ) AppleWebKit/537.1 (KHTML, как и Gecko) Chrome/21.0.1180.89 Safari/537.1" (который на самом деле является моим User-Agent).
Ответ 5
Похоже, вам нужна библиотека, которая может действовать как браузер и запускать javascript для вас, а затем дать вам исходный код. Ветряная мельница должна быть в состоянии сделать это за вас. (http://www.getwindmill.com/)
Есть хорошая статья о том, как использовать ее для чего вы хотите:
http://www.packtpub.com/article/web-scraping-with-python